From f737c538643e26c485e8b37865695f96de410f1c Mon Sep 17 00:00:00 2001 From: Indradhanush Gupta Date: Sat, 14 Sep 2019 16:23:09 +0530 Subject: [PATCH] Update go.mod, go.sum and vendor Running `go mod vendor` generates new additions and deletions. --- go.mod | 1 + go.sum | 8 + .../go/compute/metadata/metadata.go | 13 + vendor/github.com/Azure/go-autorest/LICENSE | 191 + .../Azure/go-autorest/autorest/adal/README.md | 292 + .../Azure/go-autorest/autorest/adal/config.go | 91 + .../go-autorest/autorest/adal/devicetoken.go | 242 + .../go-autorest/autorest/adal/persist.go | 73 + .../Azure/go-autorest/autorest/adal/sender.go | 60 + .../Azure/go-autorest/autorest/adal/token.go | 980 + .../go-autorest/autorest/authorization.go | 259 + .../Azure/go-autorest/autorest/autorest.go | 150 + .../Azure/go-autorest/autorest/azure/async.go | 972 + .../Azure/go-autorest/autorest/azure/azure.go | 326 + .../autorest/azure/environments.go | 191 + .../autorest/azure/metadata_environment.go | 245 + .../Azure/go-autorest/autorest/azure/rp.go | 200 + .../Azure/go-autorest/autorest/client.go | 268 + .../Azure/go-autorest/autorest/date/date.go | 96 + .../Azure/go-autorest/autorest/date/time.go | 103 + .../go-autorest/autorest/date/timerfc1123.go | 100 + .../go-autorest/autorest/date/unixtime.go | 123 + .../go-autorest/autorest/date/utility.go | 25 + .../Azure/go-autorest/autorest/error.go | 98 + .../Azure/go-autorest/autorest/preparer.go | 480 + .../Azure/go-autorest/autorest/responder.go | 250 + .../go-autorest/autorest/retriablerequest.go | 52 + .../autorest/retriablerequest_1.7.go | 54 + .../autorest/retriablerequest_1.8.go | 66 + .../Azure/go-autorest/autorest/sender.go | 325 + .../Azure/go-autorest/autorest/utility.go | 228 + .../Azure/go-autorest/autorest/version.go | 22 + .../Azure/go-autorest/logger/logger.go | 328 + .../Azure/go-autorest/version/version.go | 37 + .../github.com/Microsoft/go-winio/.gitignore | 1 + vendor/github.com/Microsoft/go-winio/LICENSE | 22 + .../github.com/Microsoft/go-winio/README.md | 22 + .../github.com/Microsoft/go-winio/backup.go | 280 + vendor/github.com/Microsoft/go-winio/ea.go | 137 + vendor/github.com/Microsoft/go-winio/file.go | 323 + .../github.com/Microsoft/go-winio/fileinfo.go | 61 + vendor/github.com/Microsoft/go-winio/go.mod | 9 + vendor/github.com/Microsoft/go-winio/go.sum | 16 + .../github.com/Microsoft/go-winio/hvsock.go | 305 + vendor/github.com/Microsoft/go-winio/pipe.go | 510 + .../Microsoft/go-winio/pkg/guid/guid.go | 235 + .../Microsoft/go-winio/privilege.go | 202 + .../github.com/Microsoft/go-winio/reparse.go | 128 + vendor/github.com/Microsoft/go-winio/sd.go | 98 + .../github.com/Microsoft/go-winio/syscall.go | 3 + .../Microsoft/go-winio/zsyscall_windows.go | 562 + vendor/github.com/darkSasori/todoist/go.mod | 8 - .../github.com/darkSasori/todoist/todoist.go | 2 +- vendor/github.com/dgrijalva/jwt-go/.gitignore | 4 + .../github.com/dgrijalva/jwt-go/.travis.yml | 13 + vendor/github.com/dgrijalva/jwt-go/LICENSE | 8 + .../dgrijalva/jwt-go/MIGRATION_GUIDE.md | 97 + vendor/github.com/dgrijalva/jwt-go/README.md | 100 + .../dgrijalva/jwt-go/VERSION_HISTORY.md | 118 + vendor/github.com/dgrijalva/jwt-go/claims.go | 134 + vendor/github.com/dgrijalva/jwt-go/doc.go | 4 + vendor/github.com/dgrijalva/jwt-go/ecdsa.go | 148 + .../dgrijalva/jwt-go/ecdsa_utils.go | 67 + vendor/github.com/dgrijalva/jwt-go/errors.go | 59 + vendor/github.com/dgrijalva/jwt-go/hmac.go | 95 + .../github.com/dgrijalva/jwt-go/map_claims.go | 94 + vendor/github.com/dgrijalva/jwt-go/none.go | 52 + vendor/github.com/dgrijalva/jwt-go/parser.go | 148 + vendor/github.com/dgrijalva/jwt-go/rsa.go | 101 + vendor/github.com/dgrijalva/jwt-go/rsa_pss.go | 126 + .../github.com/dgrijalva/jwt-go/rsa_utils.go | 101 + .../dgrijalva/jwt-go/signing_method.go | 35 + vendor/github.com/dgrijalva/jwt-go/token.go | 108 + vendor/github.com/docker/distribution/LICENSE | 202 + .../docker/distribution/digestset/set.go | 247 + .../docker/distribution/reference/helpers.go | 42 + .../distribution/reference/normalize.go | 170 + .../distribution/reference/reference.go | 433 + .../docker/distribution/reference/regexp.go | 143 + vendor/github.com/docker/docker/AUTHORS | 1652 ++ vendor/github.com/docker/docker/LICENSE | 191 + vendor/github.com/docker/docker/NOTICE | 19 + .../docker/docker/api/types/auth.go | 22 + .../docker/docker/api/types/blkiodev/blkio.go | 23 + .../docker/docker/api/types/client.go | 378 + .../docker/docker/api/types/configs.go | 69 + .../docker/api/types/container/config.go | 62 + .../api/types/container/container_create.go | 21 + .../api/types/container/container_update.go | 17 + .../api/types/container/container_wait.go | 17 + .../docker/api/types/container/host_config.go | 333 + .../api/types/container/hostconfig_unix.go | 81 + .../api/types/container/hostconfig_windows.go | 87 + .../docker/docker/api/types/error_response.go | 13 + .../docker/docker/api/types/events/events.go | 42 + .../docker/docker/api/types/filters/parse.go | 310 + .../docker/docker/api/types/id_response.go | 13 + .../docker/docker/api/types/image_summary.go | 49 + .../docker/docker/api/types/mount/mount.go | 113 + .../docker/api/types/network/network.go | 59 + .../docker/docker/api/types/plugin.go | 189 + .../docker/docker/api/types/plugin_device.go | 25 + .../docker/docker/api/types/plugin_env.go | 25 + .../docker/api/types/plugin_interface_type.go | 21 + .../docker/docker/api/types/plugin_mount.go | 37 + .../docker/api/types/plugin_responses.go | 64 + .../docker/docker/api/types/port.go | 23 + .../api/types/reference/image_reference.go | 34 + .../docker/api/types/registry/authenticate.go | 21 + .../docker/api/types/registry/registry.go | 104 + .../docker/docker/api/types/seccomp.go | 93 + .../api/types/service_update_response.go | 12 + .../docker/docker/api/types/stats.go | 178 + .../docker/api/types/strslice/strslice.go | 30 + .../docker/docker/api/types/swarm/common.go | 27 + .../docker/api/types/swarm/container.go | 46 + .../docker/docker/api/types/swarm/network.go | 111 + .../docker/docker/api/types/swarm/node.go | 114 + .../docker/docker/api/types/swarm/secret.go | 31 + .../docker/docker/api/types/swarm/service.go | 105 + .../docker/docker/api/types/swarm/swarm.go | 197 + .../docker/docker/api/types/swarm/task.go | 128 + .../docker/api/types/time/duration_convert.go | 12 + .../docker/docker/api/types/time/timestamp.go | 124 + .../docker/docker/api/types/types.go | 549 + .../docker/api/types/versions/README.md | 14 + .../docker/api/types/versions/compare.go | 62 + .../docker/docker/api/types/volume.go | 58 + .../docker/api/types/volume/volumes_create.go | 29 + .../docker/api/types/volume/volumes_list.go | 23 + .../github.com/docker/docker/client/README.md | 35 + .../docker/docker/client/checkpoint_create.go | 13 + .../docker/docker/client/checkpoint_delete.go | 20 + .../docker/docker/client/checkpoint_list.go | 28 + .../github.com/docker/docker/client/client.go | 246 + .../docker/docker/client/client_unix.go | 6 + .../docker/docker/client/client_windows.go | 4 + .../docker/docker/client/container_attach.go | 37 + .../docker/docker/client/container_commit.go | 53 + .../docker/docker/client/container_copy.go | 97 + .../docker/docker/client/container_create.go | 50 + .../docker/docker/client/container_diff.go | 23 + .../docker/docker/client/container_exec.go | 54 + .../docker/docker/client/container_export.go | 20 + .../docker/docker/client/container_inspect.go | 54 + .../docker/docker/client/container_kill.go | 17 + .../docker/docker/client/container_list.go | 56 + .../docker/docker/client/container_logs.go | 52 + .../docker/docker/client/container_pause.go | 10 + .../docker/docker/client/container_prune.go | 36 + .../docker/docker/client/container_remove.go | 27 + .../docker/docker/client/container_rename.go | 16 + .../docker/docker/client/container_resize.go | 29 + .../docker/docker/client/container_restart.go | 22 + .../docker/docker/client/container_start.go | 24 + .../docker/docker/client/container_stats.go | 26 + .../docker/docker/client/container_stop.go | 21 + .../docker/docker/client/container_top.go | 28 + .../docker/docker/client/container_unpause.go | 10 + .../docker/docker/client/container_update.go | 22 + .../docker/docker/client/container_wait.go | 26 + .../docker/docker/client/disk_usage.go | 26 + .../github.com/docker/docker/client/errors.go | 278 + .../github.com/docker/docker/client/events.go | 102 + .../github.com/docker/docker/client/hijack.go | 177 + .../docker/docker/client/image_build.go | 123 + .../docker/docker/client/image_create.go | 34 + .../docker/docker/client/image_history.go | 22 + .../docker/docker/client/image_import.go | 37 + .../docker/docker/client/image_inspect.go | 33 + .../docker/docker/client/image_list.go | 45 + .../docker/docker/client/image_load.go | 30 + .../docker/docker/client/image_prune.go | 36 + .../docker/docker/client/image_pull.go | 46 + .../docker/docker/client/image_push.go | 54 + .../docker/docker/client/image_remove.go | 31 + .../docker/docker/client/image_save.go | 22 + .../docker/docker/client/image_search.go | 51 + .../docker/docker/client/image_tag.go | 34 + .../github.com/docker/docker/client/info.go | 26 + .../docker/docker/client/interface.go | 171 + .../docker/client/interface_experimental.go | 17 + .../docker/docker/client/interface_stable.go | 10 + .../github.com/docker/docker/client/login.go | 29 + .../docker/docker/client/network_connect.go | 18 + .../docker/docker/client/network_create.go | 25 + .../docker/client/network_disconnect.go | 14 + .../docker/docker/client/network_inspect.go | 38 + .../docker/docker/client/network_list.go | 31 + .../docker/docker/client/network_prune.go | 36 + .../docker/docker/client/network_remove.go | 10 + .../docker/docker/client/node_inspect.go | 33 + .../docker/docker/client/node_list.go | 36 + .../docker/docker/client/node_remove.go | 21 + .../docker/docker/client/node_update.go | 18 + .../github.com/docker/docker/client/ping.go | 30 + .../docker/docker/client/plugin_create.go | 26 + .../docker/docker/client/plugin_disable.go | 19 + .../docker/docker/client/plugin_enable.go | 19 + .../docker/docker/client/plugin_inspect.go | 32 + .../docker/docker/client/plugin_install.go | 113 + .../docker/docker/client/plugin_list.go | 21 + .../docker/docker/client/plugin_push.go | 17 + .../docker/docker/client/plugin_remove.go | 20 + .../docker/docker/client/plugin_set.go | 12 + .../docker/docker/client/plugin_upgrade.go | 37 + .../docker/docker/client/request.go | 247 + .../docker/docker/client/secret_create.go | 24 + .../docker/docker/client/secret_inspect.go | 34 + .../docker/docker/client/secret_list.go | 35 + .../docker/docker/client/secret_remove.go | 10 + .../docker/docker/client/secret_update.go | 19 + .../docker/docker/client/service_create.go | 30 + .../docker/docker/client/service_inspect.go | 33 + .../docker/docker/client/service_list.go | 35 + .../docker/docker/client/service_logs.go | 52 + .../docker/docker/client/service_remove.go | 10 + .../docker/docker/client/service_update.go | 41 + .../docker/client/swarm_get_unlock_key.go | 21 + .../docker/docker/client/swarm_init.go | 21 + .../docker/docker/client/swarm_inspect.go | 21 + .../docker/docker/client/swarm_join.go | 13 + .../docker/docker/client/swarm_leave.go | 18 + .../docker/docker/client/swarm_unlock.go | 17 + .../docker/docker/client/swarm_update.go | 22 + .../docker/docker/client/task_inspect.go | 34 + .../docker/docker/client/task_list.go | 35 + .../docker/docker/client/transport.go | 28 + .../github.com/docker/docker/client/utils.go | 33 + .../docker/docker/client/version.go | 21 + .../docker/docker/client/volume_create.go | 21 + .../docker/docker/client/volume_inspect.go | 38 + .../docker/docker/client/volume_list.go | 32 + .../docker/docker/client/volume_prune.go | 36 + .../docker/docker/client/volume_remove.go | 21 + .../docker/pkg/tlsconfig/tlsconfig_clone.go | 11 + .../pkg/tlsconfig/tlsconfig_clone_go16.go | 31 + .../pkg/tlsconfig/tlsconfig_clone_go17.go | 33 + .../github.com/docker/go-connections/LICENSE | 191 + .../docker/go-connections/nat/nat.go | 242 + .../docker/go-connections/nat/parse.go | 57 + .../docker/go-connections/nat/sort.go | 96 + .../docker/go-connections/sockets/README.md | 0 .../go-connections/sockets/inmem_socket.go | 81 + .../docker/go-connections/sockets/proxy.go | 51 + .../docker/go-connections/sockets/sockets.go | 38 + .../go-connections/sockets/sockets_unix.go | 35 + .../go-connections/sockets/sockets_windows.go | 27 + .../go-connections/sockets/tcp_socket.go | 22 + .../go-connections/sockets/unix_socket.go | 32 + .../go-connections/tlsconfig/certpool_go17.go | 18 + .../tlsconfig/certpool_other.go | 13 + .../docker/go-connections/tlsconfig/config.go | 254 + .../tlsconfig/config_client_ciphers.go | 17 + .../tlsconfig/config_legacy_client_ciphers.go | 15 + .../docker/go-units/CONTRIBUTING.md | 67 + vendor/github.com/docker/go-units/LICENSE | 191 + vendor/github.com/docker/go-units/MAINTAINERS | 46 + vendor/github.com/docker/go-units/README.md | 16 + vendor/github.com/docker/go-units/circle.yml | 11 + vendor/github.com/docker/go-units/duration.go | 35 + vendor/github.com/docker/go-units/size.go | 108 + vendor/github.com/docker/go-units/ulimit.go | 123 + vendor/github.com/gdamore/tcell/database.json | 1351 -- .../{term_adm3a.go => a/adm3a/term.go} | 7 +- .../{term_aixterm.go => a/aixterm/term.go} | 9 +- .../terminfo/{term_ansi.go => a/ansi/term.go} | 7 +- .../{term_aterm.go => a/aterm/term.go} | 9 +- .../{term_beterm.go => b/beterm/term.go} | 7 +- .../{term_bsdos_pc.go => b/bsdos_pc/term.go} | 7 +- .../gdamore/tcell/terminfo/base/base.go | 32 + .../{term_cygwin.go => c/cygwin/term.go} | 7 +- .../terminfo/{term_d200.go => d/d200/term.go} | 7 +- .../terminfo/{term_d210.go => d/d210/term.go} | 7 +- .../{term_dtterm.go => d/dtterm/term.go} | 7 +- .../gdamore/tcell/terminfo/e/emacs/term.go | 60 + .../gdamore/tcell/terminfo/e/eterm/term.go | 309 + .../tcell/terminfo/extended/extended.go | 67 + .../gnome/term.go} | 160 +- .../github.com/gdamore/tcell/terminfo/gen.sh | 18 + .../{term_hpterm.go => h/hpterm/term.go} | 9 +- .../{term_hz1500.go => h/hz1500/term.go} | 7 +- .../gdamore/tcell/terminfo/k/konsole/term.go | 304 + .../{term_kterm.go => k/kterm/term.go} | 9 +- .../{term_linux.go => l/linux/term.go} | 11 +- .../gdamore/tcell/terminfo/mkinfo.go | 888 - .../gdamore/tcell/terminfo/models.txt | 36 +- .../{term_pcansi.go => p/pcansi/term.go} | 7 +- .../gdamore/tcell/terminfo/r/rxvt/term.go | 466 + .../screen/term.go} | 68 +- .../tcell/terminfo/s/simpleterm/term.go | 308 + .../{term_sun_color.go => s/sun/term.go} | 48 +- .../{term_termite.go => t/termite/term.go} | 10 +- .../{term_tvi910.go => t/tvi910/term.go} | 7 +- .../{term_tvi912.go => t/tvi912/term.go} | 7 +- .../{term_tvi921.go => t/tvi921/term.go} | 7 +- .../{term_tvi925.go => t/tvi925/term.go} | 7 +- .../{term_tvi950.go => t/tvi950/term.go} | 7 +- .../{term_tvi970.go => t/tvi970/term.go} | 7 +- .../gdamore/tcell/terminfo/term_gnome.go | 154 - .../gdamore/tcell/terminfo/term_konsole.go | 112 - .../tcell/terminfo/term_konsole_256color.go | 112 - .../gdamore/tcell/terminfo/term_rxvt.go | 107 - .../tcell/terminfo/term_rxvt_256color.go | 107 - .../tcell/terminfo/term_rxvt_unicode.go | 81 - .../terminfo/term_rxvt_unicode_256color.go | 81 - .../gdamore/tcell/terminfo/term_screen.go | 64 - .../gdamore/tcell/terminfo/term_st.go | 156 - .../tcell/terminfo/term_st_256color.go | 156 - .../gdamore/tcell/terminfo/term_st_meta.go | 155 - .../tcell/terminfo/term_st_meta_256color.go | 155 - .../gdamore/tcell/terminfo/term_sun.go | 44 - .../gdamore/tcell/terminfo/term_wy99_ansi.go | 58 - .../gdamore/tcell/terminfo/term_wy99a_ansi.go | 58 - .../gdamore/tcell/terminfo/term_xterm.go | 154 - .../tcell/terminfo/term_xterm_256color.go | 153 - .../gdamore/tcell/terminfo/terminfo.go | 484 +- .../{term_vt100.go => v/vt100/term.go} | 7 +- .../{term_vt102.go => v/vt102/term.go} | 7 +- .../{term_vt220.go => v/vt220/term.go} | 7 +- .../{term_vt320.go => v/vt320/term.go} | 9 +- .../{term_vt400.go => v/vt400/term.go} | 7 +- .../{term_vt420.go => v/vt420/term.go} | 7 +- .../terminfo/{term_vt52.go => v/vt52/term.go} | 7 +- .../terminfo/{term_wy50.go => w/wy50/term.go} | 7 +- .../terminfo/{term_wy60.go => w/wy60/term.go} | 7 +- .../tcell/terminfo/w/wy99_ansi/term.go | 114 + .../terminfo/{term_xfce.go => x/xfce/term.go} | 9 +- .../{term_xnuppc.go => x/xnuppc/term.go} | 9 +- .../gdamore/tcell/terminfo/x/xterm/term.go | 453 + vendor/github.com/gdamore/tcell/tscreen.go | 8 +- .../github.com/gdamore/tcell/tscreen_bsd.go | 5 +- .../gdamore/tcell/tscreen_darwin.go | 5 +- .../github.com/gdamore/tcell/tscreen_linux.go | 87 +- .../gdamore/tcell/tscreen_solaris.go | 73 +- vendor/github.com/gogo/protobuf/proto/lib.go | 18 +- .../gogo/protobuf/proto/properties.go | 66 +- .../gogo/protobuf/proto/table_marshal.go | 13 +- .../gogo/protobuf/proto/table_merge.go | 19 + .../gogo/protobuf/proto/table_unmarshal.go | 22 +- vendor/github.com/golang/groupcache/LICENSE | 191 + .../github.com/golang/groupcache/lru/lru.go | 133 + .../golang/protobuf/proto/properties.go | 5 +- .../go-github/v26/github/gen-accessors.go | 333 - .../v26/github/gen-stringify-test.go | 358 - .../github.com/googleapis/gax-go/v2/LICENSE | 27 + .../googleapis/gax-go/v2/call_option.go | 161 + vendor/github.com/googleapis/gax-go/v2/gax.go | 39 + vendor/github.com/googleapis/gax-go/v2/go.mod | 3 + vendor/github.com/googleapis/gax-go/v2/go.sum | 25 + .../github.com/googleapis/gax-go/v2/header.go | 53 + .../github.com/googleapis/gax-go/v2/invoke.go | 99 + .../gophercloud/gophercloud/.gitignore | 3 + .../gophercloud/gophercloud/.travis.yml | 21 + .../gophercloud/gophercloud/.zuul.yaml | 98 + .../gophercloud/gophercloud/CHANGELOG.md | 0 .../gophercloud/gophercloud/LICENSE | 191 + .../gophercloud/gophercloud/README.md | 159 + .../gophercloud/gophercloud/auth_options.go | 437 + .../github.com/gophercloud/gophercloud/doc.go | 93 + .../gophercloud/endpoint_search.go | 76 + .../gophercloud/gophercloud/errors.go | 460 + .../gophercloud/openstack/auth_env.go | 114 + .../gophercloud/openstack/client.go | 429 + .../gophercloud/gophercloud/openstack/doc.go | 14 + .../openstack/endpoint_location.go | 107 + .../gophercloud/openstack/errors.go | 71 + .../openstack/identity/v2/tenants/doc.go | 65 + .../openstack/identity/v2/tenants/requests.go | 116 + .../openstack/identity/v2/tenants/results.go | 91 + .../openstack/identity/v2/tenants/urls.go | 23 + .../openstack/identity/v2/tokens/doc.go | 46 + .../openstack/identity/v2/tokens/requests.go | 103 + .../openstack/identity/v2/tokens/results.go | 159 + .../openstack/identity/v2/tokens/urls.go | 13 + .../openstack/identity/v3/tokens/doc.go | 108 + .../openstack/identity/v3/tokens/requests.go | 162 + .../openstack/identity/v3/tokens/results.go | 171 + .../openstack/identity/v3/tokens/urls.go | 7 + .../openstack/utils/base_endpoint.go | 28 + .../openstack/utils/choose_version.go | 111 + .../gophercloud/pagination/http.go | 60 + .../gophercloud/pagination/linked.go | 92 + .../gophercloud/pagination/marker.go | 58 + .../gophercloud/pagination/pager.go | 251 + .../gophercloud/gophercloud/pagination/pkg.go | 4 + .../gophercloud/pagination/single.go | 33 + .../gophercloud/gophercloud/params.go | 491 + .../gophercloud/provider_client.go | 412 + .../gophercloud/gophercloud/results.go | 448 + .../gophercloud/gophercloud/service_client.go | 150 + .../gophercloud/gophercloud/util.go | 102 + .../github.com/hashicorp/golang-lru/LICENSE | 362 - .../hashicorp/golang-lru/simplelru/lru.go | 161 - .../golang-lru/simplelru/lru_interface.go | 36 - vendor/github.com/json-iterator/go/adapter.go | 2 +- vendor/github.com/json-iterator/go/go.mod | 11 + vendor/github.com/json-iterator/go/go.sum | 14 + .../github.com/json-iterator/go/iter_skip.go | 25 +- .../json-iterator/go/reflect_native.go | 14 +- .../go/reflect_struct_decoder.go | 2 +- .../json-iterator/go/stream_float.go | 17 + .../opencontainers/go-digest/.mailmap | 1 + .../opencontainers/go-digest/.pullapprove.yml | 12 + .../opencontainers/go-digest/.travis.yml | 4 + .../opencontainers/go-digest/CONTRIBUTING.md | 72 + .../opencontainers/go-digest/LICENSE.code | 191 + .../opencontainers/go-digest/LICENSE.docs | 425 + .../opencontainers/go-digest/MAINTAINERS | 9 + .../opencontainers/go-digest/README.md | 104 + .../opencontainers/go-digest/algorithm.go | 192 + .../opencontainers/go-digest/digest.go | 156 + .../opencontainers/go-digest/digester.go | 39 + .../opencontainers/go-digest/doc.go | 56 + .../opencontainers/go-digest/verifiers.go | 45 + vendor/github.com/rivo/tview/form.go | 37 +- .../shirou/gopsutil/mem/types_openbsd.go | 34 - .../testify/assert/assertion_format.go | 82 + .../testify/assert/assertion_forward.go | 164 + .../testify/assert/assertion_order.go | 309 + .../stretchr/testify/assert/assertions.go | 96 +- vendor/go.opencensus.io/README.md | 2 +- vendor/go.opencensus.io/go.mod | 6 +- vendor/go.opencensus.io/go.sum | 10 +- vendor/go.opencensus.io/internal/internal.go | 2 +- vendor/go.opencensus.io/opencensus.go | 2 +- .../go.opencensus.io/plugin/ochttp/server.go | 4 +- .../go.opencensus.io/plugin/ochttp/stats.go | 18 +- .../go.opencensus.io/plugin/ochttp/trace.go | 2 + .../stats/view/aggregation.go | 2 +- vendor/go.opencensus.io/stats/view/doc.go | 2 +- vendor/go.opencensus.io/stats/view/view.go | 6 +- .../stats/view/view_to_metric.go | 11 +- vendor/go.opencensus.io/tag/key.go | 5 +- vendor/go.opencensus.io/tag/map_codec.go | 2 +- vendor/go.opencensus.io/trace/lrumap.go | 42 +- vendor/go.opencensus.io/trace/trace.go | 6 +- vendor/golang.org/x/net/html/atom/gen.go | 712 - vendor/golang.org/x/net/http2/server.go | 48 +- vendor/golang.org/x/net/http2/transport.go | 2 +- vendor/golang.org/x/net/http2/writesched.go | 8 +- .../golang.org/x/net/internal/socks/client.go | 168 + .../golang.org/x/net/internal/socks/socks.go | 317 + vendor/golang.org/x/net/proxy/dial.go | 54 + vendor/golang.org/x/net/proxy/direct.go | 31 + vendor/golang.org/x/net/proxy/per_host.go | 155 + vendor/golang.org/x/net/proxy/proxy.go | 149 + vendor/golang.org/x/net/proxy/socks5.go | 42 + .../golang.org/x/sys/unix/affinity_linux.go | 42 +- .../golang.org/x/sys/unix/asm_linux_riscv64.s | 54 + vendor/golang.org/x/sys/unix/dirent.go | 91 +- vendor/golang.org/x/sys/unix/endian_little.go | 2 +- vendor/golang.org/x/sys/unix/ioctl.go | 41 +- vendor/golang.org/x/sys/unix/mkall.sh | 8 +- vendor/golang.org/x/sys/unix/mkasm_darwin.go | 61 - vendor/golang.org/x/sys/unix/mkerrors.sh | 6 + vendor/golang.org/x/sys/unix/mkpost.go | 122 - vendor/golang.org/x/sys/unix/mksyscall.go | 407 - .../x/sys/unix/mksyscall_aix_ppc.go | 415 - .../x/sys/unix/mksyscall_aix_ppc64.go | 614 - .../x/sys/unix/mksyscall_solaris.go | 335 - .../golang.org/x/sys/unix/mksysctl_openbsd.go | 355 - vendor/golang.org/x/sys/unix/mksysnum.go | 190 - .../x/sys/unix/readdirent_getdents.go | 12 + .../x/sys/unix/readdirent_getdirentries.go | 19 + vendor/golang.org/x/sys/unix/syscall_aix.go | 57 +- vendor/golang.org/x/sys/unix/syscall_bsd.go | 12 +- .../golang.org/x/sys/unix/syscall_darwin.go | 50 +- .../x/sys/unix/syscall_darwin_386.go | 2 + .../x/sys/unix/syscall_darwin_amd64.go | 2 + .../x/sys/unix/syscall_darwin_arm.go | 4 + .../x/sys/unix/syscall_darwin_arm64.go | 4 + .../x/sys/unix/syscall_dragonfly.go | 54 +- .../golang.org/x/sys/unix/syscall_freebsd.go | 131 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 70 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 74 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 74 +- .../golang.org/x/sys/unix/syscall_solaris.go | 47 +- vendor/golang.org/x/sys/unix/types_aix.go | 237 - vendor/golang.org/x/sys/unix/types_darwin.go | 283 - .../golang.org/x/sys/unix/types_dragonfly.go | 263 - vendor/golang.org/x/sys/unix/types_freebsd.go | 356 - vendor/golang.org/x/sys/unix/types_netbsd.go | 289 - vendor/golang.org/x/sys/unix/types_openbsd.go | 282 - vendor/golang.org/x/sys/unix/types_solaris.go | 266 - .../x/sys/unix/zerrors_linux_386.go | 79 + .../x/sys/unix/zerrors_linux_amd64.go | 79 + .../x/sys/unix/zerrors_linux_arm.go | 79 + .../x/sys/unix/zerrors_linux_arm64.go | 79 + .../x/sys/unix/zerrors_linux_mips.go | 79 + .../x/sys/unix/zerrors_linux_mips64.go | 79 + .../x/sys/unix/zerrors_linux_mips64le.go | 79 + .../x/sys/unix/zerrors_linux_mipsle.go | 79 + .../x/sys/unix/zerrors_linux_ppc64.go | 79 + .../x/sys/unix/zerrors_linux_ppc64le.go | 79 + .../x/sys/unix/zerrors_linux_riscv64.go | 79 + .../x/sys/unix/zerrors_linux_s390x.go | 79 + .../x/sys/unix/zerrors_linux_sparc64.go | 79 + .../x/sys/unix/zsyscall_darwin_386.1_11.go | 20 +- .../x/sys/unix/zsyscall_darwin_386.go | 30 +- .../x/sys/unix/zsyscall_darwin_386.s | 4 +- .../x/sys/unix/zsyscall_darwin_amd64.go | 30 +- .../x/sys/unix/zsyscall_darwin_amd64.s | 4 +- .../x/sys/unix/zsyscall_darwin_arm.go | 15 - .../x/sys/unix/zsyscall_darwin_arm.s | 2 - .../x/sys/unix/zsyscall_darwin_arm64.go | 15 - .../x/sys/unix/zsyscall_darwin_arm64.s | 2 - .../x/sys/unix/zsyscall_dragonfly_amd64.go | 17 + .../x/sys/unix/zsyscall_freebsd_386.go | 12 +- .../x/sys/unix/zsyscall_freebsd_amd64.go | 12 +- .../x/sys/unix/zsyscall_freebsd_arm.go | 12 +- .../x/sys/unix/zsyscall_freebsd_arm64.go | 12 +- .../x/sys/unix/zsyscall_linux_386.go | 20 + .../x/sys/unix/zsyscall_linux_amd64.go | 20 + .../x/sys/unix/zsyscall_linux_arm.go | 20 + .../x/sys/unix/zsyscall_linux_arm64.go | 20 + .../x/sys/unix/zsyscall_linux_mips.go | 20 + .../x/sys/unix/zsyscall_linux_mips64.go | 20 + .../x/sys/unix/zsyscall_linux_mips64le.go | 20 + .../x/sys/unix/zsyscall_linux_mipsle.go | 20 + .../x/sys/unix/zsyscall_linux_ppc64.go | 20 + .../x/sys/unix/zsyscall_linux_ppc64le.go | 20 + .../x/sys/unix/zsyscall_linux_riscv64.go | 20 + .../x/sys/unix/zsyscall_linux_s390x.go | 20 + .../x/sys/unix/zsyscall_linux_sparc64.go | 20 + .../x/sys/unix/zsyscall_netbsd_386.go | 2 +- .../x/sys/unix/zsyscall_netbsd_amd64.go | 2 +- .../x/sys/unix/zsyscall_netbsd_arm.go | 2 +- .../x/sys/unix/zsyscall_netbsd_arm64.go | 2 +- .../x/sys/unix/zsyscall_openbsd_386.go | 2 +- .../x/sys/unix/zsyscall_openbsd_amd64.go | 2 +- .../x/sys/unix/zsyscall_openbsd_arm.go | 2 +- .../x/sys/unix/zsyscall_openbsd_arm64.go | 2 +- .../x/sys/unix/zsysnum_freebsd_386.go | 23 +- .../x/sys/unix/zsysnum_freebsd_amd64.go | 23 +- .../x/sys/unix/zsysnum_freebsd_arm.go | 23 +- .../x/sys/unix/zsysnum_freebsd_arm64.go | 445 +- .../x/sys/unix/zsysnum_linux_386.go | 6 + .../x/sys/unix/zsysnum_linux_amd64.go | 6 + .../x/sys/unix/zsysnum_linux_arm.go | 6 + .../x/sys/unix/zsysnum_linux_arm64.go | 6 + .../x/sys/unix/zsysnum_linux_mips.go | 6 + .../x/sys/unix/zsysnum_linux_mips64.go | 6 + .../x/sys/unix/zsysnum_linux_mips64le.go | 6 + .../x/sys/unix/zsysnum_linux_mipsle.go | 6 + .../x/sys/unix/zsysnum_linux_ppc64.go | 6 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 6 + .../x/sys/unix/zsysnum_linux_riscv64.go | 6 + .../x/sys/unix/zsysnum_linux_s390x.go | 6 + .../x/sys/unix/zsysnum_linux_sparc64.go | 6 + .../x/sys/unix/ztypes_freebsd_386.go | 103 +- .../x/sys/unix/ztypes_freebsd_amd64.go | 110 +- .../x/sys/unix/ztypes_freebsd_arm.go | 87 +- .../x/sys/unix/ztypes_freebsd_arm64.go | 88 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 54 + .../x/sys/unix/ztypes_linux_amd64.go | 55 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 54 + .../x/sys/unix/ztypes_linux_arm64.go | 55 + .../x/sys/unix/ztypes_linux_mips.go | 54 + .../x/sys/unix/ztypes_linux_mips64.go | 55 + .../x/sys/unix/ztypes_linux_mips64le.go | 55 + .../x/sys/unix/ztypes_linux_mipsle.go | 54 + .../x/sys/unix/ztypes_linux_ppc64.go | 55 + .../x/sys/unix/ztypes_linux_ppc64le.go | 55 + .../x/sys/unix/ztypes_linux_riscv64.go | 56 + .../x/sys/unix/ztypes_linux_s390x.go | 55 + .../x/sys/unix/ztypes_linux_sparc64.go | 55 + .../x/sys/unix/ztypes_netbsd_386.go | 1 + .../x/sys/unix/ztypes_netbsd_amd64.go | 1 + .../x/sys/unix/ztypes_netbsd_arm.go | 1 + .../x/sys/unix/ztypes_netbsd_arm64.go | 1 + .../x/sys/unix/ztypes_openbsd_386.go | 1 + .../x/sys/unix/ztypes_openbsd_amd64.go | 1 + .../x/sys/unix/ztypes_openbsd_arm.go | 1 + .../x/sys/unix/ztypes_openbsd_arm64.go | 1 + vendor/golang.org/x/sys/windows/mkerrors.bash | 5 +- vendor/golang.org/x/sys/windows/mkerrors.go | 9 - .../x/sys/windows/mkknownfolderids.bash | 27 + .../x/sys/windows/security_windows.go | 58 +- vendor/golang.org/x/sys/windows/service.go | 11 + .../x/sys/windows/syscall_windows.go | 104 +- .../golang.org/x/sys/windows/types_windows.go | 108 +- .../x/sys/windows/zerrors_windows.go | 2 +- .../x/sys/windows/zknownfolderids_windows.go | 149 + .../x/sys/windows/zsyscall_windows.go | 270 +- .../x/text/encoding/charmap/maketables.go | 556 - .../x/text/encoding/htmlindex/gen.go | 173 - .../text/encoding/internal/identifier/gen.go | 142 - .../x/text/encoding/japanese/maketables.go | 161 - .../x/text/encoding/korean/maketables.go | 143 - .../encoding/simplifiedchinese/maketables.go | 161 - .../encoding/traditionalchinese/maketables.go | 140 - .../x/text/internal/language/compact/gen.go | 64 - .../internal/language/compact/gen_index.go | 113 - .../internal/language/compact/gen_parents.go | 54 - .../x/text/internal/language/gen.go | 1520 -- .../x/text/internal/language/gen_common.go | 20 - vendor/golang.org/x/text/language/gen.go | 305 - vendor/golang.org/x/text/unicode/bidi/gen.go | 133 - .../x/text/unicode/bidi/gen_ranges.go | 57 - .../x/text/unicode/bidi/gen_trieval.go | 64 - .../x/text/unicode/norm/maketables.go | 986 - .../golang.org/x/text/unicode/norm/triegen.go | 117 - .../api/analytics/v3/analytics-api.json | 7459 ++++++ .../api/analytics/v3/analytics-gen.go | 20204 ++++++++++++++++ .../v4/analyticsreporting-api.json | 10 +- .../v4/analyticsreporting-gen.go | 27 +- .../api/calendar/v3/calendar-api.json | 6 +- .../api/calendar/v3/calendar-gen.go | 39 +- .../api/gensupport/backoff.go | 51 - .../api/gensupport/header.go | 22 - .../api/gensupport/resumable.go | 143 +- .../google.golang.org/api/gensupport/retry.go | 84 - .../api/sheets/v4/sheets-api.json | 109 +- .../api/sheets/v4/sheets-gen.go | 257 + vendor/google.golang.org/grpc/.travis.yml | 10 +- vendor/google.golang.org/grpc/balancer.go | 8 +- .../grpc/balancer/balancer.go | 36 +- .../grpc/balancer/base/balancer.go | 20 +- .../grpc/balancer_conn_wrappers.go | 19 +- vendor/google.golang.org/grpc/clientconn.go | 290 +- .../grpc/credentials/credentials.go | 6 +- vendor/google.golang.org/grpc/dialoptions.go | 48 +- vendor/google.golang.org/grpc/go.mod | 5 +- vendor/google.golang.org/grpc/go.sum | 10 +- .../grpc/internal/envconfig/envconfig.go | 33 +- .../grpc/internal/internal.go | 19 +- .../grpc/internal/transport/controlbuf.go | 84 +- .../grpc/internal/transport/flowcontrol.go | 3 +- .../grpc/internal/transport/handler_server.go | 5 +- .../grpc/internal/transport/http2_client.go | 55 +- .../grpc/internal/transport/http2_server.go | 68 +- .../grpc/internal/transport/transport.go | 67 +- .../google.golang.org/grpc/naming/naming.go | 3 +- vendor/google.golang.org/grpc/pickfirst.go | 16 +- .../grpc/resolver/resolver.go | 11 +- .../grpc/resolver_conn_wrapper.go | 17 +- vendor/google.golang.org/grpc/server.go | 94 +- .../google.golang.org/grpc/service_config.go | 72 +- .../grpc/serviceconfig/serviceconfig.go | 48 + .../google.golang.org/grpc/status/status.go | 22 +- vendor/google.golang.org/grpc/stream.go | 92 +- vendor/google.golang.org/grpc/version.go | 2 +- vendor/google.golang.org/grpc/vet.sh | 11 +- .../client-go/plugin/pkg/client/auth/OWNERS | 9 + .../plugin/pkg/client/auth/azure/README.md | 50 + .../plugin/pkg/client/auth/azure/azure.go | 374 + .../plugin/pkg/client/auth/gcp/OWNERS | 8 + .../plugin/pkg/client/auth/gcp/gcp.go | 383 + .../plugin/pkg/client/auth/oidc/OWNERS | 7 + .../plugin/pkg/client/auth/oidc/oidc.go | 379 + .../pkg/client/auth/openstack/openstack.go | 193 + .../plugin/pkg/client/auth/plugins.go | 25 + .../forked/golang/template/exec.go | 94 + .../forked/golang/template/funcs.go | 599 + vendor/k8s.io/client-go/util/jsonpath/doc.go | 20 + .../client-go/util/jsonpath/jsonpath.go | 525 + vendor/k8s.io/client-go/util/jsonpath/node.go | 256 + .../k8s.io/client-go/util/jsonpath/parser.go | 526 + vendor/modules.txt | 304 +- 660 files changed, 73712 insertions(+), 17787 deletions(-) create mode 100644 vendor/github.com/Azure/go-autorest/LICENSE create mode 100644 vendor/github.com/Azure/go-autorest/autorest/adal/README.md create mode 100644 vendor/github.com/Azure/go-autorest/autorest/adal/config.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/adal/persist.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/adal/sender.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/adal/token.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/authorization.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/autorest.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/azure/async.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/azure/azure.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/azure/environments.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/azure/metadata_environment.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/azure/rp.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/client.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/date/date.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/date/time.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/date/timerfc1123.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/date/unixtime.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/date/utility.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/error.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/preparer.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/responder.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/retriablerequest.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/sender.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/utility.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/version.go create mode 100644 vendor/github.com/Azure/go-autorest/logger/logger.go create mode 100644 vendor/github.com/Azure/go-autorest/version/version.go create mode 100644 vendor/github.com/Microsoft/go-winio/.gitignore create mode 100644 vendor/github.com/Microsoft/go-winio/LICENSE create mode 100644 vendor/github.com/Microsoft/go-winio/README.md create mode 100644 vendor/github.com/Microsoft/go-winio/backup.go create mode 100644 vendor/github.com/Microsoft/go-winio/ea.go create mode 100644 vendor/github.com/Microsoft/go-winio/file.go create mode 100644 vendor/github.com/Microsoft/go-winio/fileinfo.go create mode 100644 vendor/github.com/Microsoft/go-winio/go.mod create mode 100644 vendor/github.com/Microsoft/go-winio/go.sum create mode 100644 vendor/github.com/Microsoft/go-winio/hvsock.go create mode 100644 vendor/github.com/Microsoft/go-winio/pipe.go create mode 100644 vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go create mode 100644 vendor/github.com/Microsoft/go-winio/privilege.go create mode 100644 vendor/github.com/Microsoft/go-winio/reparse.go create mode 100644 vendor/github.com/Microsoft/go-winio/sd.go create mode 100644 vendor/github.com/Microsoft/go-winio/syscall.go create mode 100644 vendor/github.com/Microsoft/go-winio/zsyscall_windows.go delete mode 100644 vendor/github.com/darkSasori/todoist/go.mod create mode 100644 vendor/github.com/dgrijalva/jwt-go/.gitignore create mode 100644 vendor/github.com/dgrijalva/jwt-go/.travis.yml create mode 100644 vendor/github.com/dgrijalva/jwt-go/LICENSE create mode 100644 vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md create mode 100644 vendor/github.com/dgrijalva/jwt-go/README.md create mode 100644 vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md create mode 100644 vendor/github.com/dgrijalva/jwt-go/claims.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/doc.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/ecdsa.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/errors.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/hmac.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/map_claims.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/none.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/parser.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/rsa.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/rsa_pss.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/rsa_utils.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/signing_method.go create mode 100644 vendor/github.com/dgrijalva/jwt-go/token.go create mode 100644 vendor/github.com/docker/distribution/LICENSE create mode 100644 vendor/github.com/docker/distribution/digestset/set.go create mode 100644 vendor/github.com/docker/distribution/reference/helpers.go create mode 100644 vendor/github.com/docker/distribution/reference/normalize.go create mode 100644 vendor/github.com/docker/distribution/reference/reference.go create mode 100644 vendor/github.com/docker/distribution/reference/regexp.go create mode 100644 vendor/github.com/docker/docker/AUTHORS create mode 100644 vendor/github.com/docker/docker/LICENSE create mode 100644 vendor/github.com/docker/docker/NOTICE create mode 100644 vendor/github.com/docker/docker/api/types/auth.go create mode 100644 vendor/github.com/docker/docker/api/types/blkiodev/blkio.go create mode 100644 vendor/github.com/docker/docker/api/types/client.go create mode 100644 vendor/github.com/docker/docker/api/types/configs.go create mode 100644 vendor/github.com/docker/docker/api/types/container/config.go create mode 100644 vendor/github.com/docker/docker/api/types/container/container_create.go create mode 100644 vendor/github.com/docker/docker/api/types/container/container_update.go create mode 100644 vendor/github.com/docker/docker/api/types/container/container_wait.go create mode 100644 vendor/github.com/docker/docker/api/types/container/host_config.go create mode 100644 vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go create mode 100644 vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go create mode 100644 vendor/github.com/docker/docker/api/types/error_response.go create mode 100644 vendor/github.com/docker/docker/api/types/events/events.go create mode 100644 vendor/github.com/docker/docker/api/types/filters/parse.go create mode 100644 vendor/github.com/docker/docker/api/types/id_response.go create mode 100644 vendor/github.com/docker/docker/api/types/image_summary.go create mode 100644 vendor/github.com/docker/docker/api/types/mount/mount.go create mode 100644 vendor/github.com/docker/docker/api/types/network/network.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin_device.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin_env.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin_interface_type.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin_mount.go create mode 100644 vendor/github.com/docker/docker/api/types/plugin_responses.go create mode 100644 vendor/github.com/docker/docker/api/types/port.go create mode 100644 vendor/github.com/docker/docker/api/types/reference/image_reference.go create mode 100644 vendor/github.com/docker/docker/api/types/registry/authenticate.go create mode 100644 vendor/github.com/docker/docker/api/types/registry/registry.go create mode 100644 vendor/github.com/docker/docker/api/types/seccomp.go create mode 100644 vendor/github.com/docker/docker/api/types/service_update_response.go create mode 100644 vendor/github.com/docker/docker/api/types/stats.go create mode 100644 vendor/github.com/docker/docker/api/types/strslice/strslice.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/common.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/container.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/network.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/node.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/secret.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/service.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/swarm.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/task.go create mode 100644 vendor/github.com/docker/docker/api/types/time/duration_convert.go create mode 100644 vendor/github.com/docker/docker/api/types/time/timestamp.go create mode 100644 vendor/github.com/docker/docker/api/types/types.go create mode 100644 vendor/github.com/docker/docker/api/types/versions/README.md create mode 100644 vendor/github.com/docker/docker/api/types/versions/compare.go create mode 100644 vendor/github.com/docker/docker/api/types/volume.go create mode 100644 vendor/github.com/docker/docker/api/types/volume/volumes_create.go create mode 100644 vendor/github.com/docker/docker/api/types/volume/volumes_list.go create mode 100644 vendor/github.com/docker/docker/client/README.md create mode 100644 vendor/github.com/docker/docker/client/checkpoint_create.go create mode 100644 vendor/github.com/docker/docker/client/checkpoint_delete.go create mode 100644 vendor/github.com/docker/docker/client/checkpoint_list.go create mode 100644 vendor/github.com/docker/docker/client/client.go create mode 100644 vendor/github.com/docker/docker/client/client_unix.go create mode 100644 vendor/github.com/docker/docker/client/client_windows.go create mode 100644 vendor/github.com/docker/docker/client/container_attach.go create mode 100644 vendor/github.com/docker/docker/client/container_commit.go create mode 100644 vendor/github.com/docker/docker/client/container_copy.go create mode 100644 vendor/github.com/docker/docker/client/container_create.go create mode 100644 vendor/github.com/docker/docker/client/container_diff.go create mode 100644 vendor/github.com/docker/docker/client/container_exec.go create mode 100644 vendor/github.com/docker/docker/client/container_export.go create mode 100644 vendor/github.com/docker/docker/client/container_inspect.go create mode 100644 vendor/github.com/docker/docker/client/container_kill.go create mode 100644 vendor/github.com/docker/docker/client/container_list.go create mode 100644 vendor/github.com/docker/docker/client/container_logs.go create mode 100644 vendor/github.com/docker/docker/client/container_pause.go create mode 100644 vendor/github.com/docker/docker/client/container_prune.go create mode 100644 vendor/github.com/docker/docker/client/container_remove.go create mode 100644 vendor/github.com/docker/docker/client/container_rename.go create mode 100644 vendor/github.com/docker/docker/client/container_resize.go create mode 100644 vendor/github.com/docker/docker/client/container_restart.go create mode 100644 vendor/github.com/docker/docker/client/container_start.go create mode 100644 vendor/github.com/docker/docker/client/container_stats.go create mode 100644 vendor/github.com/docker/docker/client/container_stop.go create mode 100644 vendor/github.com/docker/docker/client/container_top.go create mode 100644 vendor/github.com/docker/docker/client/container_unpause.go create mode 100644 vendor/github.com/docker/docker/client/container_update.go create mode 100644 vendor/github.com/docker/docker/client/container_wait.go create mode 100644 vendor/github.com/docker/docker/client/disk_usage.go create mode 100644 vendor/github.com/docker/docker/client/errors.go create mode 100644 vendor/github.com/docker/docker/client/events.go create mode 100644 vendor/github.com/docker/docker/client/hijack.go create mode 100644 vendor/github.com/docker/docker/client/image_build.go create mode 100644 vendor/github.com/docker/docker/client/image_create.go create mode 100644 vendor/github.com/docker/docker/client/image_history.go create mode 100644 vendor/github.com/docker/docker/client/image_import.go create mode 100644 vendor/github.com/docker/docker/client/image_inspect.go create mode 100644 vendor/github.com/docker/docker/client/image_list.go create mode 100644 vendor/github.com/docker/docker/client/image_load.go create mode 100644 vendor/github.com/docker/docker/client/image_prune.go create mode 100644 vendor/github.com/docker/docker/client/image_pull.go create mode 100644 vendor/github.com/docker/docker/client/image_push.go create mode 100644 vendor/github.com/docker/docker/client/image_remove.go create mode 100644 vendor/github.com/docker/docker/client/image_save.go create mode 100644 vendor/github.com/docker/docker/client/image_search.go create mode 100644 vendor/github.com/docker/docker/client/image_tag.go create mode 100644 vendor/github.com/docker/docker/client/info.go create mode 100644 vendor/github.com/docker/docker/client/interface.go create mode 100644 vendor/github.com/docker/docker/client/interface_experimental.go create mode 100644 vendor/github.com/docker/docker/client/interface_stable.go create mode 100644 vendor/github.com/docker/docker/client/login.go create mode 100644 vendor/github.com/docker/docker/client/network_connect.go create mode 100644 vendor/github.com/docker/docker/client/network_create.go create mode 100644 vendor/github.com/docker/docker/client/network_disconnect.go create mode 100644 vendor/github.com/docker/docker/client/network_inspect.go create mode 100644 vendor/github.com/docker/docker/client/network_list.go create mode 100644 vendor/github.com/docker/docker/client/network_prune.go create mode 100644 vendor/github.com/docker/docker/client/network_remove.go create mode 100644 vendor/github.com/docker/docker/client/node_inspect.go create mode 100644 vendor/github.com/docker/docker/client/node_list.go create mode 100644 vendor/github.com/docker/docker/client/node_remove.go create mode 100644 vendor/github.com/docker/docker/client/node_update.go create mode 100644 vendor/github.com/docker/docker/client/ping.go create mode 100644 vendor/github.com/docker/docker/client/plugin_create.go create mode 100644 vendor/github.com/docker/docker/client/plugin_disable.go create mode 100644 vendor/github.com/docker/docker/client/plugin_enable.go create mode 100644 vendor/github.com/docker/docker/client/plugin_inspect.go create mode 100644 vendor/github.com/docker/docker/client/plugin_install.go create mode 100644 vendor/github.com/docker/docker/client/plugin_list.go create mode 100644 vendor/github.com/docker/docker/client/plugin_push.go create mode 100644 vendor/github.com/docker/docker/client/plugin_remove.go create mode 100644 vendor/github.com/docker/docker/client/plugin_set.go create mode 100644 vendor/github.com/docker/docker/client/plugin_upgrade.go create mode 100644 vendor/github.com/docker/docker/client/request.go create mode 100644 vendor/github.com/docker/docker/client/secret_create.go create mode 100644 vendor/github.com/docker/docker/client/secret_inspect.go create mode 100644 vendor/github.com/docker/docker/client/secret_list.go create mode 100644 vendor/github.com/docker/docker/client/secret_remove.go create mode 100644 vendor/github.com/docker/docker/client/secret_update.go create mode 100644 vendor/github.com/docker/docker/client/service_create.go create mode 100644 vendor/github.com/docker/docker/client/service_inspect.go create mode 100644 vendor/github.com/docker/docker/client/service_list.go create mode 100644 vendor/github.com/docker/docker/client/service_logs.go create mode 100644 vendor/github.com/docker/docker/client/service_remove.go create mode 100644 vendor/github.com/docker/docker/client/service_update.go create mode 100644 vendor/github.com/docker/docker/client/swarm_get_unlock_key.go create mode 100644 vendor/github.com/docker/docker/client/swarm_init.go create mode 100644 vendor/github.com/docker/docker/client/swarm_inspect.go create mode 100644 vendor/github.com/docker/docker/client/swarm_join.go create mode 100644 vendor/github.com/docker/docker/client/swarm_leave.go create mode 100644 vendor/github.com/docker/docker/client/swarm_unlock.go create mode 100644 vendor/github.com/docker/docker/client/swarm_update.go create mode 100644 vendor/github.com/docker/docker/client/task_inspect.go create mode 100644 vendor/github.com/docker/docker/client/task_list.go create mode 100644 vendor/github.com/docker/docker/client/transport.go create mode 100644 vendor/github.com/docker/docker/client/utils.go create mode 100644 vendor/github.com/docker/docker/client/version.go create mode 100644 vendor/github.com/docker/docker/client/volume_create.go create mode 100644 vendor/github.com/docker/docker/client/volume_inspect.go create mode 100644 vendor/github.com/docker/docker/client/volume_list.go create mode 100644 vendor/github.com/docker/docker/client/volume_prune.go create mode 100644 vendor/github.com/docker/docker/client/volume_remove.go create mode 100644 vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go create mode 100644 vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go16.go create mode 100644 vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go create mode 100644 vendor/github.com/docker/go-connections/LICENSE create mode 100644 vendor/github.com/docker/go-connections/nat/nat.go create mode 100644 vendor/github.com/docker/go-connections/nat/parse.go create mode 100644 vendor/github.com/docker/go-connections/nat/sort.go create mode 100644 vendor/github.com/docker/go-connections/sockets/README.md create mode 100644 vendor/github.com/docker/go-connections/sockets/inmem_socket.go create mode 100644 vendor/github.com/docker/go-connections/sockets/proxy.go create mode 100644 vendor/github.com/docker/go-connections/sockets/sockets.go create mode 100644 vendor/github.com/docker/go-connections/sockets/sockets_unix.go create mode 100644 vendor/github.com/docker/go-connections/sockets/sockets_windows.go create mode 100644 vendor/github.com/docker/go-connections/sockets/tcp_socket.go create mode 100644 vendor/github.com/docker/go-connections/sockets/unix_socket.go create mode 100644 vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go create mode 100644 vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go create mode 100644 vendor/github.com/docker/go-connections/tlsconfig/config.go create mode 100644 vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go create mode 100644 vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go create mode 100644 vendor/github.com/docker/go-units/CONTRIBUTING.md create mode 100644 vendor/github.com/docker/go-units/LICENSE create mode 100644 vendor/github.com/docker/go-units/MAINTAINERS create mode 100644 vendor/github.com/docker/go-units/README.md create mode 100644 vendor/github.com/docker/go-units/circle.yml create mode 100644 vendor/github.com/docker/go-units/duration.go create mode 100644 vendor/github.com/docker/go-units/size.go create mode 100644 vendor/github.com/docker/go-units/ulimit.go delete mode 100644 vendor/github.com/gdamore/tcell/database.json rename vendor/github.com/gdamore/tcell/terminfo/{term_adm3a.go => a/adm3a/term.go} (79%) rename vendor/github.com/gdamore/tcell/terminfo/{term_aixterm.go => a/aixterm/term.go} (92%) rename vendor/github.com/gdamore/tcell/terminfo/{term_ansi.go => a/ansi/term.go} (91%) rename vendor/github.com/gdamore/tcell/terminfo/{term_aterm.go => a/aterm/term.go} (95%) rename vendor/github.com/gdamore/tcell/terminfo/{term_beterm.go => b/beterm/term.go} (92%) rename vendor/github.com/gdamore/tcell/terminfo/{term_bsdos_pc.go => b/bsdos_pc/term.go} (90%) create mode 100644 vendor/github.com/gdamore/tcell/terminfo/base/base.go rename vendor/github.com/gdamore/tcell/terminfo/{term_cygwin.go => c/cygwin/term.go} (94%) rename vendor/github.com/gdamore/tcell/terminfo/{term_d200.go => d/d200/term.go} (95%) rename vendor/github.com/gdamore/tcell/terminfo/{term_d210.go => d/d210/term.go} (95%) rename vendor/github.com/gdamore/tcell/terminfo/{term_dtterm.go => d/dtterm/term.go} (94%) create mode 100644 vendor/github.com/gdamore/tcell/terminfo/e/emacs/term.go create mode 100644 vendor/github.com/gdamore/tcell/terminfo/e/eterm/term.go create mode 100644 vendor/github.com/gdamore/tcell/terminfo/extended/extended.go rename vendor/github.com/gdamore/tcell/terminfo/{term_gnome_256color.go => g/gnome/term.go} (50%) create mode 100644 vendor/github.com/gdamore/tcell/terminfo/gen.sh rename vendor/github.com/gdamore/tcell/terminfo/{term_hpterm.go => h/hpterm/term.go} (88%) rename vendor/github.com/gdamore/tcell/terminfo/{term_hz1500.go => h/hz1500/term.go} (81%) create mode 100644 vendor/github.com/gdamore/tcell/terminfo/k/konsole/term.go rename vendor/github.com/gdamore/tcell/terminfo/{term_kterm.go => k/kterm/term.go} (93%) rename vendor/github.com/gdamore/tcell/terminfo/{term_linux.go => l/linux/term.go} (92%) delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/mkinfo.go rename vendor/github.com/gdamore/tcell/terminfo/{term_pcansi.go => p/pcansi/term.go} (90%) create mode 100644 vendor/github.com/gdamore/tcell/terminfo/r/rxvt/term.go rename vendor/github.com/gdamore/tcell/terminfo/{term_screen_256color.go => s/screen/term.go} (51%) create mode 100644 vendor/github.com/gdamore/tcell/terminfo/s/simpleterm/term.go rename vendor/github.com/gdamore/tcell/terminfo/{term_sun_color.go => s/sun/term.go} (50%) rename vendor/github.com/gdamore/tcell/terminfo/{term_termite.go => t/termite/term.go} (97%) rename vendor/github.com/gdamore/tcell/terminfo/{term_tvi910.go => t/tvi910/term.go} (88%) rename vendor/github.com/gdamore/tcell/terminfo/{term_tvi912.go => t/tvi912/term.go} (88%) rename vendor/github.com/gdamore/tcell/terminfo/{term_tvi921.go => t/tvi921/term.go} (87%) rename vendor/github.com/gdamore/tcell/terminfo/{term_tvi925.go => t/tvi925/term.go} (89%) rename vendor/github.com/gdamore/tcell/terminfo/{term_tvi950.go => t/tvi950/term.go} (90%) rename vendor/github.com/gdamore/tcell/terminfo/{term_tvi970.go => t/tvi970/term.go} (89%) delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_gnome.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_konsole.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_konsole_256color.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_rxvt.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_rxvt_256color.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_rxvt_unicode.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_rxvt_unicode_256color.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_screen.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_st.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_st_256color.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_st_meta.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_st_meta_256color.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_sun.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_wy99_ansi.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_wy99a_ansi.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_xterm.go delete mode 100644 vendor/github.com/gdamore/tcell/terminfo/term_xterm_256color.go rename vendor/github.com/gdamore/tcell/terminfo/{term_vt100.go => v/vt100/term.go} (91%) rename vendor/github.com/gdamore/tcell/terminfo/{term_vt102.go => v/vt102/term.go} (91%) rename vendor/github.com/gdamore/tcell/terminfo/{term_vt220.go => v/vt220/term.go} (93%) rename vendor/github.com/gdamore/tcell/terminfo/{term_vt320.go => v/vt320/term.go} (92%) rename vendor/github.com/gdamore/tcell/terminfo/{term_vt400.go => v/vt400/term.go} (91%) rename vendor/github.com/gdamore/tcell/terminfo/{term_vt420.go => v/vt420/term.go} (92%) rename vendor/github.com/gdamore/tcell/terminfo/{term_vt52.go => v/vt52/term.go} (84%) rename vendor/github.com/gdamore/tcell/terminfo/{term_wy50.go => w/wy50/term.go} (93%) rename vendor/github.com/gdamore/tcell/terminfo/{term_wy60.go => w/wy60/term.go} (93%) create mode 100644 vendor/github.com/gdamore/tcell/terminfo/w/wy99_ansi/term.go rename vendor/github.com/gdamore/tcell/terminfo/{term_xfce.go => x/xfce/term.go} (97%) rename vendor/github.com/gdamore/tcell/terminfo/{term_xnuppc.go => x/xnuppc/term.go} (84%) create mode 100644 vendor/github.com/gdamore/tcell/terminfo/x/xterm/term.go create mode 100644 vendor/github.com/golang/groupcache/LICENSE create mode 100644 vendor/github.com/golang/groupcache/lru/lru.go delete mode 100644 vendor/github.com/google/go-github/v26/github/gen-accessors.go delete mode 100644 vendor/github.com/google/go-github/v26/github/gen-stringify-test.go create mode 100644 vendor/github.com/googleapis/gax-go/v2/LICENSE create mode 100644 vendor/github.com/googleapis/gax-go/v2/call_option.go create mode 100644 vendor/github.com/googleapis/gax-go/v2/gax.go create mode 100644 vendor/github.com/googleapis/gax-go/v2/go.mod create mode 100644 vendor/github.com/googleapis/gax-go/v2/go.sum create mode 100644 vendor/github.com/googleapis/gax-go/v2/header.go create mode 100644 vendor/github.com/googleapis/gax-go/v2/invoke.go create mode 100644 vendor/github.com/gophercloud/gophercloud/.gitignore create mode 100644 vendor/github.com/gophercloud/gophercloud/.travis.yml create mode 100644 vendor/github.com/gophercloud/gophercloud/.zuul.yaml create mode 100644 vendor/github.com/gophercloud/gophercloud/CHANGELOG.md create mode 100644 vendor/github.com/gophercloud/gophercloud/LICENSE create mode 100644 vendor/github.com/gophercloud/gophercloud/README.md create mode 100644 vendor/github.com/gophercloud/gophercloud/auth_options.go create mode 100644 vendor/github.com/gophercloud/gophercloud/doc.go create mode 100644 vendor/github.com/gophercloud/gophercloud/endpoint_search.go create mode 100644 vendor/github.com/gophercloud/gophercloud/errors.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/auth_env.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/client.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/doc.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/endpoint_location.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/errors.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/doc.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/requests.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/results.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/urls.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/doc.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/requests.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/results.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/urls.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/doc.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/requests.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/results.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/urls.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/utils/base_endpoint.go create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/utils/choose_version.go create mode 100644 vendor/github.com/gophercloud/gophercloud/pagination/http.go create mode 100644 vendor/github.com/gophercloud/gophercloud/pagination/linked.go create mode 100644 vendor/github.com/gophercloud/gophercloud/pagination/marker.go create mode 100644 vendor/github.com/gophercloud/gophercloud/pagination/pager.go create mode 100644 vendor/github.com/gophercloud/gophercloud/pagination/pkg.go create mode 100644 vendor/github.com/gophercloud/gophercloud/pagination/single.go create mode 100644 vendor/github.com/gophercloud/gophercloud/params.go create mode 100644 vendor/github.com/gophercloud/gophercloud/provider_client.go create mode 100644 vendor/github.com/gophercloud/gophercloud/results.go create mode 100644 vendor/github.com/gophercloud/gophercloud/service_client.go create mode 100644 vendor/github.com/gophercloud/gophercloud/util.go delete mode 100644 vendor/github.com/hashicorp/golang-lru/LICENSE delete mode 100644 vendor/github.com/hashicorp/golang-lru/simplelru/lru.go delete mode 100644 vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go create mode 100644 vendor/github.com/json-iterator/go/go.mod create mode 100644 vendor/github.com/json-iterator/go/go.sum create mode 100644 vendor/github.com/opencontainers/go-digest/.mailmap create mode 100644 vendor/github.com/opencontainers/go-digest/.pullapprove.yml create mode 100644 vendor/github.com/opencontainers/go-digest/.travis.yml create mode 100644 vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md create mode 100644 vendor/github.com/opencontainers/go-digest/LICENSE.code create mode 100644 vendor/github.com/opencontainers/go-digest/LICENSE.docs create mode 100644 vendor/github.com/opencontainers/go-digest/MAINTAINERS create mode 100644 vendor/github.com/opencontainers/go-digest/README.md create mode 100644 vendor/github.com/opencontainers/go-digest/algorithm.go create mode 100644 vendor/github.com/opencontainers/go-digest/digest.go create mode 100644 vendor/github.com/opencontainers/go-digest/digester.go create mode 100644 vendor/github.com/opencontainers/go-digest/doc.go create mode 100644 vendor/github.com/opencontainers/go-digest/verifiers.go delete mode 100644 vendor/github.com/shirou/gopsutil/mem/types_openbsd.go create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_order.go delete mode 100644 vendor/golang.org/x/net/html/atom/gen.go create mode 100644 vendor/golang.org/x/net/internal/socks/client.go create mode 100644 vendor/golang.org/x/net/internal/socks/socks.go create mode 100644 vendor/golang.org/x/net/proxy/dial.go create mode 100644 vendor/golang.org/x/net/proxy/direct.go create mode 100644 vendor/golang.org/x/net/proxy/per_host.go create mode 100644 vendor/golang.org/x/net/proxy/proxy.go create mode 100644 vendor/golang.org/x/net/proxy/socks5.go create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_riscv64.s delete mode 100644 vendor/golang.org/x/sys/unix/mkasm_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/mkpost.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall_solaris.go delete mode 100644 vendor/golang.org/x/sys/unix/mksysctl_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/mksysnum.go create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdents.go create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdirentries.go delete mode 100644 vendor/golang.org/x/sys/unix/types_aix.go delete mode 100644 vendor/golang.org/x/sys/unix/types_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/types_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/types_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_netbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_solaris.go delete mode 100644 vendor/golang.org/x/sys/windows/mkerrors.go create mode 100644 vendor/golang.org/x/sys/windows/mkknownfolderids.bash create mode 100644 vendor/golang.org/x/sys/windows/zknownfolderids_windows.go delete mode 100644 vendor/golang.org/x/text/encoding/charmap/maketables.go delete mode 100644 vendor/golang.org/x/text/encoding/htmlindex/gen.go delete mode 100644 vendor/golang.org/x/text/encoding/internal/identifier/gen.go delete mode 100644 vendor/golang.org/x/text/encoding/japanese/maketables.go delete mode 100644 vendor/golang.org/x/text/encoding/korean/maketables.go delete mode 100644 vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go delete mode 100644 vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go delete mode 100644 vendor/golang.org/x/text/internal/language/compact/gen.go delete mode 100644 vendor/golang.org/x/text/internal/language/compact/gen_index.go delete mode 100644 vendor/golang.org/x/text/internal/language/compact/gen_parents.go delete mode 100644 vendor/golang.org/x/text/internal/language/gen.go delete mode 100644 vendor/golang.org/x/text/internal/language/gen_common.go delete mode 100644 vendor/golang.org/x/text/language/gen.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/gen.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/gen_ranges.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/gen_trieval.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/maketables.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/triegen.go create mode 100644 vendor/google.golang.org/api/analytics/v3/analytics-api.json create mode 100644 vendor/google.golang.org/api/analytics/v3/analytics-gen.go delete mode 100644 vendor/google.golang.org/api/gensupport/backoff.go delete mode 100644 vendor/google.golang.org/api/gensupport/header.go delete mode 100644 vendor/google.golang.org/api/gensupport/retry.go create mode 100644 vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/OWNERS create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/README.md create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/OWNERS create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/OWNERS create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/oidc.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/plugins.go create mode 100644 vendor/k8s.io/client-go/third_party/forked/golang/template/exec.go create mode 100644 vendor/k8s.io/client-go/third_party/forked/golang/template/funcs.go create mode 100644 vendor/k8s.io/client-go/util/jsonpath/doc.go create mode 100644 vendor/k8s.io/client-go/util/jsonpath/jsonpath.go create mode 100644 vendor/k8s.io/client-go/util/jsonpath/node.go create mode 100644 vendor/k8s.io/client-go/util/jsonpath/parser.go diff --git a/go.mod b/go.mod index 4e8e1103..54d6efaa 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( cloud.google.com/go v0.45.1 // indirect code.cloudfoundry.org/bytefmt v0.0.0-20180906201452-2aa6f33b730c github.com/BurntSushi/xgb v0.0.0-20160522221800-27f122750802 // indirect + github.com/Microsoft/go-winio v0.4.14 // indirect github.com/PagerDuty/go-pagerduty v0.0.0-20190503230806-cf1437c7c8d6 github.com/StackExchange/wmi v0.0.0-20190523213609-cbe66965904d // indirect github.com/adlio/trello v1.0.0 diff --git a/go.sum b/go.sum index 95095014..e94f0dbc 100644 --- a/go.sum +++ b/go.sum @@ -15,6 +15,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/BurntSushi/xgb v0.0.0-20160522221800-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PagerDuty/go-pagerduty v0.0.0-20190503230806-cf1437c7c8d6 h1:JucouG/P7B+i18/RJbFpbqJyaserYaQzFMlfK/eIEY8= @@ -23,6 +25,7 @@ github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/StackExchange/wmi v0.0.0-20190523213609-cbe66965904d h1:VWP4o43LuzNbykZJzMUv5b9DWLgn0sn3GUj3RUyWMMQ= github.com/StackExchange/wmi v0.0.0-20190523213609-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/adlio/trello v1.0.0 h1:7Mp6DnNXBHBAdhfcutftFDnX7K/G9yEtScAEplJzu+0= github.com/adlio/trello v1.0.0/go.mod h1:l2068AhUuUuQ9Vsb95ECMueHThYyAj4e85lWPmr2/LE= @@ -67,6 +70,8 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= +github.com/darkSasori/todoist v0.0.0-20180703032645-ec6b38b374ab h1:T9EEtA6FSJMVypkNlKjrRo04u1j5Tk+gghymflyivDw= +github.com/darkSasori/todoist v0.0.0-20180703032645-ec6b38b374ab/go.mod h1:dD/81kphWGY78UVdEu2sqkrUMYfvtdKAMaACFYHGkfU= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -106,6 +111,7 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= @@ -302,6 +308,7 @@ github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAri github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/sirupsen/logrus v0.0.0-20180523074243-ea8897e79973/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -483,6 +490,7 @@ google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.2 h1:j8RI1yW0SkI+paT6uGwMlrMI/6zwYA6/CFil8rxOzGI= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= diff --git a/vendor/cloud.google.com/go/compute/metadata/metadata.go b/vendor/cloud.google.com/go/compute/metadata/metadata.go index 125b7033..4ff4e2f1 100644 --- a/vendor/cloud.google.com/go/compute/metadata/metadata.go +++ b/vendor/cloud.google.com/go/compute/metadata/metadata.go @@ -227,6 +227,9 @@ func InternalIP() (string, error) { return defaultClient.InternalIP() } // ExternalIP returns the instance's primary external (public) IP address. func ExternalIP() (string, error) { return defaultClient.ExternalIP() } +// Email calls Client.Email on the default client. +func Email(serviceAccount string) (string, error) { return defaultClient.Email(serviceAccount) } + // Hostname returns the instance's hostname. This will be of the form // ".c..internal". func Hostname() (string, error) { return defaultClient.Hostname() } @@ -367,6 +370,16 @@ func (c *Client) InternalIP() (string, error) { return c.getTrimmed("instance/network-interfaces/0/ip") } +// Email returns the email address associated with the service account. +// The account may be empty or the string "default" to use the instance's +// main account. +func (c *Client) Email(serviceAccount string) (string, error) { + if serviceAccount == "" { + serviceAccount = "default" + } + return c.getTrimmed("instance/service-accounts/" + serviceAccount + "/email") +} + // ExternalIP returns the instance's primary external (public) IP address. func (c *Client) ExternalIP() (string, error) { return c.getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip") diff --git a/vendor/github.com/Azure/go-autorest/LICENSE b/vendor/github.com/Azure/go-autorest/LICENSE new file mode 100644 index 00000000..b9d6a27e --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2015 Microsoft Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/README.md b/vendor/github.com/Azure/go-autorest/autorest/adal/README.md new file mode 100644 index 00000000..7b0c4bc4 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/README.md @@ -0,0 +1,292 @@ +# Azure Active Directory authentication for Go + +This is a standalone package for authenticating with Azure Active +Directory from other Go libraries and applications, in particular the [Azure SDK +for Go](https://github.com/Azure/azure-sdk-for-go). + +Note: Despite the package's name it is not related to other "ADAL" libraries +maintained in the [github.com/AzureAD](https://github.com/AzureAD) org. Issues +should be opened in [this repo's](https://github.com/Azure/go-autorest/issues) +or [the SDK's](https://github.com/Azure/azure-sdk-for-go/issues) issue +trackers. + +## Install + +```bash +go get -u github.com/Azure/go-autorest/autorest/adal +``` + +## Usage + +An Active Directory application is required in order to use this library. An application can be registered in the [Azure Portal](https://portal.azure.com/) by following these [guidelines](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-integrating-applications) or using the [Azure CLI](https://github.com/Azure/azure-cli). + +### Register an Azure AD Application with secret + + +1. Register a new application with a `secret` credential + + ``` + az ad app create \ + --display-name example-app \ + --homepage https://example-app/home \ + --identifier-uris https://example-app/app \ + --password secret + ``` + +2. Create a service principal using the `Application ID` from previous step + + ``` + az ad sp create --id "Application ID" + ``` + + * Replace `Application ID` with `appId` from step 1. + +### Register an Azure AD Application with certificate + +1. Create a private key + + ``` + openssl genrsa -out "example-app.key" 2048 + ``` + +2. Create the certificate + + ``` + openssl req -new -key "example-app.key" -subj "/CN=example-app" -out "example-app.csr" + openssl x509 -req -in "example-app.csr" -signkey "example-app.key" -out "example-app.crt" -days 10000 + ``` + +3. Create the PKCS12 version of the certificate containing also the private key + + ``` + openssl pkcs12 -export -out "example-app.pfx" -inkey "example-app.key" -in "example-app.crt" -passout pass: + + ``` + +4. Register a new application with the certificate content form `example-app.crt` + + ``` + certificateContents="$(tail -n+2 "example-app.crt" | head -n-1)" + + az ad app create \ + --display-name example-app \ + --homepage https://example-app/home \ + --identifier-uris https://example-app/app \ + --key-usage Verify --end-date 2018-01-01 \ + --key-value "${certificateContents}" + ``` + +5. Create a service principal using the `Application ID` from previous step + + ``` + az ad sp create --id "APPLICATION_ID" + ``` + + * Replace `APPLICATION_ID` with `appId` from step 4. + + +### Grant the necessary permissions + +Azure relies on a Role-Based Access Control (RBAC) model to manage the access to resources at a fine-grained +level. There is a set of [pre-defined roles](https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-built-in-roles) +which can be assigned to a service principal of an Azure AD application depending of your needs. + +``` +az role assignment create --assigner "SERVICE_PRINCIPAL_ID" --role "ROLE_NAME" +``` + +* Replace the `SERVICE_PRINCIPAL_ID` with the `appId` from previous step. +* Replace the `ROLE_NAME` with a role name of your choice. + +It is also possible to define custom role definitions. + +``` +az role definition create --role-definition role-definition.json +``` + +* Check [custom roles](https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-control-custom-roles) for more details regarding the content of `role-definition.json` file. + + +### Acquire Access Token + +The common configuration used by all flows: + +```Go +const activeDirectoryEndpoint = "https://login.microsoftonline.com/" +tenantID := "TENANT_ID" +oauthConfig, err := adal.NewOAuthConfig(activeDirectoryEndpoint, tenantID) + +applicationID := "APPLICATION_ID" + +callback := func(token adal.Token) error { + // This is called after the token is acquired +} + +// The resource for which the token is acquired +resource := "https://management.core.windows.net/" +``` + +* Replace the `TENANT_ID` with your tenant ID. +* Replace the `APPLICATION_ID` with the value from previous section. + +#### Client Credentials + +```Go +applicationSecret := "APPLICATION_SECRET" + +spt, err := adal.NewServicePrincipalToken( + oauthConfig, + appliationID, + applicationSecret, + resource, + callbacks...) +if err != nil { + return nil, err +} + +// Acquire a new access token +err = spt.Refresh() +if (err == nil) { + token := spt.Token +} +``` + +* Replace the `APPLICATION_SECRET` with the `password` value from previous section. + +#### Client Certificate + +```Go +certificatePath := "./example-app.pfx" + +certData, err := ioutil.ReadFile(certificatePath) +if err != nil { + return nil, fmt.Errorf("failed to read the certificate file (%s): %v", certificatePath, err) +} + +// Get the certificate and private key from pfx file +certificate, rsaPrivateKey, err := decodePkcs12(certData, "") +if err != nil { + return nil, fmt.Errorf("failed to decode pkcs12 certificate while creating spt: %v", err) +} + +spt, err := adal.NewServicePrincipalTokenFromCertificate( + oauthConfig, + applicationID, + certificate, + rsaPrivateKey, + resource, + callbacks...) + +// Acquire a new access token +err = spt.Refresh() +if (err == nil) { + token := spt.Token +} +``` + +* Update the certificate path to point to the example-app.pfx file which was created in previous section. + + +#### Device Code + +```Go +oauthClient := &http.Client{} + +// Acquire the device code +deviceCode, err := adal.InitiateDeviceAuth( + oauthClient, + oauthConfig, + applicationID, + resource) +if err != nil { + return nil, fmt.Errorf("Failed to start device auth flow: %s", err) +} + +// Display the authentication message +fmt.Println(*deviceCode.Message) + +// Wait here until the user is authenticated +token, err := adal.WaitForUserCompletion(oauthClient, deviceCode) +if err != nil { + return nil, fmt.Errorf("Failed to finish device auth flow: %s", err) +} + +spt, err := adal.NewServicePrincipalTokenFromManualToken( + oauthConfig, + applicationID, + resource, + *token, + callbacks...) + +if (err == nil) { + token := spt.Token +} +``` + +#### Username password authenticate + +```Go +spt, err := adal.NewServicePrincipalTokenFromUsernamePassword( + oauthConfig, + applicationID, + username, + password, + resource, + callbacks...) + +if (err == nil) { + token := spt.Token +} +``` + +#### Authorization code authenticate + +``` Go +spt, err := adal.NewServicePrincipalTokenFromAuthorizationCode( + oauthConfig, + applicationID, + clientSecret, + authorizationCode, + redirectURI, + resource, + callbacks...) + +err = spt.Refresh() +if (err == nil) { + token := spt.Token +} +``` + +### Command Line Tool + +A command line tool is available in `cmd/adal.go` that can acquire a token for a given resource. It supports all flows mentioned above. + +``` +adal -h + +Usage of ./adal: + -applicationId string + application id + -certificatePath string + path to pk12/PFC application certificate + -mode string + authentication mode (device, secret, cert, refresh) (default "device") + -resource string + resource for which the token is requested + -secret string + application secret + -tenantId string + tenant id + -tokenCachePath string + location of oath token cache (default "/home/cgc/.adal/accessToken.json") +``` + +Example acquire a token for `https://management.core.windows.net/` using device code flow: + +``` +adal -mode device \ + -applicationId "APPLICATION_ID" \ + -tenantId "TENANT_ID" \ + -resource https://management.core.windows.net/ + +``` diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/config.go b/vendor/github.com/Azure/go-autorest/autorest/adal/config.go new file mode 100644 index 00000000..8c83a917 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/config.go @@ -0,0 +1,91 @@ +package adal + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "fmt" + "net/url" +) + +// OAuthConfig represents the endpoints needed +// in OAuth operations +type OAuthConfig struct { + AuthorityEndpoint url.URL `json:"authorityEndpoint"` + AuthorizeEndpoint url.URL `json:"authorizeEndpoint"` + TokenEndpoint url.URL `json:"tokenEndpoint"` + DeviceCodeEndpoint url.URL `json:"deviceCodeEndpoint"` +} + +// IsZero returns true if the OAuthConfig object is zero-initialized. +func (oac OAuthConfig) IsZero() bool { + return oac == OAuthConfig{} +} + +func validateStringParam(param, name string) error { + if len(param) == 0 { + return fmt.Errorf("parameter '" + name + "' cannot be empty") + } + return nil +} + +// NewOAuthConfig returns an OAuthConfig with tenant specific urls +func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, error) { + apiVer := "1.0" + return NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, tenantID, &apiVer) +} + +// NewOAuthConfigWithAPIVersion returns an OAuthConfig with tenant specific urls. +// If apiVersion is not nil the "api-version" query parameter will be appended to the endpoint URLs with the specified value. +func NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, tenantID string, apiVersion *string) (*OAuthConfig, error) { + if err := validateStringParam(activeDirectoryEndpoint, "activeDirectoryEndpoint"); err != nil { + return nil, err + } + api := "" + // it's legal for tenantID to be empty so don't validate it + if apiVersion != nil { + if err := validateStringParam(*apiVersion, "apiVersion"); err != nil { + return nil, err + } + api = fmt.Sprintf("?api-version=%s", *apiVersion) + } + const activeDirectoryEndpointTemplate = "%s/oauth2/%s%s" + u, err := url.Parse(activeDirectoryEndpoint) + if err != nil { + return nil, err + } + authorityURL, err := u.Parse(tenantID) + if err != nil { + return nil, err + } + authorizeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "authorize", api)) + if err != nil { + return nil, err + } + tokenURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "token", api)) + if err != nil { + return nil, err + } + deviceCodeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "devicecode", api)) + if err != nil { + return nil, err + } + + return &OAuthConfig{ + AuthorityEndpoint: *authorityURL, + AuthorizeEndpoint: *authorizeURL, + TokenEndpoint: *tokenURL, + DeviceCodeEndpoint: *deviceCodeURL, + }, nil +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go b/vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go new file mode 100644 index 00000000..b38f4c24 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go @@ -0,0 +1,242 @@ +package adal + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* + This file is largely based on rjw57/oauth2device's code, with the follow differences: + * scope -> resource, and only allow a single one + * receive "Message" in the DeviceCode struct and show it to users as the prompt + * azure-xplat-cli has the following behavior that this emulates: + - does not send client_secret during the token exchange + - sends resource again in the token exchange request +*/ + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "strings" + "time" +) + +const ( + logPrefix = "autorest/adal/devicetoken:" +) + +var ( + // ErrDeviceGeneric represents an unknown error from the token endpoint when using device flow + ErrDeviceGeneric = fmt.Errorf("%s Error while retrieving OAuth token: Unknown Error", logPrefix) + + // ErrDeviceAccessDenied represents an access denied error from the token endpoint when using device flow + ErrDeviceAccessDenied = fmt.Errorf("%s Error while retrieving OAuth token: Access Denied", logPrefix) + + // ErrDeviceAuthorizationPending represents the server waiting on the user to complete the device flow + ErrDeviceAuthorizationPending = fmt.Errorf("%s Error while retrieving OAuth token: Authorization Pending", logPrefix) + + // ErrDeviceCodeExpired represents the server timing out and expiring the code during device flow + ErrDeviceCodeExpired = fmt.Errorf("%s Error while retrieving OAuth token: Code Expired", logPrefix) + + // ErrDeviceSlowDown represents the service telling us we're polling too often during device flow + ErrDeviceSlowDown = fmt.Errorf("%s Error while retrieving OAuth token: Slow Down", logPrefix) + + // ErrDeviceCodeEmpty represents an empty device code from the device endpoint while using device flow + ErrDeviceCodeEmpty = fmt.Errorf("%s Error while retrieving device code: Device Code Empty", logPrefix) + + // ErrOAuthTokenEmpty represents an empty OAuth token from the token endpoint when using device flow + ErrOAuthTokenEmpty = fmt.Errorf("%s Error while retrieving OAuth token: Token Empty", logPrefix) + + errCodeSendingFails = "Error occurred while sending request for Device Authorization Code" + errCodeHandlingFails = "Error occurred while handling response from the Device Endpoint" + errTokenSendingFails = "Error occurred while sending request with device code for a token" + errTokenHandlingFails = "Error occurred while handling response from the Token Endpoint (during device flow)" + errStatusNotOK = "Error HTTP status != 200" +) + +// DeviceCode is the object returned by the device auth endpoint +// It contains information to instruct the user to complete the auth flow +type DeviceCode struct { + DeviceCode *string `json:"device_code,omitempty"` + UserCode *string `json:"user_code,omitempty"` + VerificationURL *string `json:"verification_url,omitempty"` + ExpiresIn *int64 `json:"expires_in,string,omitempty"` + Interval *int64 `json:"interval,string,omitempty"` + + Message *string `json:"message"` // Azure specific + Resource string // store the following, stored when initiating, used when exchanging + OAuthConfig OAuthConfig + ClientID string +} + +// TokenError is the object returned by the token exchange endpoint +// when something is amiss +type TokenError struct { + Error *string `json:"error,omitempty"` + ErrorCodes []int `json:"error_codes,omitempty"` + ErrorDescription *string `json:"error_description,omitempty"` + Timestamp *string `json:"timestamp,omitempty"` + TraceID *string `json:"trace_id,omitempty"` +} + +// DeviceToken is the object return by the token exchange endpoint +// It can either look like a Token or an ErrorToken, so put both here +// and check for presence of "Error" to know if we are in error state +type deviceToken struct { + Token + TokenError +} + +// InitiateDeviceAuth initiates a device auth flow. It returns a DeviceCode +// that can be used with CheckForUserCompletion or WaitForUserCompletion. +func InitiateDeviceAuth(sender Sender, oauthConfig OAuthConfig, clientID, resource string) (*DeviceCode, error) { + v := url.Values{ + "client_id": []string{clientID}, + "resource": []string{resource}, + } + + s := v.Encode() + body := ioutil.NopCloser(strings.NewReader(s)) + + req, err := http.NewRequest(http.MethodPost, oauthConfig.DeviceCodeEndpoint.String(), body) + if err != nil { + return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeSendingFails, err.Error()) + } + + req.ContentLength = int64(len(s)) + req.Header.Set(contentType, mimeTypeFormPost) + resp, err := sender.Do(req) + if err != nil { + return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeSendingFails, err.Error()) + } + defer resp.Body.Close() + + rb, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeHandlingFails, err.Error()) + } + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeHandlingFails, errStatusNotOK) + } + + if len(strings.Trim(string(rb), " ")) == 0 { + return nil, ErrDeviceCodeEmpty + } + + var code DeviceCode + err = json.Unmarshal(rb, &code) + if err != nil { + return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeHandlingFails, err.Error()) + } + + code.ClientID = clientID + code.Resource = resource + code.OAuthConfig = oauthConfig + + return &code, nil +} + +// CheckForUserCompletion takes a DeviceCode and checks with the Azure AD OAuth endpoint +// to see if the device flow has: been completed, timed out, or otherwise failed +func CheckForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) { + v := url.Values{ + "client_id": []string{code.ClientID}, + "code": []string{*code.DeviceCode}, + "grant_type": []string{OAuthGrantTypeDeviceCode}, + "resource": []string{code.Resource}, + } + + s := v.Encode() + body := ioutil.NopCloser(strings.NewReader(s)) + + req, err := http.NewRequest(http.MethodPost, code.OAuthConfig.TokenEndpoint.String(), body) + if err != nil { + return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenSendingFails, err.Error()) + } + + req.ContentLength = int64(len(s)) + req.Header.Set(contentType, mimeTypeFormPost) + resp, err := sender.Do(req) + if err != nil { + return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenSendingFails, err.Error()) + } + defer resp.Body.Close() + + rb, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenHandlingFails, err.Error()) + } + + if resp.StatusCode != http.StatusOK && len(strings.Trim(string(rb), " ")) == 0 { + return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenHandlingFails, errStatusNotOK) + } + if len(strings.Trim(string(rb), " ")) == 0 { + return nil, ErrOAuthTokenEmpty + } + + var token deviceToken + err = json.Unmarshal(rb, &token) + if err != nil { + return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenHandlingFails, err.Error()) + } + + if token.Error == nil { + return &token.Token, nil + } + + switch *token.Error { + case "authorization_pending": + return nil, ErrDeviceAuthorizationPending + case "slow_down": + return nil, ErrDeviceSlowDown + case "access_denied": + return nil, ErrDeviceAccessDenied + case "code_expired": + return nil, ErrDeviceCodeExpired + default: + return nil, ErrDeviceGeneric + } +} + +// WaitForUserCompletion calls CheckForUserCompletion repeatedly until a token is granted or an error state occurs. +// This prevents the user from looping and checking against 'ErrDeviceAuthorizationPending'. +func WaitForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) { + intervalDuration := time.Duration(*code.Interval) * time.Second + waitDuration := intervalDuration + + for { + token, err := CheckForUserCompletion(sender, code) + + if err == nil { + return token, nil + } + + switch err { + case ErrDeviceSlowDown: + waitDuration += waitDuration + case ErrDeviceAuthorizationPending: + // noop + default: // everything else is "fatal" to us + return nil, err + } + + if waitDuration > (intervalDuration * 3) { + return nil, fmt.Errorf("%s Error waiting for user to complete device flow. Server told us to slow_down too much", logPrefix) + } + + time.Sleep(waitDuration) + } +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/persist.go b/vendor/github.com/Azure/go-autorest/autorest/adal/persist.go new file mode 100644 index 00000000..9e15f275 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/persist.go @@ -0,0 +1,73 @@ +package adal + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "path/filepath" +) + +// LoadToken restores a Token object from a file located at 'path'. +func LoadToken(path string) (*Token, error) { + file, err := os.Open(path) + if err != nil { + return nil, fmt.Errorf("failed to open file (%s) while loading token: %v", path, err) + } + defer file.Close() + + var token Token + + dec := json.NewDecoder(file) + if err = dec.Decode(&token); err != nil { + return nil, fmt.Errorf("failed to decode contents of file (%s) into Token representation: %v", path, err) + } + return &token, nil +} + +// SaveToken persists an oauth token at the given location on disk. +// It moves the new file into place so it can safely be used to replace an existing file +// that maybe accessed by multiple processes. +func SaveToken(path string, mode os.FileMode, token Token) error { + dir := filepath.Dir(path) + err := os.MkdirAll(dir, os.ModePerm) + if err != nil { + return fmt.Errorf("failed to create directory (%s) to store token in: %v", dir, err) + } + + newFile, err := ioutil.TempFile(dir, "token") + if err != nil { + return fmt.Errorf("failed to create the temp file to write the token: %v", err) + } + tempPath := newFile.Name() + + if err := json.NewEncoder(newFile).Encode(token); err != nil { + return fmt.Errorf("failed to encode token to file (%s) while saving token: %v", tempPath, err) + } + if err := newFile.Close(); err != nil { + return fmt.Errorf("failed to close temp file %s: %v", tempPath, err) + } + + // Atomic replace to avoid multi-writer file corruptions + if err := os.Rename(tempPath, path); err != nil { + return fmt.Errorf("failed to move temporary token to desired output location. src=%s dst=%s: %v", tempPath, path, err) + } + if err := os.Chmod(path, mode); err != nil { + return fmt.Errorf("failed to chmod the token file %s: %v", path, err) + } + return nil +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/sender.go b/vendor/github.com/Azure/go-autorest/autorest/adal/sender.go new file mode 100644 index 00000000..834401e0 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/sender.go @@ -0,0 +1,60 @@ +package adal + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "net/http" +) + +const ( + contentType = "Content-Type" + mimeTypeFormPost = "application/x-www-form-urlencoded" +) + +// Sender is the interface that wraps the Do method to send HTTP requests. +// +// The standard http.Client conforms to this interface. +type Sender interface { + Do(*http.Request) (*http.Response, error) +} + +// SenderFunc is a method that implements the Sender interface. +type SenderFunc func(*http.Request) (*http.Response, error) + +// Do implements the Sender interface on SenderFunc. +func (sf SenderFunc) Do(r *http.Request) (*http.Response, error) { + return sf(r) +} + +// SendDecorator takes and possibly decorates, by wrapping, a Sender. Decorators may affect the +// http.Request and pass it along or, first, pass the http.Request along then react to the +// http.Response result. +type SendDecorator func(Sender) Sender + +// CreateSender creates, decorates, and returns, as a Sender, the default http.Client. +func CreateSender(decorators ...SendDecorator) Sender { + return DecorateSender(&http.Client{}, decorators...) +} + +// DecorateSender accepts a Sender and a, possibly empty, set of SendDecorators, which is applies to +// the Sender. Decorators are applied in the order received, but their affect upon the request +// depends on whether they are a pre-decorator (change the http.Request and then pass it along) or a +// post-decorator (pass the http.Request along and react to the results in http.Response). +func DecorateSender(s Sender, decorators ...SendDecorator) Sender { + for _, decorate := range decorators { + s = decorate(s) + } + return s +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go new file mode 100644 index 00000000..2fd340d6 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go @@ -0,0 +1,980 @@ +package adal + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "context" + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "crypto/x509" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "math" + "net" + "net/http" + "net/url" + "strings" + "sync" + "time" + + "github.com/Azure/go-autorest/autorest/date" + "github.com/Azure/go-autorest/version" + "github.com/dgrijalva/jwt-go" +) + +const ( + defaultRefresh = 5 * time.Minute + + // OAuthGrantTypeDeviceCode is the "grant_type" identifier used in device flow + OAuthGrantTypeDeviceCode = "device_code" + + // OAuthGrantTypeClientCredentials is the "grant_type" identifier used in credential flows + OAuthGrantTypeClientCredentials = "client_credentials" + + // OAuthGrantTypeUserPass is the "grant_type" identifier used in username and password auth flows + OAuthGrantTypeUserPass = "password" + + // OAuthGrantTypeRefreshToken is the "grant_type" identifier used in refresh token flows + OAuthGrantTypeRefreshToken = "refresh_token" + + // OAuthGrantTypeAuthorizationCode is the "grant_type" identifier used in authorization code flows + OAuthGrantTypeAuthorizationCode = "authorization_code" + + // metadataHeader is the header required by MSI extension + metadataHeader = "Metadata" + + // msiEndpoint is the well known endpoint for getting MSI authentications tokens + msiEndpoint = "http://169.254.169.254/metadata/identity/oauth2/token" + + // the default number of attempts to refresh an MSI authentication token + defaultMaxMSIRefreshAttempts = 5 +) + +// OAuthTokenProvider is an interface which should be implemented by an access token retriever +type OAuthTokenProvider interface { + OAuthToken() string +} + +// TokenRefreshError is an interface used by errors returned during token refresh. +type TokenRefreshError interface { + error + Response() *http.Response +} + +// Refresher is an interface for token refresh functionality +type Refresher interface { + Refresh() error + RefreshExchange(resource string) error + EnsureFresh() error +} + +// RefresherWithContext is an interface for token refresh functionality +type RefresherWithContext interface { + RefreshWithContext(ctx context.Context) error + RefreshExchangeWithContext(ctx context.Context, resource string) error + EnsureFreshWithContext(ctx context.Context) error +} + +// TokenRefreshCallback is the type representing callbacks that will be called after +// a successful token refresh +type TokenRefreshCallback func(Token) error + +// Token encapsulates the access token used to authorize Azure requests. +// https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow#service-to-service-access-token-response +type Token struct { + AccessToken string `json:"access_token"` + RefreshToken string `json:"refresh_token"` + + ExpiresIn json.Number `json:"expires_in"` + ExpiresOn json.Number `json:"expires_on"` + NotBefore json.Number `json:"not_before"` + + Resource string `json:"resource"` + Type string `json:"token_type"` +} + +func newToken() Token { + return Token{ + ExpiresIn: "0", + ExpiresOn: "0", + NotBefore: "0", + } +} + +// IsZero returns true if the token object is zero-initialized. +func (t Token) IsZero() bool { + return t == Token{} +} + +// Expires returns the time.Time when the Token expires. +func (t Token) Expires() time.Time { + s, err := t.ExpiresOn.Float64() + if err != nil { + s = -3600 + } + + expiration := date.NewUnixTimeFromSeconds(s) + + return time.Time(expiration).UTC() +} + +// IsExpired returns true if the Token is expired, false otherwise. +func (t Token) IsExpired() bool { + return t.WillExpireIn(0) +} + +// WillExpireIn returns true if the Token will expire after the passed time.Duration interval +// from now, false otherwise. +func (t Token) WillExpireIn(d time.Duration) bool { + return !t.Expires().After(time.Now().Add(d)) +} + +//OAuthToken return the current access token +func (t *Token) OAuthToken() string { + return t.AccessToken +} + +// ServicePrincipalSecret is an interface that allows various secret mechanism to fill the form +// that is submitted when acquiring an oAuth token. +type ServicePrincipalSecret interface { + SetAuthenticationValues(spt *ServicePrincipalToken, values *url.Values) error +} + +// ServicePrincipalNoSecret represents a secret type that contains no secret +// meaning it is not valid for fetching a fresh token. This is used by Manual +type ServicePrincipalNoSecret struct { +} + +// SetAuthenticationValues is a method of the interface ServicePrincipalSecret +// It only returns an error for the ServicePrincipalNoSecret type +func (noSecret *ServicePrincipalNoSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error { + return fmt.Errorf("Manually created ServicePrincipalToken does not contain secret material to retrieve a new access token") +} + +// MarshalJSON implements the json.Marshaler interface. +func (noSecret ServicePrincipalNoSecret) MarshalJSON() ([]byte, error) { + type tokenType struct { + Type string `json:"type"` + } + return json.Marshal(tokenType{ + Type: "ServicePrincipalNoSecret", + }) +} + +// ServicePrincipalTokenSecret implements ServicePrincipalSecret for client_secret type authorization. +type ServicePrincipalTokenSecret struct { + ClientSecret string `json:"value"` +} + +// SetAuthenticationValues is a method of the interface ServicePrincipalSecret. +// It will populate the form submitted during oAuth Token Acquisition using the client_secret. +func (tokenSecret *ServicePrincipalTokenSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error { + v.Set("client_secret", tokenSecret.ClientSecret) + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (tokenSecret ServicePrincipalTokenSecret) MarshalJSON() ([]byte, error) { + type tokenType struct { + Type string `json:"type"` + Value string `json:"value"` + } + return json.Marshal(tokenType{ + Type: "ServicePrincipalTokenSecret", + Value: tokenSecret.ClientSecret, + }) +} + +// ServicePrincipalCertificateSecret implements ServicePrincipalSecret for generic RSA cert auth with signed JWTs. +type ServicePrincipalCertificateSecret struct { + Certificate *x509.Certificate + PrivateKey *rsa.PrivateKey +} + +// SignJwt returns the JWT signed with the certificate's private key. +func (secret *ServicePrincipalCertificateSecret) SignJwt(spt *ServicePrincipalToken) (string, error) { + hasher := sha1.New() + _, err := hasher.Write(secret.Certificate.Raw) + if err != nil { + return "", err + } + + thumbprint := base64.URLEncoding.EncodeToString(hasher.Sum(nil)) + + // The jti (JWT ID) claim provides a unique identifier for the JWT. + jti := make([]byte, 20) + _, err = rand.Read(jti) + if err != nil { + return "", err + } + + token := jwt.New(jwt.SigningMethodRS256) + token.Header["x5t"] = thumbprint + x5c := []string{base64.StdEncoding.EncodeToString(secret.Certificate.Raw)} + token.Header["x5c"] = x5c + token.Claims = jwt.MapClaims{ + "aud": spt.inner.OauthConfig.TokenEndpoint.String(), + "iss": spt.inner.ClientID, + "sub": spt.inner.ClientID, + "jti": base64.URLEncoding.EncodeToString(jti), + "nbf": time.Now().Unix(), + "exp": time.Now().Add(time.Hour * 24).Unix(), + } + + signedString, err := token.SignedString(secret.PrivateKey) + return signedString, err +} + +// SetAuthenticationValues is a method of the interface ServicePrincipalSecret. +// It will populate the form submitted during oAuth Token Acquisition using a JWT signed with a certificate. +func (secret *ServicePrincipalCertificateSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error { + jwt, err := secret.SignJwt(spt) + if err != nil { + return err + } + + v.Set("client_assertion", jwt) + v.Set("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer") + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (secret ServicePrincipalCertificateSecret) MarshalJSON() ([]byte, error) { + return nil, errors.New("marshalling ServicePrincipalCertificateSecret is not supported") +} + +// ServicePrincipalMSISecret implements ServicePrincipalSecret for machines running the MSI Extension. +type ServicePrincipalMSISecret struct { +} + +// SetAuthenticationValues is a method of the interface ServicePrincipalSecret. +func (msiSecret *ServicePrincipalMSISecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error { + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (msiSecret ServicePrincipalMSISecret) MarshalJSON() ([]byte, error) { + return nil, errors.New("marshalling ServicePrincipalMSISecret is not supported") +} + +// ServicePrincipalUsernamePasswordSecret implements ServicePrincipalSecret for username and password auth. +type ServicePrincipalUsernamePasswordSecret struct { + Username string `json:"username"` + Password string `json:"password"` +} + +// SetAuthenticationValues is a method of the interface ServicePrincipalSecret. +func (secret *ServicePrincipalUsernamePasswordSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error { + v.Set("username", secret.Username) + v.Set("password", secret.Password) + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (secret ServicePrincipalUsernamePasswordSecret) MarshalJSON() ([]byte, error) { + type tokenType struct { + Type string `json:"type"` + Username string `json:"username"` + Password string `json:"password"` + } + return json.Marshal(tokenType{ + Type: "ServicePrincipalUsernamePasswordSecret", + Username: secret.Username, + Password: secret.Password, + }) +} + +// ServicePrincipalAuthorizationCodeSecret implements ServicePrincipalSecret for authorization code auth. +type ServicePrincipalAuthorizationCodeSecret struct { + ClientSecret string `json:"value"` + AuthorizationCode string `json:"authCode"` + RedirectURI string `json:"redirect"` +} + +// SetAuthenticationValues is a method of the interface ServicePrincipalSecret. +func (secret *ServicePrincipalAuthorizationCodeSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error { + v.Set("code", secret.AuthorizationCode) + v.Set("client_secret", secret.ClientSecret) + v.Set("redirect_uri", secret.RedirectURI) + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (secret ServicePrincipalAuthorizationCodeSecret) MarshalJSON() ([]byte, error) { + type tokenType struct { + Type string `json:"type"` + Value string `json:"value"` + AuthCode string `json:"authCode"` + Redirect string `json:"redirect"` + } + return json.Marshal(tokenType{ + Type: "ServicePrincipalAuthorizationCodeSecret", + Value: secret.ClientSecret, + AuthCode: secret.AuthorizationCode, + Redirect: secret.RedirectURI, + }) +} + +// ServicePrincipalToken encapsulates a Token created for a Service Principal. +type ServicePrincipalToken struct { + inner servicePrincipalToken + refreshLock *sync.RWMutex + sender Sender + refreshCallbacks []TokenRefreshCallback + // MaxMSIRefreshAttempts is the maximum number of attempts to refresh an MSI token. + MaxMSIRefreshAttempts int +} + +// MarshalTokenJSON returns the marshalled inner token. +func (spt ServicePrincipalToken) MarshalTokenJSON() ([]byte, error) { + return json.Marshal(spt.inner.Token) +} + +// SetRefreshCallbacks replaces any existing refresh callbacks with the specified callbacks. +func (spt *ServicePrincipalToken) SetRefreshCallbacks(callbacks []TokenRefreshCallback) { + spt.refreshCallbacks = callbacks +} + +// MarshalJSON implements the json.Marshaler interface. +func (spt ServicePrincipalToken) MarshalJSON() ([]byte, error) { + return json.Marshal(spt.inner) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (spt *ServicePrincipalToken) UnmarshalJSON(data []byte) error { + // need to determine the token type + raw := map[string]interface{}{} + err := json.Unmarshal(data, &raw) + if err != nil { + return err + } + secret := raw["secret"].(map[string]interface{}) + switch secret["type"] { + case "ServicePrincipalNoSecret": + spt.inner.Secret = &ServicePrincipalNoSecret{} + case "ServicePrincipalTokenSecret": + spt.inner.Secret = &ServicePrincipalTokenSecret{} + case "ServicePrincipalCertificateSecret": + return errors.New("unmarshalling ServicePrincipalCertificateSecret is not supported") + case "ServicePrincipalMSISecret": + return errors.New("unmarshalling ServicePrincipalMSISecret is not supported") + case "ServicePrincipalUsernamePasswordSecret": + spt.inner.Secret = &ServicePrincipalUsernamePasswordSecret{} + case "ServicePrincipalAuthorizationCodeSecret": + spt.inner.Secret = &ServicePrincipalAuthorizationCodeSecret{} + default: + return fmt.Errorf("unrecognized token type '%s'", secret["type"]) + } + err = json.Unmarshal(data, &spt.inner) + if err != nil { + return err + } + spt.refreshLock = &sync.RWMutex{} + spt.sender = &http.Client{} + return nil +} + +// internal type used for marshalling/unmarshalling +type servicePrincipalToken struct { + Token Token `json:"token"` + Secret ServicePrincipalSecret `json:"secret"` + OauthConfig OAuthConfig `json:"oauth"` + ClientID string `json:"clientID"` + Resource string `json:"resource"` + AutoRefresh bool `json:"autoRefresh"` + RefreshWithin time.Duration `json:"refreshWithin"` +} + +func validateOAuthConfig(oac OAuthConfig) error { + if oac.IsZero() { + return fmt.Errorf("parameter 'oauthConfig' cannot be zero-initialized") + } + return nil +} + +// NewServicePrincipalTokenWithSecret create a ServicePrincipalToken using the supplied ServicePrincipalSecret implementation. +func NewServicePrincipalTokenWithSecret(oauthConfig OAuthConfig, id string, resource string, secret ServicePrincipalSecret, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + if err := validateOAuthConfig(oauthConfig); err != nil { + return nil, err + } + if err := validateStringParam(id, "id"); err != nil { + return nil, err + } + if err := validateStringParam(resource, "resource"); err != nil { + return nil, err + } + if secret == nil { + return nil, fmt.Errorf("parameter 'secret' cannot be nil") + } + spt := &ServicePrincipalToken{ + inner: servicePrincipalToken{ + Token: newToken(), + OauthConfig: oauthConfig, + Secret: secret, + ClientID: id, + Resource: resource, + AutoRefresh: true, + RefreshWithin: defaultRefresh, + }, + refreshLock: &sync.RWMutex{}, + sender: &http.Client{}, + refreshCallbacks: callbacks, + } + return spt, nil +} + +// NewServicePrincipalTokenFromManualToken creates a ServicePrincipalToken using the supplied token +func NewServicePrincipalTokenFromManualToken(oauthConfig OAuthConfig, clientID string, resource string, token Token, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + if err := validateOAuthConfig(oauthConfig); err != nil { + return nil, err + } + if err := validateStringParam(clientID, "clientID"); err != nil { + return nil, err + } + if err := validateStringParam(resource, "resource"); err != nil { + return nil, err + } + if token.IsZero() { + return nil, fmt.Errorf("parameter 'token' cannot be zero-initialized") + } + spt, err := NewServicePrincipalTokenWithSecret( + oauthConfig, + clientID, + resource, + &ServicePrincipalNoSecret{}, + callbacks...) + if err != nil { + return nil, err + } + + spt.inner.Token = token + + return spt, nil +} + +// NewServicePrincipalTokenFromManualTokenSecret creates a ServicePrincipalToken using the supplied token and secret +func NewServicePrincipalTokenFromManualTokenSecret(oauthConfig OAuthConfig, clientID string, resource string, token Token, secret ServicePrincipalSecret, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + if err := validateOAuthConfig(oauthConfig); err != nil { + return nil, err + } + if err := validateStringParam(clientID, "clientID"); err != nil { + return nil, err + } + if err := validateStringParam(resource, "resource"); err != nil { + return nil, err + } + if secret == nil { + return nil, fmt.Errorf("parameter 'secret' cannot be nil") + } + if token.IsZero() { + return nil, fmt.Errorf("parameter 'token' cannot be zero-initialized") + } + spt, err := NewServicePrincipalTokenWithSecret( + oauthConfig, + clientID, + resource, + secret, + callbacks...) + if err != nil { + return nil, err + } + + spt.inner.Token = token + + return spt, nil +} + +// NewServicePrincipalToken creates a ServicePrincipalToken from the supplied Service Principal +// credentials scoped to the named resource. +func NewServicePrincipalToken(oauthConfig OAuthConfig, clientID string, secret string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + if err := validateOAuthConfig(oauthConfig); err != nil { + return nil, err + } + if err := validateStringParam(clientID, "clientID"); err != nil { + return nil, err + } + if err := validateStringParam(secret, "secret"); err != nil { + return nil, err + } + if err := validateStringParam(resource, "resource"); err != nil { + return nil, err + } + return NewServicePrincipalTokenWithSecret( + oauthConfig, + clientID, + resource, + &ServicePrincipalTokenSecret{ + ClientSecret: secret, + }, + callbacks..., + ) +} + +// NewServicePrincipalTokenFromCertificate creates a ServicePrincipalToken from the supplied pkcs12 bytes. +func NewServicePrincipalTokenFromCertificate(oauthConfig OAuthConfig, clientID string, certificate *x509.Certificate, privateKey *rsa.PrivateKey, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + if err := validateOAuthConfig(oauthConfig); err != nil { + return nil, err + } + if err := validateStringParam(clientID, "clientID"); err != nil { + return nil, err + } + if err := validateStringParam(resource, "resource"); err != nil { + return nil, err + } + if certificate == nil { + return nil, fmt.Errorf("parameter 'certificate' cannot be nil") + } + if privateKey == nil { + return nil, fmt.Errorf("parameter 'privateKey' cannot be nil") + } + return NewServicePrincipalTokenWithSecret( + oauthConfig, + clientID, + resource, + &ServicePrincipalCertificateSecret{ + PrivateKey: privateKey, + Certificate: certificate, + }, + callbacks..., + ) +} + +// NewServicePrincipalTokenFromUsernamePassword creates a ServicePrincipalToken from the username and password. +func NewServicePrincipalTokenFromUsernamePassword(oauthConfig OAuthConfig, clientID string, username string, password string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + if err := validateOAuthConfig(oauthConfig); err != nil { + return nil, err + } + if err := validateStringParam(clientID, "clientID"); err != nil { + return nil, err + } + if err := validateStringParam(username, "username"); err != nil { + return nil, err + } + if err := validateStringParam(password, "password"); err != nil { + return nil, err + } + if err := validateStringParam(resource, "resource"); err != nil { + return nil, err + } + return NewServicePrincipalTokenWithSecret( + oauthConfig, + clientID, + resource, + &ServicePrincipalUsernamePasswordSecret{ + Username: username, + Password: password, + }, + callbacks..., + ) +} + +// NewServicePrincipalTokenFromAuthorizationCode creates a ServicePrincipalToken from the +func NewServicePrincipalTokenFromAuthorizationCode(oauthConfig OAuthConfig, clientID string, clientSecret string, authorizationCode string, redirectURI string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + + if err := validateOAuthConfig(oauthConfig); err != nil { + return nil, err + } + if err := validateStringParam(clientID, "clientID"); err != nil { + return nil, err + } + if err := validateStringParam(clientSecret, "clientSecret"); err != nil { + return nil, err + } + if err := validateStringParam(authorizationCode, "authorizationCode"); err != nil { + return nil, err + } + if err := validateStringParam(redirectURI, "redirectURI"); err != nil { + return nil, err + } + if err := validateStringParam(resource, "resource"); err != nil { + return nil, err + } + + return NewServicePrincipalTokenWithSecret( + oauthConfig, + clientID, + resource, + &ServicePrincipalAuthorizationCodeSecret{ + ClientSecret: clientSecret, + AuthorizationCode: authorizationCode, + RedirectURI: redirectURI, + }, + callbacks..., + ) +} + +// GetMSIVMEndpoint gets the MSI endpoint on Virtual Machines. +func GetMSIVMEndpoint() (string, error) { + return msiEndpoint, nil +} + +// NewServicePrincipalTokenFromMSI creates a ServicePrincipalToken via the MSI VM Extension. +// It will use the system assigned identity when creating the token. +func NewServicePrincipalTokenFromMSI(msiEndpoint, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + return newServicePrincipalTokenFromMSI(msiEndpoint, resource, nil, callbacks...) +} + +// NewServicePrincipalTokenFromMSIWithUserAssignedID creates a ServicePrincipalToken via the MSI VM Extension. +// It will use the specified user assigned identity when creating the token. +func NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, resource string, userAssignedID string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + return newServicePrincipalTokenFromMSI(msiEndpoint, resource, &userAssignedID, callbacks...) +} + +func newServicePrincipalTokenFromMSI(msiEndpoint, resource string, userAssignedID *string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) { + if err := validateStringParam(msiEndpoint, "msiEndpoint"); err != nil { + return nil, err + } + if err := validateStringParam(resource, "resource"); err != nil { + return nil, err + } + if userAssignedID != nil { + if err := validateStringParam(*userAssignedID, "userAssignedID"); err != nil { + return nil, err + } + } + // We set the oauth config token endpoint to be MSI's endpoint + msiEndpointURL, err := url.Parse(msiEndpoint) + if err != nil { + return nil, err + } + + v := url.Values{} + v.Set("resource", resource) + v.Set("api-version", "2018-02-01") + if userAssignedID != nil { + v.Set("client_id", *userAssignedID) + } + msiEndpointURL.RawQuery = v.Encode() + + spt := &ServicePrincipalToken{ + inner: servicePrincipalToken{ + Token: newToken(), + OauthConfig: OAuthConfig{ + TokenEndpoint: *msiEndpointURL, + }, + Secret: &ServicePrincipalMSISecret{}, + Resource: resource, + AutoRefresh: true, + RefreshWithin: defaultRefresh, + }, + refreshLock: &sync.RWMutex{}, + sender: &http.Client{}, + refreshCallbacks: callbacks, + MaxMSIRefreshAttempts: defaultMaxMSIRefreshAttempts, + } + + if userAssignedID != nil { + spt.inner.ClientID = *userAssignedID + } + + return spt, nil +} + +// internal type that implements TokenRefreshError +type tokenRefreshError struct { + message string + resp *http.Response +} + +// Error implements the error interface which is part of the TokenRefreshError interface. +func (tre tokenRefreshError) Error() string { + return tre.message +} + +// Response implements the TokenRefreshError interface, it returns the raw HTTP response from the refresh operation. +func (tre tokenRefreshError) Response() *http.Response { + return tre.resp +} + +func newTokenRefreshError(message string, resp *http.Response) TokenRefreshError { + return tokenRefreshError{message: message, resp: resp} +} + +// EnsureFresh will refresh the token if it will expire within the refresh window (as set by +// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use. +func (spt *ServicePrincipalToken) EnsureFresh() error { + return spt.EnsureFreshWithContext(context.Background()) +} + +// EnsureFreshWithContext will refresh the token if it will expire within the refresh window (as set by +// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use. +func (spt *ServicePrincipalToken) EnsureFreshWithContext(ctx context.Context) error { + if spt.inner.AutoRefresh && spt.inner.Token.WillExpireIn(spt.inner.RefreshWithin) { + // take the write lock then check to see if the token was already refreshed + spt.refreshLock.Lock() + defer spt.refreshLock.Unlock() + if spt.inner.Token.WillExpireIn(spt.inner.RefreshWithin) { + return spt.refreshInternal(ctx, spt.inner.Resource) + } + } + return nil +} + +// InvokeRefreshCallbacks calls any TokenRefreshCallbacks that were added to the SPT during initialization +func (spt *ServicePrincipalToken) InvokeRefreshCallbacks(token Token) error { + if spt.refreshCallbacks != nil { + for _, callback := range spt.refreshCallbacks { + err := callback(spt.inner.Token) + if err != nil { + return fmt.Errorf("adal: TokenRefreshCallback handler failed. Error = '%v'", err) + } + } + } + return nil +} + +// Refresh obtains a fresh token for the Service Principal. +// This method is not safe for concurrent use and should be syncrhonized. +func (spt *ServicePrincipalToken) Refresh() error { + return spt.RefreshWithContext(context.Background()) +} + +// RefreshWithContext obtains a fresh token for the Service Principal. +// This method is not safe for concurrent use and should be syncrhonized. +func (spt *ServicePrincipalToken) RefreshWithContext(ctx context.Context) error { + spt.refreshLock.Lock() + defer spt.refreshLock.Unlock() + return spt.refreshInternal(ctx, spt.inner.Resource) +} + +// RefreshExchange refreshes the token, but for a different resource. +// This method is not safe for concurrent use and should be syncrhonized. +func (spt *ServicePrincipalToken) RefreshExchange(resource string) error { + return spt.RefreshExchangeWithContext(context.Background(), resource) +} + +// RefreshExchangeWithContext refreshes the token, but for a different resource. +// This method is not safe for concurrent use and should be syncrhonized. +func (spt *ServicePrincipalToken) RefreshExchangeWithContext(ctx context.Context, resource string) error { + spt.refreshLock.Lock() + defer spt.refreshLock.Unlock() + return spt.refreshInternal(ctx, resource) +} + +func (spt *ServicePrincipalToken) getGrantType() string { + switch spt.inner.Secret.(type) { + case *ServicePrincipalUsernamePasswordSecret: + return OAuthGrantTypeUserPass + case *ServicePrincipalAuthorizationCodeSecret: + return OAuthGrantTypeAuthorizationCode + default: + return OAuthGrantTypeClientCredentials + } +} + +func isIMDS(u url.URL) bool { + imds, err := url.Parse(msiEndpoint) + if err != nil { + return false + } + return u.Host == imds.Host && u.Path == imds.Path +} + +func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource string) error { + req, err := http.NewRequest(http.MethodPost, spt.inner.OauthConfig.TokenEndpoint.String(), nil) + if err != nil { + return fmt.Errorf("adal: Failed to build the refresh request. Error = '%v'", err) + } + req.Header.Add("User-Agent", version.UserAgent()) + req = req.WithContext(ctx) + if !isIMDS(spt.inner.OauthConfig.TokenEndpoint) { + v := url.Values{} + v.Set("client_id", spt.inner.ClientID) + v.Set("resource", resource) + + if spt.inner.Token.RefreshToken != "" { + v.Set("grant_type", OAuthGrantTypeRefreshToken) + v.Set("refresh_token", spt.inner.Token.RefreshToken) + // web apps must specify client_secret when refreshing tokens + // see https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-code#refreshing-the-access-tokens + if spt.getGrantType() == OAuthGrantTypeAuthorizationCode { + err := spt.inner.Secret.SetAuthenticationValues(spt, &v) + if err != nil { + return err + } + } + } else { + v.Set("grant_type", spt.getGrantType()) + err := spt.inner.Secret.SetAuthenticationValues(spt, &v) + if err != nil { + return err + } + } + + s := v.Encode() + body := ioutil.NopCloser(strings.NewReader(s)) + req.ContentLength = int64(len(s)) + req.Header.Set(contentType, mimeTypeFormPost) + req.Body = body + } + + if _, ok := spt.inner.Secret.(*ServicePrincipalMSISecret); ok { + req.Method = http.MethodGet + req.Header.Set(metadataHeader, "true") + } + + var resp *http.Response + if isIMDS(spt.inner.OauthConfig.TokenEndpoint) { + resp, err = retryForIMDS(spt.sender, req, spt.MaxMSIRefreshAttempts) + } else { + resp, err = spt.sender.Do(req) + } + if err != nil { + return newTokenRefreshError(fmt.Sprintf("adal: Failed to execute the refresh request. Error = '%v'", err), nil) + } + + defer resp.Body.Close() + rb, err := ioutil.ReadAll(resp.Body) + + if resp.StatusCode != http.StatusOK { + if err != nil { + return newTokenRefreshError(fmt.Sprintf("adal: Refresh request failed. Status Code = '%d'. Failed reading response body: %v", resp.StatusCode, err), resp) + } + return newTokenRefreshError(fmt.Sprintf("adal: Refresh request failed. Status Code = '%d'. Response body: %s", resp.StatusCode, string(rb)), resp) + } + + // for the following error cases don't return a TokenRefreshError. the operation succeeded + // but some transient failure happened during deserialization. by returning a generic error + // the retry logic will kick in (we don't retry on TokenRefreshError). + + if err != nil { + return fmt.Errorf("adal: Failed to read a new service principal token during refresh. Error = '%v'", err) + } + if len(strings.Trim(string(rb), " ")) == 0 { + return fmt.Errorf("adal: Empty service principal token received during refresh") + } + var token Token + err = json.Unmarshal(rb, &token) + if err != nil { + return fmt.Errorf("adal: Failed to unmarshal the service principal token during refresh. Error = '%v' JSON = '%s'", err, string(rb)) + } + + spt.inner.Token = token + + return spt.InvokeRefreshCallbacks(token) +} + +// retry logic specific to retrieving a token from the IMDS endpoint +func retryForIMDS(sender Sender, req *http.Request, maxAttempts int) (resp *http.Response, err error) { + // copied from client.go due to circular dependency + retries := []int{ + http.StatusRequestTimeout, // 408 + http.StatusTooManyRequests, // 429 + http.StatusInternalServerError, // 500 + http.StatusBadGateway, // 502 + http.StatusServiceUnavailable, // 503 + http.StatusGatewayTimeout, // 504 + } + // extra retry status codes specific to IMDS + retries = append(retries, + http.StatusNotFound, + http.StatusGone, + // all remaining 5xx + http.StatusNotImplemented, + http.StatusHTTPVersionNotSupported, + http.StatusVariantAlsoNegotiates, + http.StatusInsufficientStorage, + http.StatusLoopDetected, + http.StatusNotExtended, + http.StatusNetworkAuthenticationRequired) + + // see https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/how-to-use-vm-token#retry-guidance + + const maxDelay time.Duration = 60 * time.Second + + attempt := 0 + delay := time.Duration(0) + + for attempt < maxAttempts { + resp, err = sender.Do(req) + // retry on temporary network errors, e.g. transient network failures. + // if we don't receive a response then assume we can't connect to the + // endpoint so we're likely not running on an Azure VM so don't retry. + if (err != nil && !isTemporaryNetworkError(err)) || resp == nil || resp.StatusCode == http.StatusOK || !containsInt(retries, resp.StatusCode) { + return + } + + // perform exponential backoff with a cap. + // must increment attempt before calculating delay. + attempt++ + // the base value of 2 is the "delta backoff" as specified in the guidance doc + delay += (time.Duration(math.Pow(2, float64(attempt))) * time.Second) + if delay > maxDelay { + delay = maxDelay + } + + select { + case <-time.After(delay): + // intentionally left blank + case <-req.Context().Done(): + err = req.Context().Err() + return + } + } + return +} + +// returns true if the specified error is a temporary network error or false if it's not. +// if the error doesn't implement the net.Error interface the return value is true. +func isTemporaryNetworkError(err error) bool { + if netErr, ok := err.(net.Error); !ok || (ok && netErr.Temporary()) { + return true + } + return false +} + +// returns true if slice ints contains the value n +func containsInt(ints []int, n int) bool { + for _, i := range ints { + if i == n { + return true + } + } + return false +} + +// SetAutoRefresh enables or disables automatic refreshing of stale tokens. +func (spt *ServicePrincipalToken) SetAutoRefresh(autoRefresh bool) { + spt.inner.AutoRefresh = autoRefresh +} + +// SetRefreshWithin sets the interval within which if the token will expire, EnsureFresh will +// refresh the token. +func (spt *ServicePrincipalToken) SetRefreshWithin(d time.Duration) { + spt.inner.RefreshWithin = d + return +} + +// SetSender sets the http.Client used when obtaining the Service Principal token. An +// undecorated http.Client is used by default. +func (spt *ServicePrincipalToken) SetSender(s Sender) { spt.sender = s } + +// OAuthToken implements the OAuthTokenProvider interface. It returns the current access token. +func (spt *ServicePrincipalToken) OAuthToken() string { + spt.refreshLock.RLock() + defer spt.refreshLock.RUnlock() + return spt.inner.Token.OAuthToken() +} + +// Token returns a copy of the current token. +func (spt *ServicePrincipalToken) Token() Token { + spt.refreshLock.RLock() + defer spt.refreshLock.RUnlock() + return spt.inner.Token +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/authorization.go b/vendor/github.com/Azure/go-autorest/autorest/authorization.go new file mode 100644 index 00000000..77eff45b --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/authorization.go @@ -0,0 +1,259 @@ +package autorest + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "fmt" + "net/http" + "net/url" + "strings" + + "github.com/Azure/go-autorest/autorest/adal" +) + +const ( + bearerChallengeHeader = "Www-Authenticate" + bearer = "Bearer" + tenantID = "tenantID" + apiKeyAuthorizerHeader = "Ocp-Apim-Subscription-Key" + bingAPISdkHeader = "X-BingApis-SDK-Client" + golangBingAPISdkHeaderValue = "Go-SDK" +) + +// Authorizer is the interface that provides a PrepareDecorator used to supply request +// authorization. Most often, the Authorizer decorator runs last so it has access to the full +// state of the formed HTTP request. +type Authorizer interface { + WithAuthorization() PrepareDecorator +} + +// NullAuthorizer implements a default, "do nothing" Authorizer. +type NullAuthorizer struct{} + +// WithAuthorization returns a PrepareDecorator that does nothing. +func (na NullAuthorizer) WithAuthorization() PrepareDecorator { + return WithNothing() +} + +// APIKeyAuthorizer implements API Key authorization. +type APIKeyAuthorizer struct { + headers map[string]interface{} + queryParameters map[string]interface{} +} + +// NewAPIKeyAuthorizerWithHeaders creates an ApiKeyAuthorizer with headers. +func NewAPIKeyAuthorizerWithHeaders(headers map[string]interface{}) *APIKeyAuthorizer { + return NewAPIKeyAuthorizer(headers, nil) +} + +// NewAPIKeyAuthorizerWithQueryParameters creates an ApiKeyAuthorizer with query parameters. +func NewAPIKeyAuthorizerWithQueryParameters(queryParameters map[string]interface{}) *APIKeyAuthorizer { + return NewAPIKeyAuthorizer(nil, queryParameters) +} + +// NewAPIKeyAuthorizer creates an ApiKeyAuthorizer with headers. +func NewAPIKeyAuthorizer(headers map[string]interface{}, queryParameters map[string]interface{}) *APIKeyAuthorizer { + return &APIKeyAuthorizer{headers: headers, queryParameters: queryParameters} +} + +// WithAuthorization returns a PrepareDecorator that adds an HTTP headers and Query Paramaters +func (aka *APIKeyAuthorizer) WithAuthorization() PrepareDecorator { + return func(p Preparer) Preparer { + return DecoratePreparer(p, WithHeaders(aka.headers), WithQueryParameters(aka.queryParameters)) + } +} + +// CognitiveServicesAuthorizer implements authorization for Cognitive Services. +type CognitiveServicesAuthorizer struct { + subscriptionKey string +} + +// NewCognitiveServicesAuthorizer is +func NewCognitiveServicesAuthorizer(subscriptionKey string) *CognitiveServicesAuthorizer { + return &CognitiveServicesAuthorizer{subscriptionKey: subscriptionKey} +} + +// WithAuthorization is +func (csa *CognitiveServicesAuthorizer) WithAuthorization() PrepareDecorator { + headers := make(map[string]interface{}) + headers[apiKeyAuthorizerHeader] = csa.subscriptionKey + headers[bingAPISdkHeader] = golangBingAPISdkHeaderValue + + return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization() +} + +// BearerAuthorizer implements the bearer authorization +type BearerAuthorizer struct { + tokenProvider adal.OAuthTokenProvider +} + +// NewBearerAuthorizer crates a BearerAuthorizer using the given token provider +func NewBearerAuthorizer(tp adal.OAuthTokenProvider) *BearerAuthorizer { + return &BearerAuthorizer{tokenProvider: tp} +} + +// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose +// value is "Bearer " followed by the token. +// +// By default, the token will be automatically refreshed through the Refresher interface. +func (ba *BearerAuthorizer) WithAuthorization() PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + // the ordering is important here, prefer RefresherWithContext if available + if refresher, ok := ba.tokenProvider.(adal.RefresherWithContext); ok { + err = refresher.EnsureFreshWithContext(r.Context()) + } else if refresher, ok := ba.tokenProvider.(adal.Refresher); ok { + err = refresher.EnsureFresh() + } + if err != nil { + var resp *http.Response + if tokError, ok := err.(adal.TokenRefreshError); ok { + resp = tokError.Response() + } + return r, NewErrorWithError(err, "azure.BearerAuthorizer", "WithAuthorization", resp, + "Failed to refresh the Token for request to %s", r.URL) + } + return Prepare(r, WithHeader(headerAuthorization, fmt.Sprintf("Bearer %s", ba.tokenProvider.OAuthToken()))) + } + return r, err + }) + } +} + +// BearerAuthorizerCallbackFunc is the authentication callback signature. +type BearerAuthorizerCallbackFunc func(tenantID, resource string) (*BearerAuthorizer, error) + +// BearerAuthorizerCallback implements bearer authorization via a callback. +type BearerAuthorizerCallback struct { + sender Sender + callback BearerAuthorizerCallbackFunc +} + +// NewBearerAuthorizerCallback creates a bearer authorization callback. The callback +// is invoked when the HTTP request is submitted. +func NewBearerAuthorizerCallback(sender Sender, callback BearerAuthorizerCallbackFunc) *BearerAuthorizerCallback { + if sender == nil { + sender = &http.Client{} + } + return &BearerAuthorizerCallback{sender: sender, callback: callback} +} + +// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose value +// is "Bearer " followed by the token. The BearerAuthorizer is obtained via a user-supplied callback. +// +// By default, the token will be automatically refreshed through the Refresher interface. +func (bacb *BearerAuthorizerCallback) WithAuthorization() PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + // make a copy of the request and remove the body as it's not + // required and avoids us having to create a copy of it. + rCopy := *r + removeRequestBody(&rCopy) + + resp, err := bacb.sender.Do(&rCopy) + if err == nil && resp.StatusCode == 401 { + defer resp.Body.Close() + if hasBearerChallenge(resp) { + bc, err := newBearerChallenge(resp) + if err != nil { + return r, err + } + if bacb.callback != nil { + ba, err := bacb.callback(bc.values[tenantID], bc.values["resource"]) + if err != nil { + return r, err + } + return Prepare(r, ba.WithAuthorization()) + } + } + } + } + return r, err + }) + } +} + +// returns true if the HTTP response contains a bearer challenge +func hasBearerChallenge(resp *http.Response) bool { + authHeader := resp.Header.Get(bearerChallengeHeader) + if len(authHeader) == 0 || strings.Index(authHeader, bearer) < 0 { + return false + } + return true +} + +type bearerChallenge struct { + values map[string]string +} + +func newBearerChallenge(resp *http.Response) (bc bearerChallenge, err error) { + challenge := strings.TrimSpace(resp.Header.Get(bearerChallengeHeader)) + trimmedChallenge := challenge[len(bearer)+1:] + + // challenge is a set of key=value pairs that are comma delimited + pairs := strings.Split(trimmedChallenge, ",") + if len(pairs) < 1 { + err = fmt.Errorf("challenge '%s' contains no pairs", challenge) + return bc, err + } + + bc.values = make(map[string]string) + for i := range pairs { + trimmedPair := strings.TrimSpace(pairs[i]) + pair := strings.Split(trimmedPair, "=") + if len(pair) == 2 { + // remove the enclosing quotes + key := strings.Trim(pair[0], "\"") + value := strings.Trim(pair[1], "\"") + + switch key { + case "authorization", "authorization_uri": + // strip the tenant ID from the authorization URL + asURL, err := url.Parse(value) + if err != nil { + return bc, err + } + bc.values[tenantID] = asURL.Path[1:] + default: + bc.values[key] = value + } + } + } + + return bc, err +} + +// EventGridKeyAuthorizer implements authorization for event grid using key authentication. +type EventGridKeyAuthorizer struct { + topicKey string +} + +// NewEventGridKeyAuthorizer creates a new EventGridKeyAuthorizer +// with the specified topic key. +func NewEventGridKeyAuthorizer(topicKey string) EventGridKeyAuthorizer { + return EventGridKeyAuthorizer{topicKey: topicKey} +} + +// WithAuthorization returns a PrepareDecorator that adds the aeg-sas-key authentication header. +func (egta EventGridKeyAuthorizer) WithAuthorization() PrepareDecorator { + headers := map[string]interface{}{ + "aeg-sas-key": egta.topicKey, + } + return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization() +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/autorest.go b/vendor/github.com/Azure/go-autorest/autorest/autorest.go new file mode 100644 index 00000000..aafdf021 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/autorest.go @@ -0,0 +1,150 @@ +/* +Package autorest implements an HTTP request pipeline suitable for use across multiple go-routines +and provides the shared routines relied on by AutoRest (see https://github.com/Azure/autorest/) +generated Go code. + +The package breaks sending and responding to HTTP requests into three phases: Preparing, Sending, +and Responding. A typical pattern is: + + req, err := Prepare(&http.Request{}, + token.WithAuthorization()) + + resp, err := Send(req, + WithLogging(logger), + DoErrorIfStatusCode(http.StatusInternalServerError), + DoCloseIfError(), + DoRetryForAttempts(5, time.Second)) + + err = Respond(resp, + ByDiscardingBody(), + ByClosing()) + +Each phase relies on decorators to modify and / or manage processing. Decorators may first modify +and then pass the data along, pass the data first and then modify the result, or wrap themselves +around passing the data (such as a logger might do). Decorators run in the order provided. For +example, the following: + + req, err := Prepare(&http.Request{}, + WithBaseURL("https://microsoft.com/"), + WithPath("a"), + WithPath("b"), + WithPath("c")) + +will set the URL to: + + https://microsoft.com/a/b/c + +Preparers and Responders may be shared and re-used (assuming the underlying decorators support +sharing and re-use). Performant use is obtained by creating one or more Preparers and Responders +shared among multiple go-routines, and a single Sender shared among multiple sending go-routines, +all bound together by means of input / output channels. + +Decorators hold their passed state within a closure (such as the path components in the example +above). Be careful to share Preparers and Responders only in a context where such held state +applies. For example, it may not make sense to share a Preparer that applies a query string from a +fixed set of values. Similarly, sharing a Responder that reads the response body into a passed +struct (e.g., ByUnmarshallingJson) is likely incorrect. + +Lastly, the Swagger specification (https://swagger.io) that drives AutoRest +(https://github.com/Azure/autorest/) precisely defines two date forms: date and date-time. The +github.com/Azure/go-autorest/autorest/date package provides time.Time derivations to ensure +correct parsing and formatting. + +Errors raised by autorest objects and methods will conform to the autorest.Error interface. + +See the included examples for more detail. For details on the suggested use of this package by +generated clients, see the Client described below. +*/ +package autorest + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "context" + "net/http" + "time" +) + +const ( + // HeaderLocation specifies the HTTP Location header. + HeaderLocation = "Location" + + // HeaderRetryAfter specifies the HTTP Retry-After header. + HeaderRetryAfter = "Retry-After" +) + +// ResponseHasStatusCode returns true if the status code in the HTTP Response is in the passed set +// and false otherwise. +func ResponseHasStatusCode(resp *http.Response, codes ...int) bool { + if resp == nil { + return false + } + return containsInt(codes, resp.StatusCode) +} + +// GetLocation retrieves the URL from the Location header of the passed response. +func GetLocation(resp *http.Response) string { + return resp.Header.Get(HeaderLocation) +} + +// GetRetryAfter extracts the retry delay from the Retry-After header of the passed response. If +// the header is absent or is malformed, it will return the supplied default delay time.Duration. +func GetRetryAfter(resp *http.Response, defaultDelay time.Duration) time.Duration { + retry := resp.Header.Get(HeaderRetryAfter) + if retry == "" { + return defaultDelay + } + + d, err := time.ParseDuration(retry + "s") + if err != nil { + return defaultDelay + } + + return d +} + +// NewPollingRequest allocates and returns a new http.Request to poll for the passed response. +func NewPollingRequest(resp *http.Response, cancel <-chan struct{}) (*http.Request, error) { + location := GetLocation(resp) + if location == "" { + return nil, NewErrorWithResponse("autorest", "NewPollingRequest", resp, "Location header missing from response that requires polling") + } + + req, err := Prepare(&http.Request{Cancel: cancel}, + AsGet(), + WithBaseURL(location)) + if err != nil { + return nil, NewErrorWithError(err, "autorest", "NewPollingRequest", nil, "Failure creating poll request to %s", location) + } + + return req, nil +} + +// NewPollingRequestWithContext allocates and returns a new http.Request with the specified context to poll for the passed response. +func NewPollingRequestWithContext(ctx context.Context, resp *http.Response) (*http.Request, error) { + location := GetLocation(resp) + if location == "" { + return nil, NewErrorWithResponse("autorest", "NewPollingRequestWithContext", resp, "Location header missing from response that requires polling") + } + + req, err := Prepare((&http.Request{}).WithContext(ctx), + AsGet(), + WithBaseURL(location)) + if err != nil { + return nil, NewErrorWithError(err, "autorest", "NewPollingRequestWithContext", nil, "Failure creating poll request to %s", location) + } + + return req, nil +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/async.go b/vendor/github.com/Azure/go-autorest/autorest/azure/async.go new file mode 100644 index 00000000..60679c1a --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/async.go @@ -0,0 +1,972 @@ +package azure + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "strings" + "time" + + "github.com/Azure/go-autorest/autorest" +) + +const ( + headerAsyncOperation = "Azure-AsyncOperation" +) + +const ( + operationInProgress string = "InProgress" + operationCanceled string = "Canceled" + operationFailed string = "Failed" + operationSucceeded string = "Succeeded" +) + +var pollingCodes = [...]int{http.StatusNoContent, http.StatusAccepted, http.StatusCreated, http.StatusOK} + +// Future provides a mechanism to access the status and results of an asynchronous request. +// Since futures are stateful they should be passed by value to avoid race conditions. +type Future struct { + req *http.Request // legacy + pt pollingTracker +} + +// NewFuture returns a new Future object initialized with the specified request. +// Deprecated: Please use NewFutureFromResponse instead. +func NewFuture(req *http.Request) Future { + return Future{req: req} +} + +// NewFutureFromResponse returns a new Future object initialized +// with the initial response from an asynchronous operation. +func NewFutureFromResponse(resp *http.Response) (Future, error) { + pt, err := createPollingTracker(resp) + return Future{pt: pt}, err +} + +// Response returns the last HTTP response. +func (f Future) Response() *http.Response { + if f.pt == nil { + return nil + } + return f.pt.latestResponse() +} + +// Status returns the last status message of the operation. +func (f Future) Status() string { + if f.pt == nil { + return "" + } + return f.pt.pollingStatus() +} + +// PollingMethod returns the method used to monitor the status of the asynchronous operation. +func (f Future) PollingMethod() PollingMethodType { + if f.pt == nil { + return PollingUnknown + } + return f.pt.pollingMethod() +} + +// Done queries the service to see if the operation has completed. +// Deprecated: Use DoneWithContext() +func (f *Future) Done(sender autorest.Sender) (bool, error) { + return f.DoneWithContext(context.Background(), sender) +} + +// DoneWithContext queries the service to see if the operation has completed. +func (f *Future) DoneWithContext(ctx context.Context, sender autorest.Sender) (done bool, err error) { + // support for legacy Future implementation + if f.req != nil { + resp, err := sender.Do(f.req) + if err != nil { + return false, err + } + pt, err := createPollingTracker(resp) + if err != nil { + return false, err + } + f.pt = pt + f.req = nil + } + // end legacy + if f.pt == nil { + return false, autorest.NewError("Future", "Done", "future is not initialized") + } + if f.pt.hasTerminated() { + return true, f.pt.pollingError() + } + if err := f.pt.pollForStatus(ctx, sender); err != nil { + return false, err + } + if err := f.pt.checkForErrors(); err != nil { + return f.pt.hasTerminated(), err + } + if err := f.pt.updatePollingState(f.pt.provisioningStateApplicable()); err != nil { + return false, err + } + if err := f.pt.initPollingMethod(); err != nil { + return false, err + } + if err := f.pt.updatePollingMethod(); err != nil { + return false, err + } + return f.pt.hasTerminated(), f.pt.pollingError() +} + +// GetPollingDelay returns a duration the application should wait before checking +// the status of the asynchronous request and true; this value is returned from +// the service via the Retry-After response header. If the header wasn't returned +// then the function returns the zero-value time.Duration and false. +func (f Future) GetPollingDelay() (time.Duration, bool) { + if f.pt == nil { + return 0, false + } + resp := f.pt.latestResponse() + if resp == nil { + return 0, false + } + + retry := resp.Header.Get(autorest.HeaderRetryAfter) + if retry == "" { + return 0, false + } + + d, err := time.ParseDuration(retry + "s") + if err != nil { + panic(err) + } + + return d, true +} + +// WaitForCompletion will return when one of the following conditions is met: the long +// running operation has completed, the provided context is cancelled, or the client's +// polling duration has been exceeded. It will retry failed polling attempts based on +// the retry value defined in the client up to the maximum retry attempts. +// Deprecated: Please use WaitForCompletionRef() instead. +func (f Future) WaitForCompletion(ctx context.Context, client autorest.Client) error { + return f.WaitForCompletionRef(ctx, client) +} + +// WaitForCompletionRef will return when one of the following conditions is met: the long +// running operation has completed, the provided context is cancelled, or the client's +// polling duration has been exceeded. It will retry failed polling attempts based on +// the retry value defined in the client up to the maximum retry attempts. +// If no deadline is specified in the context then the client.PollingDuration will be +// used to determine if a default deadline should be used. +// If PollingDuration is greater than zero the value will be used as the context's timeout. +// If PollingDuration is zero then no default deadline will be used. +func (f *Future) WaitForCompletionRef(ctx context.Context, client autorest.Client) (err error) { + cancelCtx := ctx + // if the provided context already has a deadline don't override it + _, hasDeadline := ctx.Deadline() + if d := client.PollingDuration; !hasDeadline && d != 0 { + var cancel context.CancelFunc + cancelCtx, cancel = context.WithTimeout(ctx, d) + defer cancel() + } + + done, err := f.DoneWithContext(ctx, client) + for attempts := 0; !done; done, err = f.DoneWithContext(ctx, client) { + if attempts >= client.RetryAttempts { + return autorest.NewErrorWithError(err, "Future", "WaitForCompletion", f.pt.latestResponse(), "the number of retries has been exceeded") + } + // we want delayAttempt to be zero in the non-error case so + // that DelayForBackoff doesn't perform exponential back-off + var delayAttempt int + var delay time.Duration + if err == nil { + // check for Retry-After delay, if not present use the client's polling delay + var ok bool + delay, ok = f.GetPollingDelay() + if !ok { + delay = client.PollingDelay + } + } else { + // there was an error polling for status so perform exponential + // back-off based on the number of attempts using the client's retry + // duration. update attempts after delayAttempt to avoid off-by-one. + delayAttempt = attempts + delay = client.RetryDuration + attempts++ + } + // wait until the delay elapses or the context is cancelled + delayElapsed := autorest.DelayForBackoff(delay, delayAttempt, cancelCtx.Done()) + if !delayElapsed { + return autorest.NewErrorWithError(cancelCtx.Err(), "Future", "WaitForCompletion", f.pt.latestResponse(), "context has been cancelled") + } + } + return +} + +// MarshalJSON implements the json.Marshaler interface. +func (f Future) MarshalJSON() ([]byte, error) { + return json.Marshal(f.pt) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (f *Future) UnmarshalJSON(data []byte) error { + // unmarshal into JSON object to determine the tracker type + obj := map[string]interface{}{} + err := json.Unmarshal(data, &obj) + if err != nil { + return err + } + if obj["method"] == nil { + return autorest.NewError("Future", "UnmarshalJSON", "missing 'method' property") + } + method := obj["method"].(string) + switch strings.ToUpper(method) { + case http.MethodDelete: + f.pt = &pollingTrackerDelete{} + case http.MethodPatch: + f.pt = &pollingTrackerPatch{} + case http.MethodPost: + f.pt = &pollingTrackerPost{} + case http.MethodPut: + f.pt = &pollingTrackerPut{} + default: + return autorest.NewError("Future", "UnmarshalJSON", "unsupoorted method '%s'", method) + } + // now unmarshal into the tracker + return json.Unmarshal(data, &f.pt) +} + +// PollingURL returns the URL used for retrieving the status of the long-running operation. +func (f Future) PollingURL() string { + if f.pt == nil { + return "" + } + return f.pt.pollingURL() +} + +// GetResult should be called once polling has completed successfully. +// It makes the final GET call to retrieve the resultant payload. +func (f Future) GetResult(sender autorest.Sender) (*http.Response, error) { + if f.pt.finalGetURL() == "" { + // we can end up in this situation if the async operation returns a 200 + // with no polling URLs. in that case return the response which should + // contain the JSON payload (only do this for successful terminal cases). + if lr := f.pt.latestResponse(); lr != nil && f.pt.hasSucceeded() { + return lr, nil + } + return nil, autorest.NewError("Future", "GetResult", "missing URL for retrieving result") + } + req, err := http.NewRequest(http.MethodGet, f.pt.finalGetURL(), nil) + if err != nil { + return nil, err + } + return sender.Do(req) +} + +type pollingTracker interface { + // these methods can differ per tracker + + // checks the response headers and status code to determine the polling mechanism + updatePollingMethod() error + + // checks the response for tracker-specific error conditions + checkForErrors() error + + // returns true if provisioning state should be checked + provisioningStateApplicable() bool + + // methods common to all trackers + + // initializes a tracker's polling URL and method, called for each iteration. + // these values can be overridden by each polling tracker as required. + initPollingMethod() error + + // initializes the tracker's internal state, call this when the tracker is created + initializeState() error + + // makes an HTTP request to check the status of the LRO + pollForStatus(ctx context.Context, sender autorest.Sender) error + + // updates internal tracker state, call this after each call to pollForStatus + updatePollingState(provStateApl bool) error + + // returns the error response from the service, can be nil + pollingError() error + + // returns the polling method being used + pollingMethod() PollingMethodType + + // returns the state of the LRO as returned from the service + pollingStatus() string + + // returns the URL used for polling status + pollingURL() string + + // returns the URL used for the final GET to retrieve the resource + finalGetURL() string + + // returns true if the LRO is in a terminal state + hasTerminated() bool + + // returns true if the LRO is in a failed terminal state + hasFailed() bool + + // returns true if the LRO is in a successful terminal state + hasSucceeded() bool + + // returns the cached HTTP response after a call to pollForStatus(), can be nil + latestResponse() *http.Response +} + +type pollingTrackerBase struct { + // resp is the last response, either from the submission of the LRO or from polling + resp *http.Response + + // method is the HTTP verb, this is needed for deserialization + Method string `json:"method"` + + // rawBody is the raw JSON response body + rawBody map[string]interface{} + + // denotes if polling is using async-operation or location header + Pm PollingMethodType `json:"pollingMethod"` + + // the URL to poll for status + URI string `json:"pollingURI"` + + // the state of the LRO as returned from the service + State string `json:"lroState"` + + // the URL to GET for the final result + FinalGetURI string `json:"resultURI"` + + // used to hold an error object returned from the service + Err *ServiceError `json:"error,omitempty"` +} + +func (pt *pollingTrackerBase) initializeState() error { + // determine the initial polling state based on response body and/or HTTP status + // code. this is applicable to the initial LRO response, not polling responses! + pt.Method = pt.resp.Request.Method + if err := pt.updateRawBody(); err != nil { + return err + } + switch pt.resp.StatusCode { + case http.StatusOK: + if ps := pt.getProvisioningState(); ps != nil { + pt.State = *ps + if pt.hasFailed() { + pt.updateErrorFromResponse() + return pt.pollingError() + } + } else { + pt.State = operationSucceeded + } + case http.StatusCreated: + if ps := pt.getProvisioningState(); ps != nil { + pt.State = *ps + } else { + pt.State = operationInProgress + } + case http.StatusAccepted: + pt.State = operationInProgress + case http.StatusNoContent: + pt.State = operationSucceeded + default: + pt.State = operationFailed + pt.updateErrorFromResponse() + return pt.pollingError() + } + return pt.initPollingMethod() +} + +func (pt pollingTrackerBase) getProvisioningState() *string { + if pt.rawBody != nil && pt.rawBody["properties"] != nil { + p := pt.rawBody["properties"].(map[string]interface{}) + if ps := p["provisioningState"]; ps != nil { + s := ps.(string) + return &s + } + } + return nil +} + +func (pt *pollingTrackerBase) updateRawBody() error { + pt.rawBody = map[string]interface{}{} + if pt.resp.ContentLength != 0 { + defer pt.resp.Body.Close() + b, err := ioutil.ReadAll(pt.resp.Body) + if err != nil { + return autorest.NewErrorWithError(err, "pollingTrackerBase", "updateRawBody", nil, "failed to read response body") + } + // observed in 204 responses over HTTP/2.0; the content length is -1 but body is empty + if len(b) == 0 { + return nil + } + // put the body back so it's available to other callers + pt.resp.Body = ioutil.NopCloser(bytes.NewReader(b)) + if err = json.Unmarshal(b, &pt.rawBody); err != nil { + return autorest.NewErrorWithError(err, "pollingTrackerBase", "updateRawBody", nil, "failed to unmarshal response body") + } + } + return nil +} + +func (pt *pollingTrackerBase) pollForStatus(ctx context.Context, sender autorest.Sender) error { + req, err := http.NewRequest(http.MethodGet, pt.URI, nil) + if err != nil { + return autorest.NewErrorWithError(err, "pollingTrackerBase", "pollForStatus", nil, "failed to create HTTP request") + } + + req = req.WithContext(ctx) + pt.resp, err = sender.Do(req) + if err != nil { + return autorest.NewErrorWithError(err, "pollingTrackerBase", "pollForStatus", nil, "failed to send HTTP request") + } + if autorest.ResponseHasStatusCode(pt.resp, pollingCodes[:]...) { + // reset the service error on success case + pt.Err = nil + err = pt.updateRawBody() + } else { + // check response body for error content + pt.updateErrorFromResponse() + err = pt.pollingError() + } + return err +} + +// attempts to unmarshal a ServiceError type from the response body. +// if that fails then make a best attempt at creating something meaningful. +// NOTE: this assumes that the async operation has failed. +func (pt *pollingTrackerBase) updateErrorFromResponse() { + var err error + if pt.resp.ContentLength != 0 { + type respErr struct { + ServiceError *ServiceError `json:"error"` + } + re := respErr{} + defer pt.resp.Body.Close() + var b []byte + if b, err = ioutil.ReadAll(pt.resp.Body); err != nil || len(b) == 0 { + goto Default + } + if err = json.Unmarshal(b, &re); err != nil { + goto Default + } + // unmarshalling the error didn't yield anything, try unwrapped error + if re.ServiceError == nil { + err = json.Unmarshal(b, &re.ServiceError) + if err != nil { + goto Default + } + } + // the unmarshaller will ensure re.ServiceError is non-nil + // even if there was no content unmarshalled so check the code. + if re.ServiceError.Code != "" { + pt.Err = re.ServiceError + return + } + } +Default: + se := &ServiceError{ + Code: pt.pollingStatus(), + Message: "The async operation failed.", + } + if err != nil { + se.InnerError = make(map[string]interface{}) + se.InnerError["unmarshalError"] = err.Error() + } + // stick the response body into the error object in hopes + // it contains something useful to help diagnose the failure. + if len(pt.rawBody) > 0 { + se.AdditionalInfo = []map[string]interface{}{ + pt.rawBody, + } + } + pt.Err = se +} + +func (pt *pollingTrackerBase) updatePollingState(provStateApl bool) error { + if pt.Pm == PollingAsyncOperation && pt.rawBody["status"] != nil { + pt.State = pt.rawBody["status"].(string) + } else { + if pt.resp.StatusCode == http.StatusAccepted { + pt.State = operationInProgress + } else if provStateApl { + if ps := pt.getProvisioningState(); ps != nil { + pt.State = *ps + } else { + pt.State = operationSucceeded + } + } else { + return autorest.NewError("pollingTrackerBase", "updatePollingState", "the response from the async operation has an invalid status code") + } + } + // if the operation has failed update the error state + if pt.hasFailed() { + pt.updateErrorFromResponse() + } + return nil +} + +func (pt pollingTrackerBase) pollingError() error { + if pt.Err == nil { + return nil + } + return pt.Err +} + +func (pt pollingTrackerBase) pollingMethod() PollingMethodType { + return pt.Pm +} + +func (pt pollingTrackerBase) pollingStatus() string { + return pt.State +} + +func (pt pollingTrackerBase) pollingURL() string { + return pt.URI +} + +func (pt pollingTrackerBase) finalGetURL() string { + return pt.FinalGetURI +} + +func (pt pollingTrackerBase) hasTerminated() bool { + return strings.EqualFold(pt.State, operationCanceled) || strings.EqualFold(pt.State, operationFailed) || strings.EqualFold(pt.State, operationSucceeded) +} + +func (pt pollingTrackerBase) hasFailed() bool { + return strings.EqualFold(pt.State, operationCanceled) || strings.EqualFold(pt.State, operationFailed) +} + +func (pt pollingTrackerBase) hasSucceeded() bool { + return strings.EqualFold(pt.State, operationSucceeded) +} + +func (pt pollingTrackerBase) latestResponse() *http.Response { + return pt.resp +} + +// error checking common to all trackers +func (pt pollingTrackerBase) baseCheckForErrors() error { + // for Azure-AsyncOperations the response body cannot be nil or empty + if pt.Pm == PollingAsyncOperation { + if pt.resp.Body == nil || pt.resp.ContentLength == 0 { + return autorest.NewError("pollingTrackerBase", "baseCheckForErrors", "for Azure-AsyncOperation response body cannot be nil") + } + if pt.rawBody["status"] == nil { + return autorest.NewError("pollingTrackerBase", "baseCheckForErrors", "missing status property in Azure-AsyncOperation response body") + } + } + return nil +} + +// default initialization of polling URL/method. each verb tracker will update this as required. +func (pt *pollingTrackerBase) initPollingMethod() error { + if ao, err := getURLFromAsyncOpHeader(pt.resp); err != nil { + return err + } else if ao != "" { + pt.URI = ao + pt.Pm = PollingAsyncOperation + return nil + } + if lh, err := getURLFromLocationHeader(pt.resp); err != nil { + return err + } else if lh != "" { + pt.URI = lh + pt.Pm = PollingLocation + return nil + } + // it's ok if we didn't find a polling header, this will be handled elsewhere + return nil +} + +// DELETE + +type pollingTrackerDelete struct { + pollingTrackerBase +} + +func (pt *pollingTrackerDelete) updatePollingMethod() error { + // for 201 the Location header is required + if pt.resp.StatusCode == http.StatusCreated { + if lh, err := getURLFromLocationHeader(pt.resp); err != nil { + return err + } else if lh == "" { + return autorest.NewError("pollingTrackerDelete", "updateHeaders", "missing Location header in 201 response") + } else { + pt.URI = lh + } + pt.Pm = PollingLocation + pt.FinalGetURI = pt.URI + } + // for 202 prefer the Azure-AsyncOperation header but fall back to Location if necessary + if pt.resp.StatusCode == http.StatusAccepted { + ao, err := getURLFromAsyncOpHeader(pt.resp) + if err != nil { + return err + } else if ao != "" { + pt.URI = ao + pt.Pm = PollingAsyncOperation + } + // if the Location header is invalid and we already have a polling URL + // then we don't care if the Location header URL is malformed. + if lh, err := getURLFromLocationHeader(pt.resp); err != nil && pt.URI == "" { + return err + } else if lh != "" { + if ao == "" { + pt.URI = lh + pt.Pm = PollingLocation + } + // when both headers are returned we use the value in the Location header for the final GET + pt.FinalGetURI = lh + } + // make sure a polling URL was found + if pt.URI == "" { + return autorest.NewError("pollingTrackerPost", "updateHeaders", "didn't get any suitable polling URLs in 202 response") + } + } + return nil +} + +func (pt pollingTrackerDelete) checkForErrors() error { + return pt.baseCheckForErrors() +} + +func (pt pollingTrackerDelete) provisioningStateApplicable() bool { + return pt.resp.StatusCode == http.StatusOK || pt.resp.StatusCode == http.StatusNoContent +} + +// PATCH + +type pollingTrackerPatch struct { + pollingTrackerBase +} + +func (pt *pollingTrackerPatch) updatePollingMethod() error { + // by default we can use the original URL for polling and final GET + if pt.URI == "" { + pt.URI = pt.resp.Request.URL.String() + } + if pt.FinalGetURI == "" { + pt.FinalGetURI = pt.resp.Request.URL.String() + } + if pt.Pm == PollingUnknown { + pt.Pm = PollingRequestURI + } + // for 201 it's permissible for no headers to be returned + if pt.resp.StatusCode == http.StatusCreated { + if ao, err := getURLFromAsyncOpHeader(pt.resp); err != nil { + return err + } else if ao != "" { + pt.URI = ao + pt.Pm = PollingAsyncOperation + } + } + // for 202 prefer the Azure-AsyncOperation header but fall back to Location if necessary + // note the absence of the "final GET" mechanism for PATCH + if pt.resp.StatusCode == http.StatusAccepted { + ao, err := getURLFromAsyncOpHeader(pt.resp) + if err != nil { + return err + } else if ao != "" { + pt.URI = ao + pt.Pm = PollingAsyncOperation + } + if ao == "" { + if lh, err := getURLFromLocationHeader(pt.resp); err != nil { + return err + } else if lh == "" { + return autorest.NewError("pollingTrackerPatch", "updateHeaders", "didn't get any suitable polling URLs in 202 response") + } else { + pt.URI = lh + pt.Pm = PollingLocation + } + } + } + return nil +} + +func (pt pollingTrackerPatch) checkForErrors() error { + return pt.baseCheckForErrors() +} + +func (pt pollingTrackerPatch) provisioningStateApplicable() bool { + return pt.resp.StatusCode == http.StatusOK || pt.resp.StatusCode == http.StatusCreated +} + +// POST + +type pollingTrackerPost struct { + pollingTrackerBase +} + +func (pt *pollingTrackerPost) updatePollingMethod() error { + // 201 requires Location header + if pt.resp.StatusCode == http.StatusCreated { + if lh, err := getURLFromLocationHeader(pt.resp); err != nil { + return err + } else if lh == "" { + return autorest.NewError("pollingTrackerPost", "updateHeaders", "missing Location header in 201 response") + } else { + pt.URI = lh + pt.FinalGetURI = lh + pt.Pm = PollingLocation + } + } + // for 202 prefer the Azure-AsyncOperation header but fall back to Location if necessary + if pt.resp.StatusCode == http.StatusAccepted { + ao, err := getURLFromAsyncOpHeader(pt.resp) + if err != nil { + return err + } else if ao != "" { + pt.URI = ao + pt.Pm = PollingAsyncOperation + } + // if the Location header is invalid and we already have a polling URL + // then we don't care if the Location header URL is malformed. + if lh, err := getURLFromLocationHeader(pt.resp); err != nil && pt.URI == "" { + return err + } else if lh != "" { + if ao == "" { + pt.URI = lh + pt.Pm = PollingLocation + } + // when both headers are returned we use the value in the Location header for the final GET + pt.FinalGetURI = lh + } + // make sure a polling URL was found + if pt.URI == "" { + return autorest.NewError("pollingTrackerPost", "updateHeaders", "didn't get any suitable polling URLs in 202 response") + } + } + return nil +} + +func (pt pollingTrackerPost) checkForErrors() error { + return pt.baseCheckForErrors() +} + +func (pt pollingTrackerPost) provisioningStateApplicable() bool { + return pt.resp.StatusCode == http.StatusOK || pt.resp.StatusCode == http.StatusNoContent +} + +// PUT + +type pollingTrackerPut struct { + pollingTrackerBase +} + +func (pt *pollingTrackerPut) updatePollingMethod() error { + // by default we can use the original URL for polling and final GET + if pt.URI == "" { + pt.URI = pt.resp.Request.URL.String() + } + if pt.FinalGetURI == "" { + pt.FinalGetURI = pt.resp.Request.URL.String() + } + if pt.Pm == PollingUnknown { + pt.Pm = PollingRequestURI + } + // for 201 it's permissible for no headers to be returned + if pt.resp.StatusCode == http.StatusCreated { + if ao, err := getURLFromAsyncOpHeader(pt.resp); err != nil { + return err + } else if ao != "" { + pt.URI = ao + pt.Pm = PollingAsyncOperation + } + } + // for 202 prefer the Azure-AsyncOperation header but fall back to Location if necessary + if pt.resp.StatusCode == http.StatusAccepted { + ao, err := getURLFromAsyncOpHeader(pt.resp) + if err != nil { + return err + } else if ao != "" { + pt.URI = ao + pt.Pm = PollingAsyncOperation + } + // if the Location header is invalid and we already have a polling URL + // then we don't care if the Location header URL is malformed. + if lh, err := getURLFromLocationHeader(pt.resp); err != nil && pt.URI == "" { + return err + } else if lh != "" { + if ao == "" { + pt.URI = lh + pt.Pm = PollingLocation + } + } + // make sure a polling URL was found + if pt.URI == "" { + return autorest.NewError("pollingTrackerPut", "updateHeaders", "didn't get any suitable polling URLs in 202 response") + } + } + return nil +} + +func (pt pollingTrackerPut) checkForErrors() error { + err := pt.baseCheckForErrors() + if err != nil { + return err + } + // if there are no LRO headers then the body cannot be empty + ao, err := getURLFromAsyncOpHeader(pt.resp) + if err != nil { + return err + } + lh, err := getURLFromLocationHeader(pt.resp) + if err != nil { + return err + } + if ao == "" && lh == "" && len(pt.rawBody) == 0 { + return autorest.NewError("pollingTrackerPut", "checkForErrors", "the response did not contain a body") + } + return nil +} + +func (pt pollingTrackerPut) provisioningStateApplicable() bool { + return pt.resp.StatusCode == http.StatusOK || pt.resp.StatusCode == http.StatusCreated +} + +// creates a polling tracker based on the verb of the original request +func createPollingTracker(resp *http.Response) (pollingTracker, error) { + var pt pollingTracker + switch strings.ToUpper(resp.Request.Method) { + case http.MethodDelete: + pt = &pollingTrackerDelete{pollingTrackerBase: pollingTrackerBase{resp: resp}} + case http.MethodPatch: + pt = &pollingTrackerPatch{pollingTrackerBase: pollingTrackerBase{resp: resp}} + case http.MethodPost: + pt = &pollingTrackerPost{pollingTrackerBase: pollingTrackerBase{resp: resp}} + case http.MethodPut: + pt = &pollingTrackerPut{pollingTrackerBase: pollingTrackerBase{resp: resp}} + default: + return nil, autorest.NewError("azure", "createPollingTracker", "unsupported HTTP method %s", resp.Request.Method) + } + if err := pt.initializeState(); err != nil { + return pt, err + } + // this initializes the polling header values, we do this during creation in case the + // initial response send us invalid values; this way the API call will return a non-nil + // error (not doing this means the error shows up in Future.Done) + return pt, pt.updatePollingMethod() +} + +// gets the polling URL from the Azure-AsyncOperation header. +// ensures the URL is well-formed and absolute. +func getURLFromAsyncOpHeader(resp *http.Response) (string, error) { + s := resp.Header.Get(http.CanonicalHeaderKey(headerAsyncOperation)) + if s == "" { + return "", nil + } + if !isValidURL(s) { + return "", autorest.NewError("azure", "getURLFromAsyncOpHeader", "invalid polling URL '%s'", s) + } + return s, nil +} + +// gets the polling URL from the Location header. +// ensures the URL is well-formed and absolute. +func getURLFromLocationHeader(resp *http.Response) (string, error) { + s := resp.Header.Get(http.CanonicalHeaderKey(autorest.HeaderLocation)) + if s == "" { + return "", nil + } + if !isValidURL(s) { + return "", autorest.NewError("azure", "getURLFromLocationHeader", "invalid polling URL '%s'", s) + } + return s, nil +} + +// verify that the URL is valid and absolute +func isValidURL(s string) bool { + u, err := url.Parse(s) + return err == nil && u.IsAbs() +} + +// DoPollForAsynchronous returns a SendDecorator that polls if the http.Response is for an Azure +// long-running operation. It will delay between requests for the duration specified in the +// RetryAfter header or, if the header is absent, the passed delay. Polling may be canceled via +// the context associated with the http.Request. +// Deprecated: Prefer using Futures to allow for non-blocking async operations. +func DoPollForAsynchronous(delay time.Duration) autorest.SendDecorator { + return func(s autorest.Sender) autorest.Sender { + return autorest.SenderFunc(func(r *http.Request) (*http.Response, error) { + resp, err := s.Do(r) + if err != nil { + return resp, err + } + if !autorest.ResponseHasStatusCode(resp, pollingCodes[:]...) { + return resp, nil + } + future, err := NewFutureFromResponse(resp) + if err != nil { + return resp, err + } + // retry until either the LRO completes or we receive an error + var done bool + for done, err = future.Done(s); !done && err == nil; done, err = future.Done(s) { + // check for Retry-After delay, if not present use the specified polling delay + if pd, ok := future.GetPollingDelay(); ok { + delay = pd + } + // wait until the delay elapses or the context is cancelled + if delayElapsed := autorest.DelayForBackoff(delay, 0, r.Context().Done()); !delayElapsed { + return future.Response(), + autorest.NewErrorWithError(r.Context().Err(), "azure", "DoPollForAsynchronous", future.Response(), "context has been cancelled") + } + } + return future.Response(), err + }) + } +} + +// PollingMethodType defines a type used for enumerating polling mechanisms. +type PollingMethodType string + +const ( + // PollingAsyncOperation indicates the polling method uses the Azure-AsyncOperation header. + PollingAsyncOperation PollingMethodType = "AsyncOperation" + + // PollingLocation indicates the polling method uses the Location header. + PollingLocation PollingMethodType = "Location" + + // PollingRequestURI indicates the polling method uses the original request URI. + PollingRequestURI PollingMethodType = "RequestURI" + + // PollingUnknown indicates an unknown polling method and is the default value. + PollingUnknown PollingMethodType = "" +) + +// AsyncOpIncompleteError is the type that's returned from a future that has not completed. +type AsyncOpIncompleteError struct { + // FutureType is the name of the type composed of a azure.Future. + FutureType string +} + +// Error returns an error message including the originating type name of the error. +func (e AsyncOpIncompleteError) Error() string { + return fmt.Sprintf("%s: asynchronous operation has not completed", e.FutureType) +} + +// NewAsyncOpIncompleteError creates a new AsyncOpIncompleteError with the specified parameters. +func NewAsyncOpIncompleteError(futureType string) AsyncOpIncompleteError { + return AsyncOpIncompleteError{ + FutureType: futureType, + } +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go new file mode 100644 index 00000000..3a0a439f --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go @@ -0,0 +1,326 @@ +// Package azure provides Azure-specific implementations used with AutoRest. +// See the included examples for more detail. +package azure + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "regexp" + "strconv" + "strings" + + "github.com/Azure/go-autorest/autorest" +) + +const ( + // HeaderClientID is the Azure extension header to set a user-specified request ID. + HeaderClientID = "x-ms-client-request-id" + + // HeaderReturnClientID is the Azure extension header to set if the user-specified request ID + // should be included in the response. + HeaderReturnClientID = "x-ms-return-client-request-id" + + // HeaderRequestID is the Azure extension header of the service generated request ID returned + // in the response. + HeaderRequestID = "x-ms-request-id" +) + +// ServiceError encapsulates the error response from an Azure service. +// It adhears to the OData v4 specification for error responses. +type ServiceError struct { + Code string `json:"code"` + Message string `json:"message"` + Target *string `json:"target"` + Details []map[string]interface{} `json:"details"` + InnerError map[string]interface{} `json:"innererror"` + AdditionalInfo []map[string]interface{} `json:"additionalInfo"` +} + +func (se ServiceError) Error() string { + result := fmt.Sprintf("Code=%q Message=%q", se.Code, se.Message) + + if se.Target != nil { + result += fmt.Sprintf(" Target=%q", *se.Target) + } + + if se.Details != nil { + d, err := json.Marshal(se.Details) + if err != nil { + result += fmt.Sprintf(" Details=%v", se.Details) + } + result += fmt.Sprintf(" Details=%v", string(d)) + } + + if se.InnerError != nil { + d, err := json.Marshal(se.InnerError) + if err != nil { + result += fmt.Sprintf(" InnerError=%v", se.InnerError) + } + result += fmt.Sprintf(" InnerError=%v", string(d)) + } + + if se.AdditionalInfo != nil { + d, err := json.Marshal(se.AdditionalInfo) + if err != nil { + result += fmt.Sprintf(" AdditionalInfo=%v", se.AdditionalInfo) + } + result += fmt.Sprintf(" AdditionalInfo=%v", string(d)) + } + + return result +} + +// UnmarshalJSON implements the json.Unmarshaler interface for the ServiceError type. +func (se *ServiceError) UnmarshalJSON(b []byte) error { + // per the OData v4 spec the details field must be an array of JSON objects. + // unfortunately not all services adhear to the spec and just return a single + // object instead of an array with one object. so we have to perform some + // shenanigans to accommodate both cases. + // http://docs.oasis-open.org/odata/odata-json-format/v4.0/os/odata-json-format-v4.0-os.html#_Toc372793091 + + type serviceError1 struct { + Code string `json:"code"` + Message string `json:"message"` + Target *string `json:"target"` + Details []map[string]interface{} `json:"details"` + InnerError map[string]interface{} `json:"innererror"` + AdditionalInfo []map[string]interface{} `json:"additionalInfo"` + } + + type serviceError2 struct { + Code string `json:"code"` + Message string `json:"message"` + Target *string `json:"target"` + Details map[string]interface{} `json:"details"` + InnerError map[string]interface{} `json:"innererror"` + AdditionalInfo []map[string]interface{} `json:"additionalInfo"` + } + + se1 := serviceError1{} + err := json.Unmarshal(b, &se1) + if err == nil { + se.populate(se1.Code, se1.Message, se1.Target, se1.Details, se1.InnerError, se1.AdditionalInfo) + return nil + } + + se2 := serviceError2{} + err = json.Unmarshal(b, &se2) + if err == nil { + se.populate(se2.Code, se2.Message, se2.Target, nil, se2.InnerError, se2.AdditionalInfo) + se.Details = append(se.Details, se2.Details) + return nil + } + return err +} + +func (se *ServiceError) populate(code, message string, target *string, details []map[string]interface{}, inner map[string]interface{}, additional []map[string]interface{}) { + se.Code = code + se.Message = message + se.Target = target + se.Details = details + se.InnerError = inner + se.AdditionalInfo = additional +} + +// RequestError describes an error response returned by Azure service. +type RequestError struct { + autorest.DetailedError + + // The error returned by the Azure service. + ServiceError *ServiceError `json:"error"` + + // The request id (from the x-ms-request-id-header) of the request. + RequestID string +} + +// Error returns a human-friendly error message from service error. +func (e RequestError) Error() string { + return fmt.Sprintf("autorest/azure: Service returned an error. Status=%v %v", + e.StatusCode, e.ServiceError) +} + +// IsAzureError returns true if the passed error is an Azure Service error; false otherwise. +func IsAzureError(e error) bool { + _, ok := e.(*RequestError) + return ok +} + +// Resource contains details about an Azure resource. +type Resource struct { + SubscriptionID string + ResourceGroup string + Provider string + ResourceType string + ResourceName string +} + +// ParseResourceID parses a resource ID into a ResourceDetails struct. +// See https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-template-functions-resource#return-value-4. +func ParseResourceID(resourceID string) (Resource, error) { + + const resourceIDPatternText = `(?i)subscriptions/(.+)/resourceGroups/(.+)/providers/(.+?)/(.+?)/(.+)` + resourceIDPattern := regexp.MustCompile(resourceIDPatternText) + match := resourceIDPattern.FindStringSubmatch(resourceID) + + if len(match) == 0 { + return Resource{}, fmt.Errorf("parsing failed for %s. Invalid resource Id format", resourceID) + } + + v := strings.Split(match[5], "/") + resourceName := v[len(v)-1] + + result := Resource{ + SubscriptionID: match[1], + ResourceGroup: match[2], + Provider: match[3], + ResourceType: match[4], + ResourceName: resourceName, + } + + return result, nil +} + +// NewErrorWithError creates a new Error conforming object from the +// passed packageType, method, statusCode of the given resp (UndefinedStatusCode +// if resp is nil), message, and original error. message is treated as a format +// string to which the optional args apply. +func NewErrorWithError(original error, packageType string, method string, resp *http.Response, message string, args ...interface{}) RequestError { + if v, ok := original.(*RequestError); ok { + return *v + } + + statusCode := autorest.UndefinedStatusCode + if resp != nil { + statusCode = resp.StatusCode + } + return RequestError{ + DetailedError: autorest.DetailedError{ + Original: original, + PackageType: packageType, + Method: method, + StatusCode: statusCode, + Message: fmt.Sprintf(message, args...), + }, + } +} + +// WithReturningClientID returns a PrepareDecorator that adds an HTTP extension header of +// x-ms-client-request-id whose value is the passed, undecorated UUID (e.g., +// "0F39878C-5F76-4DB8-A25D-61D2C193C3CA"). It also sets the x-ms-return-client-request-id +// header to true such that UUID accompanies the http.Response. +func WithReturningClientID(uuid string) autorest.PrepareDecorator { + preparer := autorest.CreatePreparer( + WithClientID(uuid), + WithReturnClientID(true)) + + return func(p autorest.Preparer) autorest.Preparer { + return autorest.PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err != nil { + return r, err + } + return preparer.Prepare(r) + }) + } +} + +// WithClientID returns a PrepareDecorator that adds an HTTP extension header of +// x-ms-client-request-id whose value is passed, undecorated UUID (e.g., +// "0F39878C-5F76-4DB8-A25D-61D2C193C3CA"). +func WithClientID(uuid string) autorest.PrepareDecorator { + return autorest.WithHeader(HeaderClientID, uuid) +} + +// WithReturnClientID returns a PrepareDecorator that adds an HTTP extension header of +// x-ms-return-client-request-id whose boolean value indicates if the value of the +// x-ms-client-request-id header should be included in the http.Response. +func WithReturnClientID(b bool) autorest.PrepareDecorator { + return autorest.WithHeader(HeaderReturnClientID, strconv.FormatBool(b)) +} + +// ExtractClientID extracts the client identifier from the x-ms-client-request-id header set on the +// http.Request sent to the service (and returned in the http.Response) +func ExtractClientID(resp *http.Response) string { + return autorest.ExtractHeaderValue(HeaderClientID, resp) +} + +// ExtractRequestID extracts the Azure server generated request identifier from the +// x-ms-request-id header. +func ExtractRequestID(resp *http.Response) string { + return autorest.ExtractHeaderValue(HeaderRequestID, resp) +} + +// WithErrorUnlessStatusCode returns a RespondDecorator that emits an +// azure.RequestError by reading the response body unless the response HTTP status code +// is among the set passed. +// +// If there is a chance service may return responses other than the Azure error +// format and the response cannot be parsed into an error, a decoding error will +// be returned containing the response body. In any case, the Responder will +// return an error if the status code is not satisfied. +// +// If this Responder returns an error, the response body will be replaced with +// an in-memory reader, which needs no further closing. +func WithErrorUnlessStatusCode(codes ...int) autorest.RespondDecorator { + return func(r autorest.Responder) autorest.Responder { + return autorest.ResponderFunc(func(resp *http.Response) error { + err := r.Respond(resp) + if err == nil && !autorest.ResponseHasStatusCode(resp, codes...) { + var e RequestError + defer resp.Body.Close() + + // Copy and replace the Body in case it does not contain an error object. + // This will leave the Body available to the caller. + b, decodeErr := autorest.CopyAndDecode(autorest.EncodedAsJSON, resp.Body, &e) + resp.Body = ioutil.NopCloser(&b) + if decodeErr != nil { + return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), decodeErr) + } + if e.ServiceError == nil { + // Check if error is unwrapped ServiceError + if err := json.Unmarshal(b.Bytes(), &e.ServiceError); err != nil { + return err + } + } + if e.ServiceError.Message == "" { + // if we're here it means the returned error wasn't OData v4 compliant. + // try to unmarshal the body as raw JSON in hopes of getting something. + rawBody := map[string]interface{}{} + if err := json.Unmarshal(b.Bytes(), &rawBody); err != nil { + return err + } + e.ServiceError = &ServiceError{ + Code: "Unknown", + Message: "Unknown service error", + } + if len(rawBody) > 0 { + e.ServiceError.Details = []map[string]interface{}{rawBody} + } + } + e.Response = resp + e.RequestID = ExtractRequestID(resp) + if e.StatusCode == nil { + e.StatusCode = resp.StatusCode + } + err = &e + } + return err + }) + } +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go b/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go new file mode 100644 index 00000000..7e41f7fd --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go @@ -0,0 +1,191 @@ +package azure + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "strings" +) + +// EnvironmentFilepathName captures the name of the environment variable containing the path to the file +// to be used while populating the Azure Environment. +const EnvironmentFilepathName = "AZURE_ENVIRONMENT_FILEPATH" + +var environments = map[string]Environment{ + "AZURECHINACLOUD": ChinaCloud, + "AZUREGERMANCLOUD": GermanCloud, + "AZUREPUBLICCLOUD": PublicCloud, + "AZUREUSGOVERNMENTCLOUD": USGovernmentCloud, +} + +// Environment represents a set of endpoints for each of Azure's Clouds. +type Environment struct { + Name string `json:"name"` + ManagementPortalURL string `json:"managementPortalURL"` + PublishSettingsURL string `json:"publishSettingsURL"` + ServiceManagementEndpoint string `json:"serviceManagementEndpoint"` + ResourceManagerEndpoint string `json:"resourceManagerEndpoint"` + ActiveDirectoryEndpoint string `json:"activeDirectoryEndpoint"` + GalleryEndpoint string `json:"galleryEndpoint"` + KeyVaultEndpoint string `json:"keyVaultEndpoint"` + GraphEndpoint string `json:"graphEndpoint"` + ServiceBusEndpoint string `json:"serviceBusEndpoint"` + BatchManagementEndpoint string `json:"batchManagementEndpoint"` + StorageEndpointSuffix string `json:"storageEndpointSuffix"` + SQLDatabaseDNSSuffix string `json:"sqlDatabaseDNSSuffix"` + TrafficManagerDNSSuffix string `json:"trafficManagerDNSSuffix"` + KeyVaultDNSSuffix string `json:"keyVaultDNSSuffix"` + ServiceBusEndpointSuffix string `json:"serviceBusEndpointSuffix"` + ServiceManagementVMDNSSuffix string `json:"serviceManagementVMDNSSuffix"` + ResourceManagerVMDNSSuffix string `json:"resourceManagerVMDNSSuffix"` + ContainerRegistryDNSSuffix string `json:"containerRegistryDNSSuffix"` + TokenAudience string `json:"tokenAudience"` +} + +var ( + // PublicCloud is the default public Azure cloud environment + PublicCloud = Environment{ + Name: "AzurePublicCloud", + ManagementPortalURL: "https://manage.windowsazure.com/", + PublishSettingsURL: "https://manage.windowsazure.com/publishsettings/index", + ServiceManagementEndpoint: "https://management.core.windows.net/", + ResourceManagerEndpoint: "https://management.azure.com/", + ActiveDirectoryEndpoint: "https://login.microsoftonline.com/", + GalleryEndpoint: "https://gallery.azure.com/", + KeyVaultEndpoint: "https://vault.azure.net/", + GraphEndpoint: "https://graph.windows.net/", + ServiceBusEndpoint: "https://servicebus.windows.net/", + BatchManagementEndpoint: "https://batch.core.windows.net/", + StorageEndpointSuffix: "core.windows.net", + SQLDatabaseDNSSuffix: "database.windows.net", + TrafficManagerDNSSuffix: "trafficmanager.net", + KeyVaultDNSSuffix: "vault.azure.net", + ServiceBusEndpointSuffix: "servicebus.windows.net", + ServiceManagementVMDNSSuffix: "cloudapp.net", + ResourceManagerVMDNSSuffix: "cloudapp.azure.com", + ContainerRegistryDNSSuffix: "azurecr.io", + TokenAudience: "https://management.azure.com/", + } + + // USGovernmentCloud is the cloud environment for the US Government + USGovernmentCloud = Environment{ + Name: "AzureUSGovernmentCloud", + ManagementPortalURL: "https://manage.windowsazure.us/", + PublishSettingsURL: "https://manage.windowsazure.us/publishsettings/index", + ServiceManagementEndpoint: "https://management.core.usgovcloudapi.net/", + ResourceManagerEndpoint: "https://management.usgovcloudapi.net/", + ActiveDirectoryEndpoint: "https://login.microsoftonline.us/", + GalleryEndpoint: "https://gallery.usgovcloudapi.net/", + KeyVaultEndpoint: "https://vault.usgovcloudapi.net/", + GraphEndpoint: "https://graph.windows.net/", + ServiceBusEndpoint: "https://servicebus.usgovcloudapi.net/", + BatchManagementEndpoint: "https://batch.core.usgovcloudapi.net/", + StorageEndpointSuffix: "core.usgovcloudapi.net", + SQLDatabaseDNSSuffix: "database.usgovcloudapi.net", + TrafficManagerDNSSuffix: "usgovtrafficmanager.net", + KeyVaultDNSSuffix: "vault.usgovcloudapi.net", + ServiceBusEndpointSuffix: "servicebus.usgovcloudapi.net", + ServiceManagementVMDNSSuffix: "usgovcloudapp.net", + ResourceManagerVMDNSSuffix: "cloudapp.windowsazure.us", + ContainerRegistryDNSSuffix: "azurecr.io", + TokenAudience: "https://management.usgovcloudapi.net/", + } + + // ChinaCloud is the cloud environment operated in China + ChinaCloud = Environment{ + Name: "AzureChinaCloud", + ManagementPortalURL: "https://manage.chinacloudapi.com/", + PublishSettingsURL: "https://manage.chinacloudapi.com/publishsettings/index", + ServiceManagementEndpoint: "https://management.core.chinacloudapi.cn/", + ResourceManagerEndpoint: "https://management.chinacloudapi.cn/", + ActiveDirectoryEndpoint: "https://login.chinacloudapi.cn/", + GalleryEndpoint: "https://gallery.chinacloudapi.cn/", + KeyVaultEndpoint: "https://vault.azure.cn/", + GraphEndpoint: "https://graph.chinacloudapi.cn/", + ServiceBusEndpoint: "https://servicebus.chinacloudapi.cn/", + BatchManagementEndpoint: "https://batch.chinacloudapi.cn/", + StorageEndpointSuffix: "core.chinacloudapi.cn", + SQLDatabaseDNSSuffix: "database.chinacloudapi.cn", + TrafficManagerDNSSuffix: "trafficmanager.cn", + KeyVaultDNSSuffix: "vault.azure.cn", + ServiceBusEndpointSuffix: "servicebus.chinacloudapi.cn", + ServiceManagementVMDNSSuffix: "chinacloudapp.cn", + ResourceManagerVMDNSSuffix: "cloudapp.azure.cn", + ContainerRegistryDNSSuffix: "azurecr.io", + TokenAudience: "https://management.chinacloudapi.cn/", + } + + // GermanCloud is the cloud environment operated in Germany + GermanCloud = Environment{ + Name: "AzureGermanCloud", + ManagementPortalURL: "http://portal.microsoftazure.de/", + PublishSettingsURL: "https://manage.microsoftazure.de/publishsettings/index", + ServiceManagementEndpoint: "https://management.core.cloudapi.de/", + ResourceManagerEndpoint: "https://management.microsoftazure.de/", + ActiveDirectoryEndpoint: "https://login.microsoftonline.de/", + GalleryEndpoint: "https://gallery.cloudapi.de/", + KeyVaultEndpoint: "https://vault.microsoftazure.de/", + GraphEndpoint: "https://graph.cloudapi.de/", + ServiceBusEndpoint: "https://servicebus.cloudapi.de/", + BatchManagementEndpoint: "https://batch.cloudapi.de/", + StorageEndpointSuffix: "core.cloudapi.de", + SQLDatabaseDNSSuffix: "database.cloudapi.de", + TrafficManagerDNSSuffix: "azuretrafficmanager.de", + KeyVaultDNSSuffix: "vault.microsoftazure.de", + ServiceBusEndpointSuffix: "servicebus.cloudapi.de", + ServiceManagementVMDNSSuffix: "azurecloudapp.de", + ResourceManagerVMDNSSuffix: "cloudapp.microsoftazure.de", + ContainerRegistryDNSSuffix: "azurecr.io", + TokenAudience: "https://management.microsoftazure.de/", + } +) + +// EnvironmentFromName returns an Environment based on the common name specified. +func EnvironmentFromName(name string) (Environment, error) { + // IMPORTANT + // As per @radhikagupta5: + // This is technical debt, fundamentally here because Kubernetes is not currently accepting + // contributions to the providers. Once that is an option, the provider should be updated to + // directly call `EnvironmentFromFile`. Until then, we rely on dispatching Azure Stack environment creation + // from this method based on the name that is provided to us. + if strings.EqualFold(name, "AZURESTACKCLOUD") { + return EnvironmentFromFile(os.Getenv(EnvironmentFilepathName)) + } + + name = strings.ToUpper(name) + env, ok := environments[name] + if !ok { + return env, fmt.Errorf("autorest/azure: There is no cloud environment matching the name %q", name) + } + + return env, nil +} + +// EnvironmentFromFile loads an Environment from a configuration file available on disk. +// This function is particularly useful in the Hybrid Cloud model, where one must define their own +// endpoints. +func EnvironmentFromFile(location string) (unmarshaled Environment, err error) { + fileContents, err := ioutil.ReadFile(location) + if err != nil { + return + } + + err = json.Unmarshal(fileContents, &unmarshaled) + + return +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/metadata_environment.go b/vendor/github.com/Azure/go-autorest/autorest/azure/metadata_environment.go new file mode 100644 index 00000000..507f9e95 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/metadata_environment.go @@ -0,0 +1,245 @@ +package azure + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "strings" + + "github.com/Azure/go-autorest/autorest" +) + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +type audience []string + +type authentication struct { + LoginEndpoint string `json:"loginEndpoint"` + Audiences audience `json:"audiences"` +} + +type environmentMetadataInfo struct { + GalleryEndpoint string `json:"galleryEndpoint"` + GraphEndpoint string `json:"graphEndpoint"` + PortalEndpoint string `json:"portalEndpoint"` + Authentication authentication `json:"authentication"` +} + +// EnvironmentProperty represent property names that clients can override +type EnvironmentProperty string + +const ( + // EnvironmentName ... + EnvironmentName EnvironmentProperty = "name" + // EnvironmentManagementPortalURL .. + EnvironmentManagementPortalURL EnvironmentProperty = "managementPortalURL" + // EnvironmentPublishSettingsURL ... + EnvironmentPublishSettingsURL EnvironmentProperty = "publishSettingsURL" + // EnvironmentServiceManagementEndpoint ... + EnvironmentServiceManagementEndpoint EnvironmentProperty = "serviceManagementEndpoint" + // EnvironmentResourceManagerEndpoint ... + EnvironmentResourceManagerEndpoint EnvironmentProperty = "resourceManagerEndpoint" + // EnvironmentActiveDirectoryEndpoint ... + EnvironmentActiveDirectoryEndpoint EnvironmentProperty = "activeDirectoryEndpoint" + // EnvironmentGalleryEndpoint ... + EnvironmentGalleryEndpoint EnvironmentProperty = "galleryEndpoint" + // EnvironmentKeyVaultEndpoint ... + EnvironmentKeyVaultEndpoint EnvironmentProperty = "keyVaultEndpoint" + // EnvironmentGraphEndpoint ... + EnvironmentGraphEndpoint EnvironmentProperty = "graphEndpoint" + // EnvironmentServiceBusEndpoint ... + EnvironmentServiceBusEndpoint EnvironmentProperty = "serviceBusEndpoint" + // EnvironmentBatchManagementEndpoint ... + EnvironmentBatchManagementEndpoint EnvironmentProperty = "batchManagementEndpoint" + // EnvironmentStorageEndpointSuffix ... + EnvironmentStorageEndpointSuffix EnvironmentProperty = "storageEndpointSuffix" + // EnvironmentSQLDatabaseDNSSuffix ... + EnvironmentSQLDatabaseDNSSuffix EnvironmentProperty = "sqlDatabaseDNSSuffix" + // EnvironmentTrafficManagerDNSSuffix ... + EnvironmentTrafficManagerDNSSuffix EnvironmentProperty = "trafficManagerDNSSuffix" + // EnvironmentKeyVaultDNSSuffix ... + EnvironmentKeyVaultDNSSuffix EnvironmentProperty = "keyVaultDNSSuffix" + // EnvironmentServiceBusEndpointSuffix ... + EnvironmentServiceBusEndpointSuffix EnvironmentProperty = "serviceBusEndpointSuffix" + // EnvironmentServiceManagementVMDNSSuffix ... + EnvironmentServiceManagementVMDNSSuffix EnvironmentProperty = "serviceManagementVMDNSSuffix" + // EnvironmentResourceManagerVMDNSSuffix ... + EnvironmentResourceManagerVMDNSSuffix EnvironmentProperty = "resourceManagerVMDNSSuffix" + // EnvironmentContainerRegistryDNSSuffix ... + EnvironmentContainerRegistryDNSSuffix EnvironmentProperty = "containerRegistryDNSSuffix" + // EnvironmentTokenAudience ... + EnvironmentTokenAudience EnvironmentProperty = "tokenAudience" +) + +// OverrideProperty represents property name and value that clients can override +type OverrideProperty struct { + Key EnvironmentProperty + Value string +} + +// EnvironmentFromURL loads an Environment from a URL +// This function is particularly useful in the Hybrid Cloud model, where one may define their own +// endpoints. +func EnvironmentFromURL(resourceManagerEndpoint string, properties ...OverrideProperty) (environment Environment, err error) { + var metadataEnvProperties environmentMetadataInfo + + if resourceManagerEndpoint == "" { + return environment, fmt.Errorf("Metadata resource manager endpoint is empty") + } + + if metadataEnvProperties, err = retrieveMetadataEnvironment(resourceManagerEndpoint); err != nil { + return environment, err + } + + // Give priority to user's override values + overrideProperties(&environment, properties) + + if environment.Name == "" { + environment.Name = "HybridEnvironment" + } + stampDNSSuffix := environment.StorageEndpointSuffix + if stampDNSSuffix == "" { + stampDNSSuffix = strings.TrimSuffix(strings.TrimPrefix(strings.Replace(resourceManagerEndpoint, strings.Split(resourceManagerEndpoint, ".")[0], "", 1), "."), "/") + environment.StorageEndpointSuffix = stampDNSSuffix + } + if environment.KeyVaultDNSSuffix == "" { + environment.KeyVaultDNSSuffix = fmt.Sprintf("%s.%s", "vault", stampDNSSuffix) + } + if environment.KeyVaultEndpoint == "" { + environment.KeyVaultEndpoint = fmt.Sprintf("%s%s", "https://", environment.KeyVaultDNSSuffix) + } + if environment.TokenAudience == "" { + environment.TokenAudience = metadataEnvProperties.Authentication.Audiences[0] + } + if environment.ActiveDirectoryEndpoint == "" { + environment.ActiveDirectoryEndpoint = metadataEnvProperties.Authentication.LoginEndpoint + } + if environment.ResourceManagerEndpoint == "" { + environment.ResourceManagerEndpoint = resourceManagerEndpoint + } + if environment.GalleryEndpoint == "" { + environment.GalleryEndpoint = metadataEnvProperties.GalleryEndpoint + } + if environment.GraphEndpoint == "" { + environment.GraphEndpoint = metadataEnvProperties.GraphEndpoint + } + + return environment, nil +} + +func overrideProperties(environment *Environment, properties []OverrideProperty) { + for _, property := range properties { + switch property.Key { + case EnvironmentName: + { + environment.Name = property.Value + } + case EnvironmentManagementPortalURL: + { + environment.ManagementPortalURL = property.Value + } + case EnvironmentPublishSettingsURL: + { + environment.PublishSettingsURL = property.Value + } + case EnvironmentServiceManagementEndpoint: + { + environment.ServiceManagementEndpoint = property.Value + } + case EnvironmentResourceManagerEndpoint: + { + environment.ResourceManagerEndpoint = property.Value + } + case EnvironmentActiveDirectoryEndpoint: + { + environment.ActiveDirectoryEndpoint = property.Value + } + case EnvironmentGalleryEndpoint: + { + environment.GalleryEndpoint = property.Value + } + case EnvironmentKeyVaultEndpoint: + { + environment.KeyVaultEndpoint = property.Value + } + case EnvironmentGraphEndpoint: + { + environment.GraphEndpoint = property.Value + } + case EnvironmentServiceBusEndpoint: + { + environment.ServiceBusEndpoint = property.Value + } + case EnvironmentBatchManagementEndpoint: + { + environment.BatchManagementEndpoint = property.Value + } + case EnvironmentStorageEndpointSuffix: + { + environment.StorageEndpointSuffix = property.Value + } + case EnvironmentSQLDatabaseDNSSuffix: + { + environment.SQLDatabaseDNSSuffix = property.Value + } + case EnvironmentTrafficManagerDNSSuffix: + { + environment.TrafficManagerDNSSuffix = property.Value + } + case EnvironmentKeyVaultDNSSuffix: + { + environment.KeyVaultDNSSuffix = property.Value + } + case EnvironmentServiceBusEndpointSuffix: + { + environment.ServiceBusEndpointSuffix = property.Value + } + case EnvironmentServiceManagementVMDNSSuffix: + { + environment.ServiceManagementVMDNSSuffix = property.Value + } + case EnvironmentResourceManagerVMDNSSuffix: + { + environment.ResourceManagerVMDNSSuffix = property.Value + } + case EnvironmentContainerRegistryDNSSuffix: + { + environment.ContainerRegistryDNSSuffix = property.Value + } + case EnvironmentTokenAudience: + { + environment.TokenAudience = property.Value + } + } + } +} + +func retrieveMetadataEnvironment(endpoint string) (environment environmentMetadataInfo, err error) { + client := autorest.NewClientWithUserAgent("") + managementEndpoint := fmt.Sprintf("%s%s", strings.TrimSuffix(endpoint, "/"), "/metadata/endpoints?api-version=1.0") + req, _ := http.NewRequest("GET", managementEndpoint, nil) + response, err := client.Do(req) + if err != nil { + return environment, err + } + defer response.Body.Close() + jsonResponse, err := ioutil.ReadAll(response.Body) + if err != nil { + return environment, err + } + err = json.Unmarshal(jsonResponse, &environment) + return environment, err +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/rp.go b/vendor/github.com/Azure/go-autorest/autorest/azure/rp.go new file mode 100644 index 00000000..86ce9f2b --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/rp.go @@ -0,0 +1,200 @@ +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package azure + +import ( + "errors" + "fmt" + "net/http" + "net/url" + "strings" + "time" + + "github.com/Azure/go-autorest/autorest" +) + +// DoRetryWithRegistration tries to register the resource provider in case it is unregistered. +// It also handles request retries +func DoRetryWithRegistration(client autorest.Client) autorest.SendDecorator { + return func(s autorest.Sender) autorest.Sender { + return autorest.SenderFunc(func(r *http.Request) (resp *http.Response, err error) { + rr := autorest.NewRetriableRequest(r) + for currentAttempt := 0; currentAttempt < client.RetryAttempts; currentAttempt++ { + err = rr.Prepare() + if err != nil { + return resp, err + } + + resp, err = autorest.SendWithSender(s, rr.Request(), + autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...), + ) + if err != nil { + return resp, err + } + + if resp.StatusCode != http.StatusConflict || client.SkipResourceProviderRegistration { + return resp, err + } + var re RequestError + err = autorest.Respond( + resp, + autorest.ByUnmarshallingJSON(&re), + ) + if err != nil { + return resp, err + } + err = re + + if re.ServiceError != nil && re.ServiceError.Code == "MissingSubscriptionRegistration" { + regErr := register(client, r, re) + if regErr != nil { + return resp, fmt.Errorf("failed auto registering Resource Provider: %s. Original error: %s", regErr, err) + } + } + } + return resp, err + }) + } +} + +func getProvider(re RequestError) (string, error) { + if re.ServiceError != nil && len(re.ServiceError.Details) > 0 { + return re.ServiceError.Details[0]["target"].(string), nil + } + return "", errors.New("provider was not found in the response") +} + +func register(client autorest.Client, originalReq *http.Request, re RequestError) error { + subID := getSubscription(originalReq.URL.Path) + if subID == "" { + return errors.New("missing parameter subscriptionID to register resource provider") + } + providerName, err := getProvider(re) + if err != nil { + return fmt.Errorf("missing parameter provider to register resource provider: %s", err) + } + newURL := url.URL{ + Scheme: originalReq.URL.Scheme, + Host: originalReq.URL.Host, + } + + // taken from the resources SDK + // with almost identical code, this sections are easier to mantain + // It is also not a good idea to import the SDK here + // https://github.com/Azure/azure-sdk-for-go/blob/9f366792afa3e0ddaecdc860e793ba9d75e76c27/arm/resources/resources/providers.go#L252 + pathParameters := map[string]interface{}{ + "resourceProviderNamespace": autorest.Encode("path", providerName), + "subscriptionId": autorest.Encode("path", subID), + } + + const APIVersion = "2016-09-01" + queryParameters := map[string]interface{}{ + "api-version": APIVersion, + } + + preparer := autorest.CreatePreparer( + autorest.AsPost(), + autorest.WithBaseURL(newURL.String()), + autorest.WithPathParameters("/subscriptions/{subscriptionId}/providers/{resourceProviderNamespace}/register", pathParameters), + autorest.WithQueryParameters(queryParameters), + ) + + req, err := preparer.Prepare(&http.Request{}) + if err != nil { + return err + } + req = req.WithContext(originalReq.Context()) + + resp, err := autorest.SendWithSender(client, req, + autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...), + ) + if err != nil { + return err + } + + type Provider struct { + RegistrationState *string `json:"registrationState,omitempty"` + } + var provider Provider + + err = autorest.Respond( + resp, + WithErrorUnlessStatusCode(http.StatusOK), + autorest.ByUnmarshallingJSON(&provider), + autorest.ByClosing(), + ) + if err != nil { + return err + } + + // poll for registered provisioning state + registrationStartTime := time.Now() + for err == nil && (client.PollingDuration == 0 || (client.PollingDuration != 0 && time.Since(registrationStartTime) < client.PollingDuration)) { + // taken from the resources SDK + // https://github.com/Azure/azure-sdk-for-go/blob/9f366792afa3e0ddaecdc860e793ba9d75e76c27/arm/resources/resources/providers.go#L45 + preparer := autorest.CreatePreparer( + autorest.AsGet(), + autorest.WithBaseURL(newURL.String()), + autorest.WithPathParameters("/subscriptions/{subscriptionId}/providers/{resourceProviderNamespace}", pathParameters), + autorest.WithQueryParameters(queryParameters), + ) + req, err = preparer.Prepare(&http.Request{}) + if err != nil { + return err + } + req = req.WithContext(originalReq.Context()) + + resp, err := autorest.SendWithSender(client, req, + autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...), + ) + if err != nil { + return err + } + + err = autorest.Respond( + resp, + WithErrorUnlessStatusCode(http.StatusOK), + autorest.ByUnmarshallingJSON(&provider), + autorest.ByClosing(), + ) + if err != nil { + return err + } + + if provider.RegistrationState != nil && + *provider.RegistrationState == "Registered" { + break + } + + delayed := autorest.DelayWithRetryAfter(resp, originalReq.Context().Done()) + if !delayed && !autorest.DelayForBackoff(client.PollingDelay, 0, originalReq.Context().Done()) { + return originalReq.Context().Err() + } + } + if client.PollingDuration != 0 && !(time.Since(registrationStartTime) < client.PollingDuration) { + return errors.New("polling for resource provider registration has exceeded the polling duration") + } + return err +} + +func getSubscription(path string) string { + parts := strings.Split(path, "/") + for i, v := range parts { + if v == "subscriptions" && (i+1) < len(parts) { + return parts[i+1] + } + } + return "" +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/client.go b/vendor/github.com/Azure/go-autorest/autorest/client.go new file mode 100644 index 00000000..48eb0e8b --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/client.go @@ -0,0 +1,268 @@ +package autorest + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "net/http/cookiejar" + "strings" + "time" + + "github.com/Azure/go-autorest/logger" + "github.com/Azure/go-autorest/version" +) + +const ( + // DefaultPollingDelay is a reasonable delay between polling requests. + DefaultPollingDelay = 60 * time.Second + + // DefaultPollingDuration is a reasonable total polling duration. + DefaultPollingDuration = 15 * time.Minute + + // DefaultRetryAttempts is number of attempts for retry status codes (5xx). + DefaultRetryAttempts = 3 + + // DefaultRetryDuration is the duration to wait between retries. + DefaultRetryDuration = 30 * time.Second +) + +var ( + // StatusCodesForRetry are a defined group of status code for which the client will retry + StatusCodesForRetry = []int{ + http.StatusRequestTimeout, // 408 + http.StatusTooManyRequests, // 429 + http.StatusInternalServerError, // 500 + http.StatusBadGateway, // 502 + http.StatusServiceUnavailable, // 503 + http.StatusGatewayTimeout, // 504 + } +) + +const ( + requestFormat = `HTTP Request Begin =================================================== +%s +===================================================== HTTP Request End +` + responseFormat = `HTTP Response Begin =================================================== +%s +===================================================== HTTP Response End +` +) + +// Response serves as the base for all responses from generated clients. It provides access to the +// last http.Response. +type Response struct { + *http.Response `json:"-"` +} + +// LoggingInspector implements request and response inspectors that log the full request and +// response to a supplied log. +type LoggingInspector struct { + Logger *log.Logger +} + +// WithInspection returns a PrepareDecorator that emits the http.Request to the supplied logger. The +// body is restored after being emitted. +// +// Note: Since it reads the entire Body, this decorator should not be used where body streaming is +// important. It is best used to trace JSON or similar body values. +func (li LoggingInspector) WithInspection() PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + var body, b bytes.Buffer + + defer r.Body.Close() + + r.Body = ioutil.NopCloser(io.TeeReader(r.Body, &body)) + if err := r.Write(&b); err != nil { + return nil, fmt.Errorf("Failed to write response: %v", err) + } + + li.Logger.Printf(requestFormat, b.String()) + + r.Body = ioutil.NopCloser(&body) + return p.Prepare(r) + }) + } +} + +// ByInspecting returns a RespondDecorator that emits the http.Response to the supplied logger. The +// body is restored after being emitted. +// +// Note: Since it reads the entire Body, this decorator should not be used where body streaming is +// important. It is best used to trace JSON or similar body values. +func (li LoggingInspector) ByInspecting() RespondDecorator { + return func(r Responder) Responder { + return ResponderFunc(func(resp *http.Response) error { + var body, b bytes.Buffer + defer resp.Body.Close() + resp.Body = ioutil.NopCloser(io.TeeReader(resp.Body, &body)) + if err := resp.Write(&b); err != nil { + return fmt.Errorf("Failed to write response: %v", err) + } + + li.Logger.Printf(responseFormat, b.String()) + + resp.Body = ioutil.NopCloser(&body) + return r.Respond(resp) + }) + } +} + +// Client is the base for autorest generated clients. It provides default, "do nothing" +// implementations of an Authorizer, RequestInspector, and ResponseInspector. It also returns the +// standard, undecorated http.Client as a default Sender. +// +// Generated clients should also use Error (see NewError and NewErrorWithError) for errors and +// return responses that compose with Response. +// +// Most customization of generated clients is best achieved by supplying a custom Authorizer, custom +// RequestInspector, and / or custom ResponseInspector. Users may log requests, implement circuit +// breakers (see https://msdn.microsoft.com/en-us/library/dn589784.aspx) or otherwise influence +// sending the request by providing a decorated Sender. +type Client struct { + Authorizer Authorizer + Sender Sender + RequestInspector PrepareDecorator + ResponseInspector RespondDecorator + + // PollingDelay sets the polling frequency used in absence of a Retry-After HTTP header + PollingDelay time.Duration + + // PollingDuration sets the maximum polling time after which an error is returned. + // Setting this to zero will use the provided context to control the duration. + PollingDuration time.Duration + + // RetryAttempts sets the default number of retry attempts for client. + RetryAttempts int + + // RetryDuration sets the delay duration for retries. + RetryDuration time.Duration + + // UserAgent, if not empty, will be set as the HTTP User-Agent header on all requests sent + // through the Do method. + UserAgent string + + Jar http.CookieJar + + // Set to true to skip attempted registration of resource providers (false by default). + SkipResourceProviderRegistration bool +} + +// NewClientWithUserAgent returns an instance of a Client with the UserAgent set to the passed +// string. +func NewClientWithUserAgent(ua string) Client { + c := Client{ + PollingDelay: DefaultPollingDelay, + PollingDuration: DefaultPollingDuration, + RetryAttempts: DefaultRetryAttempts, + RetryDuration: DefaultRetryDuration, + UserAgent: version.UserAgent(), + } + c.Sender = c.sender() + c.AddToUserAgent(ua) + return c +} + +// AddToUserAgent adds an extension to the current user agent +func (c *Client) AddToUserAgent(extension string) error { + if extension != "" { + c.UserAgent = fmt.Sprintf("%s %s", c.UserAgent, extension) + return nil + } + return fmt.Errorf("Extension was empty, User Agent stayed as %s", c.UserAgent) +} + +// Do implements the Sender interface by invoking the active Sender after applying authorization. +// If Sender is not set, it uses a new instance of http.Client. In both cases it will, if UserAgent +// is set, apply set the User-Agent header. +func (c Client) Do(r *http.Request) (*http.Response, error) { + if r.UserAgent() == "" { + r, _ = Prepare(r, + WithUserAgent(c.UserAgent)) + } + // NOTE: c.WithInspection() must be last in the list so that it can inspect all preceding operations + r, err := Prepare(r, + c.WithAuthorization(), + c.WithInspection()) + if err != nil { + var resp *http.Response + if detErr, ok := err.(DetailedError); ok { + // if the authorization failed (e.g. invalid credentials) there will + // be a response associated with the error, be sure to return it. + resp = detErr.Response + } + return resp, NewErrorWithError(err, "autorest/Client", "Do", nil, "Preparing request failed") + } + logger.Instance.WriteRequest(r, logger.Filter{ + Header: func(k string, v []string) (bool, []string) { + // remove the auth token from the log + if strings.EqualFold(k, "Authorization") || strings.EqualFold(k, "Ocp-Apim-Subscription-Key") { + v = []string{"**REDACTED**"} + } + return true, v + }, + }) + resp, err := SendWithSender(c.sender(), r) + logger.Instance.WriteResponse(resp, logger.Filter{}) + Respond(resp, c.ByInspecting()) + return resp, err +} + +// sender returns the Sender to which to send requests. +func (c Client) sender() Sender { + if c.Sender == nil { + j, _ := cookiejar.New(nil) + return &http.Client{Jar: j} + } + return c.Sender +} + +// WithAuthorization is a convenience method that returns the WithAuthorization PrepareDecorator +// from the current Authorizer. If not Authorizer is set, it uses the NullAuthorizer. +func (c Client) WithAuthorization() PrepareDecorator { + return c.authorizer().WithAuthorization() +} + +// authorizer returns the Authorizer to use. +func (c Client) authorizer() Authorizer { + if c.Authorizer == nil { + return NullAuthorizer{} + } + return c.Authorizer +} + +// WithInspection is a convenience method that passes the request to the supplied RequestInspector, +// if present, or returns the WithNothing PrepareDecorator otherwise. +func (c Client) WithInspection() PrepareDecorator { + if c.RequestInspector == nil { + return WithNothing() + } + return c.RequestInspector +} + +// ByInspecting is a convenience method that passes the response to the supplied ResponseInspector, +// if present, or returns the ByIgnoring RespondDecorator otherwise. +func (c Client) ByInspecting() RespondDecorator { + if c.ResponseInspector == nil { + return ByIgnoring() + } + return c.ResponseInspector +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/date.go b/vendor/github.com/Azure/go-autorest/autorest/date/date.go new file mode 100644 index 00000000..c4571065 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/date/date.go @@ -0,0 +1,96 @@ +/* +Package date provides time.Time derivatives that conform to the Swagger.io (https://swagger.io/) +defined date formats: Date and DateTime. Both types may, in most cases, be used in lieu of +time.Time types. And both convert to time.Time through a ToTime method. +*/ +package date + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "fmt" + "time" +) + +const ( + fullDate = "2006-01-02" + fullDateJSON = `"2006-01-02"` + dateFormat = "%04d-%02d-%02d" + jsonFormat = `"%04d-%02d-%02d"` +) + +// Date defines a type similar to time.Time but assumes a layout of RFC3339 full-date (i.e., +// 2006-01-02). +type Date struct { + time.Time +} + +// ParseDate create a new Date from the passed string. +func ParseDate(date string) (d Date, err error) { + return parseDate(date, fullDate) +} + +func parseDate(date string, format string) (Date, error) { + d, err := time.Parse(format, date) + return Date{Time: d}, err +} + +// MarshalBinary preserves the Date as a byte array conforming to RFC3339 full-date (i.e., +// 2006-01-02). +func (d Date) MarshalBinary() ([]byte, error) { + return d.MarshalText() +} + +// UnmarshalBinary reconstitutes a Date saved as a byte array conforming to RFC3339 full-date (i.e., +// 2006-01-02). +func (d *Date) UnmarshalBinary(data []byte) error { + return d.UnmarshalText(data) +} + +// MarshalJSON preserves the Date as a JSON string conforming to RFC3339 full-date (i.e., +// 2006-01-02). +func (d Date) MarshalJSON() (json []byte, err error) { + return []byte(fmt.Sprintf(jsonFormat, d.Year(), d.Month(), d.Day())), nil +} + +// UnmarshalJSON reconstitutes the Date from a JSON string conforming to RFC3339 full-date (i.e., +// 2006-01-02). +func (d *Date) UnmarshalJSON(data []byte) (err error) { + d.Time, err = time.Parse(fullDateJSON, string(data)) + return err +} + +// MarshalText preserves the Date as a byte array conforming to RFC3339 full-date (i.e., +// 2006-01-02). +func (d Date) MarshalText() (text []byte, err error) { + return []byte(fmt.Sprintf(dateFormat, d.Year(), d.Month(), d.Day())), nil +} + +// UnmarshalText reconstitutes a Date saved as a byte array conforming to RFC3339 full-date (i.e., +// 2006-01-02). +func (d *Date) UnmarshalText(data []byte) (err error) { + d.Time, err = time.Parse(fullDate, string(data)) + return err +} + +// String returns the Date formatted as an RFC3339 full-date string (i.e., 2006-01-02). +func (d Date) String() string { + return fmt.Sprintf(dateFormat, d.Year(), d.Month(), d.Day()) +} + +// ToTime returns a Date as a time.Time +func (d Date) ToTime() time.Time { + return d.Time +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/time.go b/vendor/github.com/Azure/go-autorest/autorest/date/time.go new file mode 100644 index 00000000..b453fad0 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/date/time.go @@ -0,0 +1,103 @@ +package date + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "regexp" + "time" +) + +// Azure reports time in UTC but it doesn't include the 'Z' time zone suffix in some cases. +const ( + azureUtcFormatJSON = `"2006-01-02T15:04:05.999999999"` + azureUtcFormat = "2006-01-02T15:04:05.999999999" + rfc3339JSON = `"` + time.RFC3339Nano + `"` + rfc3339 = time.RFC3339Nano + tzOffsetRegex = `(Z|z|\+|-)(\d+:\d+)*"*$` +) + +// Time defines a type similar to time.Time but assumes a layout of RFC3339 date-time (i.e., +// 2006-01-02T15:04:05Z). +type Time struct { + time.Time +} + +// MarshalBinary preserves the Time as a byte array conforming to RFC3339 date-time (i.e., +// 2006-01-02T15:04:05Z). +func (t Time) MarshalBinary() ([]byte, error) { + return t.Time.MarshalText() +} + +// UnmarshalBinary reconstitutes a Time saved as a byte array conforming to RFC3339 date-time +// (i.e., 2006-01-02T15:04:05Z). +func (t *Time) UnmarshalBinary(data []byte) error { + return t.UnmarshalText(data) +} + +// MarshalJSON preserves the Time as a JSON string conforming to RFC3339 date-time (i.e., +// 2006-01-02T15:04:05Z). +func (t Time) MarshalJSON() (json []byte, err error) { + return t.Time.MarshalJSON() +} + +// UnmarshalJSON reconstitutes the Time from a JSON string conforming to RFC3339 date-time +// (i.e., 2006-01-02T15:04:05Z). +func (t *Time) UnmarshalJSON(data []byte) (err error) { + timeFormat := azureUtcFormatJSON + match, err := regexp.Match(tzOffsetRegex, data) + if err != nil { + return err + } else if match { + timeFormat = rfc3339JSON + } + t.Time, err = ParseTime(timeFormat, string(data)) + return err +} + +// MarshalText preserves the Time as a byte array conforming to RFC3339 date-time (i.e., +// 2006-01-02T15:04:05Z). +func (t Time) MarshalText() (text []byte, err error) { + return t.Time.MarshalText() +} + +// UnmarshalText reconstitutes a Time saved as a byte array conforming to RFC3339 date-time +// (i.e., 2006-01-02T15:04:05Z). +func (t *Time) UnmarshalText(data []byte) (err error) { + timeFormat := azureUtcFormat + match, err := regexp.Match(tzOffsetRegex, data) + if err != nil { + return err + } else if match { + timeFormat = rfc3339 + } + t.Time, err = ParseTime(timeFormat, string(data)) + return err +} + +// String returns the Time formatted as an RFC3339 date-time string (i.e., +// 2006-01-02T15:04:05Z). +func (t Time) String() string { + // Note: time.Time.String does not return an RFC3339 compliant string, time.Time.MarshalText does. + b, err := t.MarshalText() + if err != nil { + return "" + } + return string(b) +} + +// ToTime returns a Time as a time.Time +func (t Time) ToTime() time.Time { + return t.Time +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/timerfc1123.go b/vendor/github.com/Azure/go-autorest/autorest/date/timerfc1123.go new file mode 100644 index 00000000..48fb39ba --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/date/timerfc1123.go @@ -0,0 +1,100 @@ +package date + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "errors" + "time" +) + +const ( + rfc1123JSON = `"` + time.RFC1123 + `"` + rfc1123 = time.RFC1123 +) + +// TimeRFC1123 defines a type similar to time.Time but assumes a layout of RFC1123 date-time (i.e., +// Mon, 02 Jan 2006 15:04:05 MST). +type TimeRFC1123 struct { + time.Time +} + +// UnmarshalJSON reconstitutes the Time from a JSON string conforming to RFC1123 date-time +// (i.e., Mon, 02 Jan 2006 15:04:05 MST). +func (t *TimeRFC1123) UnmarshalJSON(data []byte) (err error) { + t.Time, err = ParseTime(rfc1123JSON, string(data)) + if err != nil { + return err + } + return nil +} + +// MarshalJSON preserves the Time as a JSON string conforming to RFC1123 date-time (i.e., +// Mon, 02 Jan 2006 15:04:05 MST). +func (t TimeRFC1123) MarshalJSON() ([]byte, error) { + if y := t.Year(); y < 0 || y >= 10000 { + return nil, errors.New("Time.MarshalJSON: year outside of range [0,9999]") + } + b := []byte(t.Format(rfc1123JSON)) + return b, nil +} + +// MarshalText preserves the Time as a byte array conforming to RFC1123 date-time (i.e., +// Mon, 02 Jan 2006 15:04:05 MST). +func (t TimeRFC1123) MarshalText() ([]byte, error) { + if y := t.Year(); y < 0 || y >= 10000 { + return nil, errors.New("Time.MarshalText: year outside of range [0,9999]") + } + + b := []byte(t.Format(rfc1123)) + return b, nil +} + +// UnmarshalText reconstitutes a Time saved as a byte array conforming to RFC1123 date-time +// (i.e., Mon, 02 Jan 2006 15:04:05 MST). +func (t *TimeRFC1123) UnmarshalText(data []byte) (err error) { + t.Time, err = ParseTime(rfc1123, string(data)) + if err != nil { + return err + } + return nil +} + +// MarshalBinary preserves the Time as a byte array conforming to RFC1123 date-time (i.e., +// Mon, 02 Jan 2006 15:04:05 MST). +func (t TimeRFC1123) MarshalBinary() ([]byte, error) { + return t.MarshalText() +} + +// UnmarshalBinary reconstitutes a Time saved as a byte array conforming to RFC1123 date-time +// (i.e., Mon, 02 Jan 2006 15:04:05 MST). +func (t *TimeRFC1123) UnmarshalBinary(data []byte) error { + return t.UnmarshalText(data) +} + +// ToTime returns a Time as a time.Time +func (t TimeRFC1123) ToTime() time.Time { + return t.Time +} + +// String returns the Time formatted as an RFC1123 date-time string (i.e., +// Mon, 02 Jan 2006 15:04:05 MST). +func (t TimeRFC1123) String() string { + // Note: time.Time.String does not return an RFC1123 compliant string, time.Time.MarshalText does. + b, err := t.MarshalText() + if err != nil { + return "" + } + return string(b) +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/unixtime.go b/vendor/github.com/Azure/go-autorest/autorest/date/unixtime.go new file mode 100644 index 00000000..7073959b --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/date/unixtime.go @@ -0,0 +1,123 @@ +package date + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "bytes" + "encoding/binary" + "encoding/json" + "time" +) + +// unixEpoch is the moment in time that should be treated as timestamp 0. +var unixEpoch = time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC) + +// UnixTime marshals and unmarshals a time that is represented as the number +// of seconds (ignoring skip-seconds) since the Unix Epoch. +type UnixTime time.Time + +// Duration returns the time as a Duration since the UnixEpoch. +func (t UnixTime) Duration() time.Duration { + return time.Time(t).Sub(unixEpoch) +} + +// NewUnixTimeFromSeconds creates a UnixTime as a number of seconds from the UnixEpoch. +func NewUnixTimeFromSeconds(seconds float64) UnixTime { + return NewUnixTimeFromDuration(time.Duration(seconds * float64(time.Second))) +} + +// NewUnixTimeFromNanoseconds creates a UnixTime as a number of nanoseconds from the UnixEpoch. +func NewUnixTimeFromNanoseconds(nanoseconds int64) UnixTime { + return NewUnixTimeFromDuration(time.Duration(nanoseconds)) +} + +// NewUnixTimeFromDuration creates a UnixTime as a duration of time since the UnixEpoch. +func NewUnixTimeFromDuration(dur time.Duration) UnixTime { + return UnixTime(unixEpoch.Add(dur)) +} + +// UnixEpoch retreives the moment considered the Unix Epoch. I.e. The time represented by '0' +func UnixEpoch() time.Time { + return unixEpoch +} + +// MarshalJSON preserves the UnixTime as a JSON number conforming to Unix Timestamp requirements. +// (i.e. the number of seconds since midnight January 1st, 1970 not considering leap seconds.) +func (t UnixTime) MarshalJSON() ([]byte, error) { + buffer := &bytes.Buffer{} + enc := json.NewEncoder(buffer) + err := enc.Encode(float64(time.Time(t).UnixNano()) / 1e9) + if err != nil { + return nil, err + } + return buffer.Bytes(), nil +} + +// UnmarshalJSON reconstitures a UnixTime saved as a JSON number of the number of seconds since +// midnight January 1st, 1970. +func (t *UnixTime) UnmarshalJSON(text []byte) error { + dec := json.NewDecoder(bytes.NewReader(text)) + + var secondsSinceEpoch float64 + if err := dec.Decode(&secondsSinceEpoch); err != nil { + return err + } + + *t = NewUnixTimeFromSeconds(secondsSinceEpoch) + + return nil +} + +// MarshalText stores the number of seconds since the Unix Epoch as a textual floating point number. +func (t UnixTime) MarshalText() ([]byte, error) { + cast := time.Time(t) + return cast.MarshalText() +} + +// UnmarshalText populates a UnixTime with a value stored textually as a floating point number of seconds since the Unix Epoch. +func (t *UnixTime) UnmarshalText(raw []byte) error { + var unmarshaled time.Time + + if err := unmarshaled.UnmarshalText(raw); err != nil { + return err + } + + *t = UnixTime(unmarshaled) + return nil +} + +// MarshalBinary converts a UnixTime into a binary.LittleEndian float64 of nanoseconds since the epoch. +func (t UnixTime) MarshalBinary() ([]byte, error) { + buf := &bytes.Buffer{} + + payload := int64(t.Duration()) + + if err := binary.Write(buf, binary.LittleEndian, &payload); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +// UnmarshalBinary converts a from a binary.LittleEndian float64 of nanoseconds since the epoch into a UnixTime. +func (t *UnixTime) UnmarshalBinary(raw []byte) error { + var nanosecondsSinceEpoch int64 + + if err := binary.Read(bytes.NewReader(raw), binary.LittleEndian, &nanosecondsSinceEpoch); err != nil { + return err + } + *t = NewUnixTimeFromNanoseconds(nanosecondsSinceEpoch) + return nil +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/utility.go b/vendor/github.com/Azure/go-autorest/autorest/date/utility.go new file mode 100644 index 00000000..12addf0e --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/date/utility.go @@ -0,0 +1,25 @@ +package date + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "strings" + "time" +) + +// ParseTime to parse Time string to specified format. +func ParseTime(format string, t string) (d time.Time, err error) { + return time.Parse(format, strings.ToUpper(t)) +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/error.go b/vendor/github.com/Azure/go-autorest/autorest/error.go new file mode 100644 index 00000000..f724f333 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/error.go @@ -0,0 +1,98 @@ +package autorest + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "fmt" + "net/http" +) + +const ( + // UndefinedStatusCode is used when HTTP status code is not available for an error. + UndefinedStatusCode = 0 +) + +// DetailedError encloses a error with details of the package, method, and associated HTTP +// status code (if any). +type DetailedError struct { + Original error + + // PackageType is the package type of the object emitting the error. For types, the value + // matches that produced the the '%T' format specifier of the fmt package. For other elements, + // such as functions, it is just the package name (e.g., "autorest"). + PackageType string + + // Method is the name of the method raising the error. + Method string + + // StatusCode is the HTTP Response StatusCode (if non-zero) that led to the error. + StatusCode interface{} + + // Message is the error message. + Message string + + // Service Error is the response body of failed API in bytes + ServiceError []byte + + // Response is the response object that was returned during failure if applicable. + Response *http.Response +} + +// NewError creates a new Error conforming object from the passed packageType, method, and +// message. message is treated as a format string to which the optional args apply. +func NewError(packageType string, method string, message string, args ...interface{}) DetailedError { + return NewErrorWithError(nil, packageType, method, nil, message, args...) +} + +// NewErrorWithResponse creates a new Error conforming object from the passed +// packageType, method, statusCode of the given resp (UndefinedStatusCode if +// resp is nil), and message. message is treated as a format string to which the +// optional args apply. +func NewErrorWithResponse(packageType string, method string, resp *http.Response, message string, args ...interface{}) DetailedError { + return NewErrorWithError(nil, packageType, method, resp, message, args...) +} + +// NewErrorWithError creates a new Error conforming object from the +// passed packageType, method, statusCode of the given resp (UndefinedStatusCode +// if resp is nil), message, and original error. message is treated as a format +// string to which the optional args apply. +func NewErrorWithError(original error, packageType string, method string, resp *http.Response, message string, args ...interface{}) DetailedError { + if v, ok := original.(DetailedError); ok { + return v + } + + statusCode := UndefinedStatusCode + if resp != nil { + statusCode = resp.StatusCode + } + + return DetailedError{ + Original: original, + PackageType: packageType, + Method: method, + StatusCode: statusCode, + Message: fmt.Sprintf(message, args...), + Response: resp, + } +} + +// Error returns a formatted containing all available details (i.e., PackageType, Method, +// StatusCode, Message, and original error (if any)). +func (e DetailedError) Error() string { + if e.Original == nil { + return fmt.Sprintf("%s#%s: %s: StatusCode=%d", e.PackageType, e.Method, e.Message, e.StatusCode) + } + return fmt.Sprintf("%s#%s: %s: StatusCode=%d -- Original Error: %v", e.PackageType, e.Method, e.Message, e.StatusCode, e.Original) +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/preparer.go b/vendor/github.com/Azure/go-autorest/autorest/preparer.go new file mode 100644 index 00000000..6d67bd73 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/preparer.go @@ -0,0 +1,480 @@ +package autorest + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "mime/multipart" + "net/http" + "net/url" + "strings" +) + +const ( + mimeTypeJSON = "application/json" + mimeTypeOctetStream = "application/octet-stream" + mimeTypeFormPost = "application/x-www-form-urlencoded" + + headerAuthorization = "Authorization" + headerContentType = "Content-Type" + headerUserAgent = "User-Agent" +) + +// Preparer is the interface that wraps the Prepare method. +// +// Prepare accepts and possibly modifies an http.Request (e.g., adding Headers). Implementations +// must ensure to not share or hold per-invocation state since Preparers may be shared and re-used. +type Preparer interface { + Prepare(*http.Request) (*http.Request, error) +} + +// PreparerFunc is a method that implements the Preparer interface. +type PreparerFunc func(*http.Request) (*http.Request, error) + +// Prepare implements the Preparer interface on PreparerFunc. +func (pf PreparerFunc) Prepare(r *http.Request) (*http.Request, error) { + return pf(r) +} + +// PrepareDecorator takes and possibly decorates, by wrapping, a Preparer. Decorators may affect the +// http.Request and pass it along or, first, pass the http.Request along then affect the result. +type PrepareDecorator func(Preparer) Preparer + +// CreatePreparer creates, decorates, and returns a Preparer. +// Without decorators, the returned Preparer returns the passed http.Request unmodified. +// Preparers are safe to share and re-use. +func CreatePreparer(decorators ...PrepareDecorator) Preparer { + return DecoratePreparer( + Preparer(PreparerFunc(func(r *http.Request) (*http.Request, error) { return r, nil })), + decorators...) +} + +// DecoratePreparer accepts a Preparer and a, possibly empty, set of PrepareDecorators, which it +// applies to the Preparer. Decorators are applied in the order received, but their affect upon the +// request depends on whether they are a pre-decorator (change the http.Request and then pass it +// along) or a post-decorator (pass the http.Request along and alter it on return). +func DecoratePreparer(p Preparer, decorators ...PrepareDecorator) Preparer { + for _, decorate := range decorators { + p = decorate(p) + } + return p +} + +// Prepare accepts an http.Request and a, possibly empty, set of PrepareDecorators. +// It creates a Preparer from the decorators which it then applies to the passed http.Request. +func Prepare(r *http.Request, decorators ...PrepareDecorator) (*http.Request, error) { + if r == nil { + return nil, NewError("autorest", "Prepare", "Invoked without an http.Request") + } + return CreatePreparer(decorators...).Prepare(r) +} + +// WithNothing returns a "do nothing" PrepareDecorator that makes no changes to the passed +// http.Request. +func WithNothing() PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + return p.Prepare(r) + }) + } +} + +// WithHeader returns a PrepareDecorator that sets the specified HTTP header of the http.Request to +// the passed value. It canonicalizes the passed header name (via http.CanonicalHeaderKey) before +// adding the header. +func WithHeader(header string, value string) PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + if r.Header == nil { + r.Header = make(http.Header) + } + r.Header.Set(http.CanonicalHeaderKey(header), value) + } + return r, err + }) + } +} + +// WithHeaders returns a PrepareDecorator that sets the specified HTTP headers of the http.Request to +// the passed value. It canonicalizes the passed headers name (via http.CanonicalHeaderKey) before +// adding them. +func WithHeaders(headers map[string]interface{}) PrepareDecorator { + h := ensureValueStrings(headers) + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + if r.Header == nil { + r.Header = make(http.Header) + } + + for name, value := range h { + r.Header.Set(http.CanonicalHeaderKey(name), value) + } + } + return r, err + }) + } +} + +// WithBearerAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose +// value is "Bearer " followed by the supplied token. +func WithBearerAuthorization(token string) PrepareDecorator { + return WithHeader(headerAuthorization, fmt.Sprintf("Bearer %s", token)) +} + +// AsContentType returns a PrepareDecorator that adds an HTTP Content-Type header whose value +// is the passed contentType. +func AsContentType(contentType string) PrepareDecorator { + return WithHeader(headerContentType, contentType) +} + +// WithUserAgent returns a PrepareDecorator that adds an HTTP User-Agent header whose value is the +// passed string. +func WithUserAgent(ua string) PrepareDecorator { + return WithHeader(headerUserAgent, ua) +} + +// AsFormURLEncoded returns a PrepareDecorator that adds an HTTP Content-Type header whose value is +// "application/x-www-form-urlencoded". +func AsFormURLEncoded() PrepareDecorator { + return AsContentType(mimeTypeFormPost) +} + +// AsJSON returns a PrepareDecorator that adds an HTTP Content-Type header whose value is +// "application/json". +func AsJSON() PrepareDecorator { + return AsContentType(mimeTypeJSON) +} + +// AsOctetStream returns a PrepareDecorator that adds the "application/octet-stream" Content-Type header. +func AsOctetStream() PrepareDecorator { + return AsContentType(mimeTypeOctetStream) +} + +// WithMethod returns a PrepareDecorator that sets the HTTP method of the passed request. The +// decorator does not validate that the passed method string is a known HTTP method. +func WithMethod(method string) PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r.Method = method + return p.Prepare(r) + }) + } +} + +// AsDelete returns a PrepareDecorator that sets the HTTP method to DELETE. +func AsDelete() PrepareDecorator { return WithMethod("DELETE") } + +// AsGet returns a PrepareDecorator that sets the HTTP method to GET. +func AsGet() PrepareDecorator { return WithMethod("GET") } + +// AsHead returns a PrepareDecorator that sets the HTTP method to HEAD. +func AsHead() PrepareDecorator { return WithMethod("HEAD") } + +// AsOptions returns a PrepareDecorator that sets the HTTP method to OPTIONS. +func AsOptions() PrepareDecorator { return WithMethod("OPTIONS") } + +// AsPatch returns a PrepareDecorator that sets the HTTP method to PATCH. +func AsPatch() PrepareDecorator { return WithMethod("PATCH") } + +// AsPost returns a PrepareDecorator that sets the HTTP method to POST. +func AsPost() PrepareDecorator { return WithMethod("POST") } + +// AsPut returns a PrepareDecorator that sets the HTTP method to PUT. +func AsPut() PrepareDecorator { return WithMethod("PUT") } + +// WithBaseURL returns a PrepareDecorator that populates the http.Request with a url.URL constructed +// from the supplied baseUrl. +func WithBaseURL(baseURL string) PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + var u *url.URL + if u, err = url.Parse(baseURL); err != nil { + return r, err + } + if u.Scheme == "" { + err = fmt.Errorf("autorest: No scheme detected in URL %s", baseURL) + } + if err == nil { + r.URL = u + } + } + return r, err + }) + } +} + +// WithCustomBaseURL returns a PrepareDecorator that replaces brace-enclosed keys within the +// request base URL (i.e., http.Request.URL) with the corresponding values from the passed map. +func WithCustomBaseURL(baseURL string, urlParameters map[string]interface{}) PrepareDecorator { + parameters := ensureValueStrings(urlParameters) + for key, value := range parameters { + baseURL = strings.Replace(baseURL, "{"+key+"}", value, -1) + } + return WithBaseURL(baseURL) +} + +// WithFormData returns a PrepareDecoratore that "URL encodes" (e.g., bar=baz&foo=quux) into the +// http.Request body. +func WithFormData(v url.Values) PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + s := v.Encode() + + if r.Header == nil { + r.Header = make(http.Header) + } + r.Header.Set(http.CanonicalHeaderKey(headerContentType), mimeTypeFormPost) + r.ContentLength = int64(len(s)) + r.Body = ioutil.NopCloser(strings.NewReader(s)) + } + return r, err + }) + } +} + +// WithMultiPartFormData returns a PrepareDecoratore that "URL encodes" (e.g., bar=baz&foo=quux) form parameters +// into the http.Request body. +func WithMultiPartFormData(formDataParameters map[string]interface{}) PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + var body bytes.Buffer + writer := multipart.NewWriter(&body) + for key, value := range formDataParameters { + if rc, ok := value.(io.ReadCloser); ok { + var fd io.Writer + if fd, err = writer.CreateFormFile(key, key); err != nil { + return r, err + } + if _, err = io.Copy(fd, rc); err != nil { + return r, err + } + } else { + if err = writer.WriteField(key, ensureValueString(value)); err != nil { + return r, err + } + } + } + if err = writer.Close(); err != nil { + return r, err + } + if r.Header == nil { + r.Header = make(http.Header) + } + r.Header.Set(http.CanonicalHeaderKey(headerContentType), writer.FormDataContentType()) + r.Body = ioutil.NopCloser(bytes.NewReader(body.Bytes())) + r.ContentLength = int64(body.Len()) + return r, err + } + return r, err + }) + } +} + +// WithFile returns a PrepareDecorator that sends file in request body. +func WithFile(f io.ReadCloser) PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + b, err := ioutil.ReadAll(f) + if err != nil { + return r, err + } + r.Body = ioutil.NopCloser(bytes.NewReader(b)) + r.ContentLength = int64(len(b)) + } + return r, err + }) + } +} + +// WithBool returns a PrepareDecorator that encodes the passed bool into the body of the request +// and sets the Content-Length header. +func WithBool(v bool) PrepareDecorator { + return WithString(fmt.Sprintf("%v", v)) +} + +// WithFloat32 returns a PrepareDecorator that encodes the passed float32 into the body of the +// request and sets the Content-Length header. +func WithFloat32(v float32) PrepareDecorator { + return WithString(fmt.Sprintf("%v", v)) +} + +// WithFloat64 returns a PrepareDecorator that encodes the passed float64 into the body of the +// request and sets the Content-Length header. +func WithFloat64(v float64) PrepareDecorator { + return WithString(fmt.Sprintf("%v", v)) +} + +// WithInt32 returns a PrepareDecorator that encodes the passed int32 into the body of the request +// and sets the Content-Length header. +func WithInt32(v int32) PrepareDecorator { + return WithString(fmt.Sprintf("%v", v)) +} + +// WithInt64 returns a PrepareDecorator that encodes the passed int64 into the body of the request +// and sets the Content-Length header. +func WithInt64(v int64) PrepareDecorator { + return WithString(fmt.Sprintf("%v", v)) +} + +// WithString returns a PrepareDecorator that encodes the passed string into the body of the request +// and sets the Content-Length header. +func WithString(v string) PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + r.ContentLength = int64(len(v)) + r.Body = ioutil.NopCloser(strings.NewReader(v)) + } + return r, err + }) + } +} + +// WithJSON returns a PrepareDecorator that encodes the data passed as JSON into the body of the +// request and sets the Content-Length header. +func WithJSON(v interface{}) PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + b, err := json.Marshal(v) + if err == nil { + r.ContentLength = int64(len(b)) + r.Body = ioutil.NopCloser(bytes.NewReader(b)) + } + } + return r, err + }) + } +} + +// WithPath returns a PrepareDecorator that adds the supplied path to the request URL. If the path +// is absolute (that is, it begins with a "/"), it replaces the existing path. +func WithPath(path string) PrepareDecorator { + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + if r.URL == nil { + return r, NewError("autorest", "WithPath", "Invoked with a nil URL") + } + if r.URL, err = parseURL(r.URL, path); err != nil { + return r, err + } + } + return r, err + }) + } +} + +// WithEscapedPathParameters returns a PrepareDecorator that replaces brace-enclosed keys within the +// request path (i.e., http.Request.URL.Path) with the corresponding values from the passed map. The +// values will be escaped (aka URL encoded) before insertion into the path. +func WithEscapedPathParameters(path string, pathParameters map[string]interface{}) PrepareDecorator { + parameters := escapeValueStrings(ensureValueStrings(pathParameters)) + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + if r.URL == nil { + return r, NewError("autorest", "WithEscapedPathParameters", "Invoked with a nil URL") + } + for key, value := range parameters { + path = strings.Replace(path, "{"+key+"}", value, -1) + } + if r.URL, err = parseURL(r.URL, path); err != nil { + return r, err + } + } + return r, err + }) + } +} + +// WithPathParameters returns a PrepareDecorator that replaces brace-enclosed keys within the +// request path (i.e., http.Request.URL.Path) with the corresponding values from the passed map. +func WithPathParameters(path string, pathParameters map[string]interface{}) PrepareDecorator { + parameters := ensureValueStrings(pathParameters) + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + if r.URL == nil { + return r, NewError("autorest", "WithPathParameters", "Invoked with a nil URL") + } + for key, value := range parameters { + path = strings.Replace(path, "{"+key+"}", value, -1) + } + + if r.URL, err = parseURL(r.URL, path); err != nil { + return r, err + } + } + return r, err + }) + } +} + +func parseURL(u *url.URL, path string) (*url.URL, error) { + p := strings.TrimRight(u.String(), "/") + if !strings.HasPrefix(path, "/") { + path = "/" + path + } + return url.Parse(p + path) +} + +// WithQueryParameters returns a PrepareDecorators that encodes and applies the query parameters +// given in the supplied map (i.e., key=value). +func WithQueryParameters(queryParameters map[string]interface{}) PrepareDecorator { + parameters := ensureValueStrings(queryParameters) + return func(p Preparer) Preparer { + return PreparerFunc(func(r *http.Request) (*http.Request, error) { + r, err := p.Prepare(r) + if err == nil { + if r.URL == nil { + return r, NewError("autorest", "WithQueryParameters", "Invoked with a nil URL") + } + + v := r.URL.Query() + for key, value := range parameters { + d, err := url.QueryUnescape(value) + if err != nil { + return r, err + } + v.Add(key, d) + } + r.URL.RawQuery = v.Encode() + } + return r, err + }) + } +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/responder.go b/vendor/github.com/Azure/go-autorest/autorest/responder.go new file mode 100644 index 00000000..a908a0ad --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/responder.go @@ -0,0 +1,250 @@ +package autorest + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "bytes" + "encoding/json" + "encoding/xml" + "fmt" + "io" + "io/ioutil" + "net/http" + "strings" +) + +// Responder is the interface that wraps the Respond method. +// +// Respond accepts and reacts to an http.Response. Implementations must ensure to not share or hold +// state since Responders may be shared and re-used. +type Responder interface { + Respond(*http.Response) error +} + +// ResponderFunc is a method that implements the Responder interface. +type ResponderFunc func(*http.Response) error + +// Respond implements the Responder interface on ResponderFunc. +func (rf ResponderFunc) Respond(r *http.Response) error { + return rf(r) +} + +// RespondDecorator takes and possibly decorates, by wrapping, a Responder. Decorators may react to +// the http.Response and pass it along or, first, pass the http.Response along then react. +type RespondDecorator func(Responder) Responder + +// CreateResponder creates, decorates, and returns a Responder. Without decorators, the returned +// Responder returns the passed http.Response unmodified. Responders may or may not be safe to share +// and re-used: It depends on the applied decorators. For example, a standard decorator that closes +// the response body is fine to share whereas a decorator that reads the body into a passed struct +// is not. +// +// To prevent memory leaks, ensure that at least one Responder closes the response body. +func CreateResponder(decorators ...RespondDecorator) Responder { + return DecorateResponder( + Responder(ResponderFunc(func(r *http.Response) error { return nil })), + decorators...) +} + +// DecorateResponder accepts a Responder and a, possibly empty, set of RespondDecorators, which it +// applies to the Responder. Decorators are applied in the order received, but their affect upon the +// request depends on whether they are a pre-decorator (react to the http.Response and then pass it +// along) or a post-decorator (pass the http.Response along and then react). +func DecorateResponder(r Responder, decorators ...RespondDecorator) Responder { + for _, decorate := range decorators { + r = decorate(r) + } + return r +} + +// Respond accepts an http.Response and a, possibly empty, set of RespondDecorators. +// It creates a Responder from the decorators it then applies to the passed http.Response. +func Respond(r *http.Response, decorators ...RespondDecorator) error { + if r == nil { + return nil + } + return CreateResponder(decorators...).Respond(r) +} + +// ByIgnoring returns a RespondDecorator that ignores the passed http.Response passing it unexamined +// to the next RespondDecorator. +func ByIgnoring() RespondDecorator { + return func(r Responder) Responder { + return ResponderFunc(func(resp *http.Response) error { + return r.Respond(resp) + }) + } +} + +// ByCopying copies the contents of the http.Response Body into the passed bytes.Buffer as +// the Body is read. +func ByCopying(b *bytes.Buffer) RespondDecorator { + return func(r Responder) Responder { + return ResponderFunc(func(resp *http.Response) error { + err := r.Respond(resp) + if err == nil && resp != nil && resp.Body != nil { + resp.Body = TeeReadCloser(resp.Body, b) + } + return err + }) + } +} + +// ByDiscardingBody returns a RespondDecorator that first invokes the passed Responder after which +// it copies the remaining bytes (if any) in the response body to ioutil.Discard. Since the passed +// Responder is invoked prior to discarding the response body, the decorator may occur anywhere +// within the set. +func ByDiscardingBody() RespondDecorator { + return func(r Responder) Responder { + return ResponderFunc(func(resp *http.Response) error { + err := r.Respond(resp) + if err == nil && resp != nil && resp.Body != nil { + if _, err := io.Copy(ioutil.Discard, resp.Body); err != nil { + return fmt.Errorf("Error discarding the response body: %v", err) + } + } + return err + }) + } +} + +// ByClosing returns a RespondDecorator that first invokes the passed Responder after which it +// closes the response body. Since the passed Responder is invoked prior to closing the response +// body, the decorator may occur anywhere within the set. +func ByClosing() RespondDecorator { + return func(r Responder) Responder { + return ResponderFunc(func(resp *http.Response) error { + err := r.Respond(resp) + if resp != nil && resp.Body != nil { + if err := resp.Body.Close(); err != nil { + return fmt.Errorf("Error closing the response body: %v", err) + } + } + return err + }) + } +} + +// ByClosingIfError returns a RespondDecorator that first invokes the passed Responder after which +// it closes the response if the passed Responder returns an error and the response body exists. +func ByClosingIfError() RespondDecorator { + return func(r Responder) Responder { + return ResponderFunc(func(resp *http.Response) error { + err := r.Respond(resp) + if err != nil && resp != nil && resp.Body != nil { + if err := resp.Body.Close(); err != nil { + return fmt.Errorf("Error closing the response body: %v", err) + } + } + return err + }) + } +} + +// ByUnmarshallingJSON returns a RespondDecorator that decodes a JSON document returned in the +// response Body into the value pointed to by v. +func ByUnmarshallingJSON(v interface{}) RespondDecorator { + return func(r Responder) Responder { + return ResponderFunc(func(resp *http.Response) error { + err := r.Respond(resp) + if err == nil { + b, errInner := ioutil.ReadAll(resp.Body) + // Some responses might include a BOM, remove for successful unmarshalling + b = bytes.TrimPrefix(b, []byte("\xef\xbb\xbf")) + if errInner != nil { + err = fmt.Errorf("Error occurred reading http.Response#Body - Error = '%v'", errInner) + } else if len(strings.Trim(string(b), " ")) > 0 { + errInner = json.Unmarshal(b, v) + if errInner != nil { + err = fmt.Errorf("Error occurred unmarshalling JSON - Error = '%v' JSON = '%s'", errInner, string(b)) + } + } + } + return err + }) + } +} + +// ByUnmarshallingXML returns a RespondDecorator that decodes a XML document returned in the +// response Body into the value pointed to by v. +func ByUnmarshallingXML(v interface{}) RespondDecorator { + return func(r Responder) Responder { + return ResponderFunc(func(resp *http.Response) error { + err := r.Respond(resp) + if err == nil { + b, errInner := ioutil.ReadAll(resp.Body) + if errInner != nil { + err = fmt.Errorf("Error occurred reading http.Response#Body - Error = '%v'", errInner) + } else { + errInner = xml.Unmarshal(b, v) + if errInner != nil { + err = fmt.Errorf("Error occurred unmarshalling Xml - Error = '%v' Xml = '%s'", errInner, string(b)) + } + } + } + return err + }) + } +} + +// WithErrorUnlessStatusCode returns a RespondDecorator that emits an error unless the response +// StatusCode is among the set passed. On error, response body is fully read into a buffer and +// presented in the returned error, as well as in the response body. +func WithErrorUnlessStatusCode(codes ...int) RespondDecorator { + return func(r Responder) Responder { + return ResponderFunc(func(resp *http.Response) error { + err := r.Respond(resp) + if err == nil && !ResponseHasStatusCode(resp, codes...) { + derr := NewErrorWithResponse("autorest", "WithErrorUnlessStatusCode", resp, "%v %v failed with %s", + resp.Request.Method, + resp.Request.URL, + resp.Status) + if resp.Body != nil { + defer resp.Body.Close() + b, _ := ioutil.ReadAll(resp.Body) + derr.ServiceError = b + resp.Body = ioutil.NopCloser(bytes.NewReader(b)) + } + err = derr + } + return err + }) + } +} + +// WithErrorUnlessOK returns a RespondDecorator that emits an error if the response StatusCode is +// anything other than HTTP 200. +func WithErrorUnlessOK() RespondDecorator { + return WithErrorUnlessStatusCode(http.StatusOK) +} + +// ExtractHeader extracts all values of the specified header from the http.Response. It returns an +// empty string slice if the passed http.Response is nil or the header does not exist. +func ExtractHeader(header string, resp *http.Response) []string { + if resp != nil && resp.Header != nil { + return resp.Header[http.CanonicalHeaderKey(header)] + } + return nil +} + +// ExtractHeaderValue extracts the first value of the specified header from the http.Response. It +// returns an empty string if the passed http.Response is nil or the header does not exist. +func ExtractHeaderValue(header string, resp *http.Response) string { + h := ExtractHeader(header, resp) + if len(h) > 0 { + return h[0] + } + return "" +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/retriablerequest.go b/vendor/github.com/Azure/go-autorest/autorest/retriablerequest.go new file mode 100644 index 00000000..fa11dbed --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/retriablerequest.go @@ -0,0 +1,52 @@ +package autorest + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "bytes" + "io" + "io/ioutil" + "net/http" +) + +// NewRetriableRequest returns a wrapper around an HTTP request that support retry logic. +func NewRetriableRequest(req *http.Request) *RetriableRequest { + return &RetriableRequest{req: req} +} + +// Request returns the wrapped HTTP request. +func (rr *RetriableRequest) Request() *http.Request { + return rr.req +} + +func (rr *RetriableRequest) prepareFromByteReader() (err error) { + // fall back to making a copy (only do this once) + b := []byte{} + if rr.req.ContentLength > 0 { + b = make([]byte, rr.req.ContentLength) + _, err = io.ReadFull(rr.req.Body, b) + if err != nil { + return err + } + } else { + b, err = ioutil.ReadAll(rr.req.Body) + if err != nil { + return err + } + } + rr.br = bytes.NewReader(b) + rr.req.Body = ioutil.NopCloser(rr.br) + return err +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go b/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go new file mode 100644 index 00000000..7143cc61 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go @@ -0,0 +1,54 @@ +// +build !go1.8 + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package autorest + +import ( + "bytes" + "io/ioutil" + "net/http" +) + +// RetriableRequest provides facilities for retrying an HTTP request. +type RetriableRequest struct { + req *http.Request + br *bytes.Reader +} + +// Prepare signals that the request is about to be sent. +func (rr *RetriableRequest) Prepare() (err error) { + // preserve the request body; this is to support retry logic as + // the underlying transport will always close the reqeust body + if rr.req.Body != nil { + if rr.br != nil { + _, err = rr.br.Seek(0, 0 /*io.SeekStart*/) + rr.req.Body = ioutil.NopCloser(rr.br) + } + if err != nil { + return err + } + if rr.br == nil { + // fall back to making a copy (only do this once) + err = rr.prepareFromByteReader() + } + } + return err +} + +func removeRequestBody(req *http.Request) { + req.Body = nil + req.ContentLength = 0 +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go b/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go new file mode 100644 index 00000000..ae15c6bf --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go @@ -0,0 +1,66 @@ +// +build go1.8 + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package autorest + +import ( + "bytes" + "io" + "io/ioutil" + "net/http" +) + +// RetriableRequest provides facilities for retrying an HTTP request. +type RetriableRequest struct { + req *http.Request + rc io.ReadCloser + br *bytes.Reader +} + +// Prepare signals that the request is about to be sent. +func (rr *RetriableRequest) Prepare() (err error) { + // preserve the request body; this is to support retry logic as + // the underlying transport will always close the reqeust body + if rr.req.Body != nil { + if rr.rc != nil { + rr.req.Body = rr.rc + } else if rr.br != nil { + _, err = rr.br.Seek(0, io.SeekStart) + rr.req.Body = ioutil.NopCloser(rr.br) + } + if err != nil { + return err + } + if rr.req.GetBody != nil { + // this will allow us to preserve the body without having to + // make a copy. note we need to do this on each iteration + rr.rc, err = rr.req.GetBody() + if err != nil { + return err + } + } else if rr.br == nil { + // fall back to making a copy (only do this once) + err = rr.prepareFromByteReader() + } + } + return err +} + +func removeRequestBody(req *http.Request) { + req.Body = nil + req.GetBody = nil + req.ContentLength = 0 +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/sender.go b/vendor/github.com/Azure/go-autorest/autorest/sender.go new file mode 100644 index 00000000..e8893a28 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/sender.go @@ -0,0 +1,325 @@ +package autorest + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "fmt" + "log" + "math" + "net/http" + "strconv" + "time" +) + +// Sender is the interface that wraps the Do method to send HTTP requests. +// +// The standard http.Client conforms to this interface. +type Sender interface { + Do(*http.Request) (*http.Response, error) +} + +// SenderFunc is a method that implements the Sender interface. +type SenderFunc func(*http.Request) (*http.Response, error) + +// Do implements the Sender interface on SenderFunc. +func (sf SenderFunc) Do(r *http.Request) (*http.Response, error) { + return sf(r) +} + +// SendDecorator takes and possibily decorates, by wrapping, a Sender. Decorators may affect the +// http.Request and pass it along or, first, pass the http.Request along then react to the +// http.Response result. +type SendDecorator func(Sender) Sender + +// CreateSender creates, decorates, and returns, as a Sender, the default http.Client. +func CreateSender(decorators ...SendDecorator) Sender { + return DecorateSender(&http.Client{}, decorators...) +} + +// DecorateSender accepts a Sender and a, possibly empty, set of SendDecorators, which is applies to +// the Sender. Decorators are applied in the order received, but their affect upon the request +// depends on whether they are a pre-decorator (change the http.Request and then pass it along) or a +// post-decorator (pass the http.Request along and react to the results in http.Response). +func DecorateSender(s Sender, decorators ...SendDecorator) Sender { + for _, decorate := range decorators { + s = decorate(s) + } + return s +} + +// Send sends, by means of the default http.Client, the passed http.Request, returning the +// http.Response and possible error. It also accepts a, possibly empty, set of SendDecorators which +// it will apply the http.Client before invoking the Do method. +// +// Send is a convenience method and not recommended for production. Advanced users should use +// SendWithSender, passing and sharing their own Sender (e.g., instance of http.Client). +// +// Send will not poll or retry requests. +func Send(r *http.Request, decorators ...SendDecorator) (*http.Response, error) { + return SendWithSender(&http.Client{}, r, decorators...) +} + +// SendWithSender sends the passed http.Request, through the provided Sender, returning the +// http.Response and possible error. It also accepts a, possibly empty, set of SendDecorators which +// it will apply the http.Client before invoking the Do method. +// +// SendWithSender will not poll or retry requests. +func SendWithSender(s Sender, r *http.Request, decorators ...SendDecorator) (*http.Response, error) { + return DecorateSender(s, decorators...).Do(r) +} + +// AfterDelay returns a SendDecorator that delays for the passed time.Duration before +// invoking the Sender. The delay may be terminated by closing the optional channel on the +// http.Request. If canceled, no further Senders are invoked. +func AfterDelay(d time.Duration) SendDecorator { + return func(s Sender) Sender { + return SenderFunc(func(r *http.Request) (*http.Response, error) { + if !DelayForBackoff(d, 0, r.Context().Done()) { + return nil, fmt.Errorf("autorest: AfterDelay canceled before full delay") + } + return s.Do(r) + }) + } +} + +// AsIs returns a SendDecorator that invokes the passed Sender without modifying the http.Request. +func AsIs() SendDecorator { + return func(s Sender) Sender { + return SenderFunc(func(r *http.Request) (*http.Response, error) { + return s.Do(r) + }) + } +} + +// DoCloseIfError returns a SendDecorator that first invokes the passed Sender after which +// it closes the response if the passed Sender returns an error and the response body exists. +func DoCloseIfError() SendDecorator { + return func(s Sender) Sender { + return SenderFunc(func(r *http.Request) (*http.Response, error) { + resp, err := s.Do(r) + if err != nil { + Respond(resp, ByDiscardingBody(), ByClosing()) + } + return resp, err + }) + } +} + +// DoErrorIfStatusCode returns a SendDecorator that emits an error if the response StatusCode is +// among the set passed. Since these are artificial errors, the response body may still require +// closing. +func DoErrorIfStatusCode(codes ...int) SendDecorator { + return func(s Sender) Sender { + return SenderFunc(func(r *http.Request) (*http.Response, error) { + resp, err := s.Do(r) + if err == nil && ResponseHasStatusCode(resp, codes...) { + err = NewErrorWithResponse("autorest", "DoErrorIfStatusCode", resp, "%v %v failed with %s", + resp.Request.Method, + resp.Request.URL, + resp.Status) + } + return resp, err + }) + } +} + +// DoErrorUnlessStatusCode returns a SendDecorator that emits an error unless the response +// StatusCode is among the set passed. Since these are artificial errors, the response body +// may still require closing. +func DoErrorUnlessStatusCode(codes ...int) SendDecorator { + return func(s Sender) Sender { + return SenderFunc(func(r *http.Request) (*http.Response, error) { + resp, err := s.Do(r) + if err == nil && !ResponseHasStatusCode(resp, codes...) { + err = NewErrorWithResponse("autorest", "DoErrorUnlessStatusCode", resp, "%v %v failed with %s", + resp.Request.Method, + resp.Request.URL, + resp.Status) + } + return resp, err + }) + } +} + +// DoPollForStatusCodes returns a SendDecorator that polls if the http.Response contains one of the +// passed status codes. It expects the http.Response to contain a Location header providing the +// URL at which to poll (using GET) and will poll until the time passed is equal to or greater than +// the supplied duration. It will delay between requests for the duration specified in the +// RetryAfter header or, if the header is absent, the passed delay. Polling may be canceled by +// closing the optional channel on the http.Request. +func DoPollForStatusCodes(duration time.Duration, delay time.Duration, codes ...int) SendDecorator { + return func(s Sender) Sender { + return SenderFunc(func(r *http.Request) (resp *http.Response, err error) { + resp, err = s.Do(r) + + if err == nil && ResponseHasStatusCode(resp, codes...) { + r, err = NewPollingRequestWithContext(r.Context(), resp) + + for err == nil && ResponseHasStatusCode(resp, codes...) { + Respond(resp, + ByDiscardingBody(), + ByClosing()) + resp, err = SendWithSender(s, r, + AfterDelay(GetRetryAfter(resp, delay))) + } + } + + return resp, err + }) + } +} + +// DoRetryForAttempts returns a SendDecorator that retries a failed request for up to the specified +// number of attempts, exponentially backing off between requests using the supplied backoff +// time.Duration (which may be zero). Retrying may be canceled by closing the optional channel on +// the http.Request. +func DoRetryForAttempts(attempts int, backoff time.Duration) SendDecorator { + return func(s Sender) Sender { + return SenderFunc(func(r *http.Request) (resp *http.Response, err error) { + rr := NewRetriableRequest(r) + for attempt := 0; attempt < attempts; attempt++ { + err = rr.Prepare() + if err != nil { + return resp, err + } + resp, err = s.Do(rr.Request()) + if err == nil { + return resp, err + } + if !DelayForBackoff(backoff, attempt, r.Context().Done()) { + return nil, r.Context().Err() + } + } + return resp, err + }) + } +} + +// DoRetryForStatusCodes returns a SendDecorator that retries for specified statusCodes for up to the specified +// number of attempts, exponentially backing off between requests using the supplied backoff +// time.Duration (which may be zero). Retrying may be canceled by closing the optional channel on +// the http.Request. +func DoRetryForStatusCodes(attempts int, backoff time.Duration, codes ...int) SendDecorator { + return func(s Sender) Sender { + return SenderFunc(func(r *http.Request) (resp *http.Response, err error) { + rr := NewRetriableRequest(r) + // Increment to add the first call (attempts denotes number of retries) + attempts++ + for attempt := 0; attempt < attempts; { + err = rr.Prepare() + if err != nil { + return resp, err + } + resp, err = s.Do(rr.Request()) + // if the error isn't temporary don't bother retrying + if err != nil && !IsTemporaryNetworkError(err) { + return nil, err + } + // we want to retry if err is not nil (e.g. transient network failure). note that for failed authentication + // resp and err will both have a value, so in this case we don't want to retry as it will never succeed. + if err == nil && !ResponseHasStatusCode(resp, codes...) || IsTokenRefreshError(err) { + return resp, err + } + delayed := DelayWithRetryAfter(resp, r.Context().Done()) + if !delayed && !DelayForBackoff(backoff, attempt, r.Context().Done()) { + return resp, r.Context().Err() + } + // don't count a 429 against the number of attempts + // so that we continue to retry until it succeeds + if resp == nil || resp.StatusCode != http.StatusTooManyRequests { + attempt++ + } + } + return resp, err + }) + } +} + +// DelayWithRetryAfter invokes time.After for the duration specified in the "Retry-After" header in +// responses with status code 429 +func DelayWithRetryAfter(resp *http.Response, cancel <-chan struct{}) bool { + if resp == nil { + return false + } + retryAfter, _ := strconv.Atoi(resp.Header.Get("Retry-After")) + if resp.StatusCode == http.StatusTooManyRequests && retryAfter > 0 { + select { + case <-time.After(time.Duration(retryAfter) * time.Second): + return true + case <-cancel: + return false + } + } + return false +} + +// DoRetryForDuration returns a SendDecorator that retries the request until the total time is equal +// to or greater than the specified duration, exponentially backing off between requests using the +// supplied backoff time.Duration (which may be zero). Retrying may be canceled by closing the +// optional channel on the http.Request. +func DoRetryForDuration(d time.Duration, backoff time.Duration) SendDecorator { + return func(s Sender) Sender { + return SenderFunc(func(r *http.Request) (resp *http.Response, err error) { + rr := NewRetriableRequest(r) + end := time.Now().Add(d) + for attempt := 0; time.Now().Before(end); attempt++ { + err = rr.Prepare() + if err != nil { + return resp, err + } + resp, err = s.Do(rr.Request()) + if err == nil { + return resp, err + } + if !DelayForBackoff(backoff, attempt, r.Context().Done()) { + return nil, r.Context().Err() + } + } + return resp, err + }) + } +} + +// WithLogging returns a SendDecorator that implements simple before and after logging of the +// request. +func WithLogging(logger *log.Logger) SendDecorator { + return func(s Sender) Sender { + return SenderFunc(func(r *http.Request) (*http.Response, error) { + logger.Printf("Sending %s %s", r.Method, r.URL) + resp, err := s.Do(r) + if err != nil { + logger.Printf("%s %s received error '%v'", r.Method, r.URL, err) + } else { + logger.Printf("%s %s received %s", r.Method, r.URL, resp.Status) + } + return resp, err + }) + } +} + +// DelayForBackoff invokes time.After for the supplied backoff duration raised to the power of +// passed attempt (i.e., an exponential backoff delay). Backoff duration is in seconds and can set +// to zero for no delay. The delay may be canceled by closing the passed channel. If terminated early, +// returns false. +// Note: Passing attempt 1 will result in doubling "backoff" duration. Treat this as a zero-based attempt +// count. +func DelayForBackoff(backoff time.Duration, attempt int, cancel <-chan struct{}) bool { + select { + case <-time.After(time.Duration(backoff.Seconds()*math.Pow(2, float64(attempt))) * time.Second): + return true + case <-cancel: + return false + } +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/utility.go b/vendor/github.com/Azure/go-autorest/autorest/utility.go new file mode 100644 index 00000000..bfddd90b --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/utility.go @@ -0,0 +1,228 @@ +package autorest + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "bytes" + "encoding/json" + "encoding/xml" + "fmt" + "io" + "net" + "net/http" + "net/url" + "reflect" + "strings" + + "github.com/Azure/go-autorest/autorest/adal" +) + +// EncodedAs is a series of constants specifying various data encodings +type EncodedAs string + +const ( + // EncodedAsJSON states that data is encoded as JSON + EncodedAsJSON EncodedAs = "JSON" + + // EncodedAsXML states that data is encoded as Xml + EncodedAsXML EncodedAs = "XML" +) + +// Decoder defines the decoding method json.Decoder and xml.Decoder share +type Decoder interface { + Decode(v interface{}) error +} + +// NewDecoder creates a new decoder appropriate to the passed encoding. +// encodedAs specifies the type of encoding and r supplies the io.Reader containing the +// encoded data. +func NewDecoder(encodedAs EncodedAs, r io.Reader) Decoder { + if encodedAs == EncodedAsJSON { + return json.NewDecoder(r) + } else if encodedAs == EncodedAsXML { + return xml.NewDecoder(r) + } + return nil +} + +// CopyAndDecode decodes the data from the passed io.Reader while making a copy. Having a copy +// is especially useful if there is a chance the data will fail to decode. +// encodedAs specifies the expected encoding, r provides the io.Reader to the data, and v +// is the decoding destination. +func CopyAndDecode(encodedAs EncodedAs, r io.Reader, v interface{}) (bytes.Buffer, error) { + b := bytes.Buffer{} + return b, NewDecoder(encodedAs, io.TeeReader(r, &b)).Decode(v) +} + +// TeeReadCloser returns a ReadCloser that writes to w what it reads from rc. +// It utilizes io.TeeReader to copy the data read and has the same behavior when reading. +// Further, when it is closed, it ensures that rc is closed as well. +func TeeReadCloser(rc io.ReadCloser, w io.Writer) io.ReadCloser { + return &teeReadCloser{rc, io.TeeReader(rc, w)} +} + +type teeReadCloser struct { + rc io.ReadCloser + r io.Reader +} + +func (t *teeReadCloser) Read(p []byte) (int, error) { + return t.r.Read(p) +} + +func (t *teeReadCloser) Close() error { + return t.rc.Close() +} + +func containsInt(ints []int, n int) bool { + for _, i := range ints { + if i == n { + return true + } + } + return false +} + +func escapeValueStrings(m map[string]string) map[string]string { + for key, value := range m { + m[key] = url.QueryEscape(value) + } + return m +} + +func ensureValueStrings(mapOfInterface map[string]interface{}) map[string]string { + mapOfStrings := make(map[string]string) + for key, value := range mapOfInterface { + mapOfStrings[key] = ensureValueString(value) + } + return mapOfStrings +} + +func ensureValueString(value interface{}) string { + if value == nil { + return "" + } + switch v := value.(type) { + case string: + return v + case []byte: + return string(v) + default: + return fmt.Sprintf("%v", v) + } +} + +// MapToValues method converts map[string]interface{} to url.Values. +func MapToValues(m map[string]interface{}) url.Values { + v := url.Values{} + for key, value := range m { + x := reflect.ValueOf(value) + if x.Kind() == reflect.Array || x.Kind() == reflect.Slice { + for i := 0; i < x.Len(); i++ { + v.Add(key, ensureValueString(x.Index(i))) + } + } else { + v.Add(key, ensureValueString(value)) + } + } + return v +} + +// AsStringSlice method converts interface{} to []string. This expects a +//that the parameter passed to be a slice or array of a type that has the underlying +//type a string. +func AsStringSlice(s interface{}) ([]string, error) { + v := reflect.ValueOf(s) + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return nil, NewError("autorest", "AsStringSlice", "the value's type is not an array.") + } + stringSlice := make([]string, 0, v.Len()) + + for i := 0; i < v.Len(); i++ { + stringSlice = append(stringSlice, v.Index(i).String()) + } + return stringSlice, nil +} + +// String method converts interface v to string. If interface is a list, it +// joins list elements using the seperator. Note that only sep[0] will be used for +// joining if any separator is specified. +func String(v interface{}, sep ...string) string { + if len(sep) == 0 { + return ensureValueString(v) + } + stringSlice, ok := v.([]string) + if ok == false { + var err error + stringSlice, err = AsStringSlice(v) + if err != nil { + panic(fmt.Sprintf("autorest: Couldn't convert value to a string %s.", err)) + } + } + return ensureValueString(strings.Join(stringSlice, sep[0])) +} + +// Encode method encodes url path and query parameters. +func Encode(location string, v interface{}, sep ...string) string { + s := String(v, sep...) + switch strings.ToLower(location) { + case "path": + return pathEscape(s) + case "query": + return queryEscape(s) + default: + return s + } +} + +func pathEscape(s string) string { + return strings.Replace(url.QueryEscape(s), "+", "%20", -1) +} + +func queryEscape(s string) string { + return url.QueryEscape(s) +} + +// ChangeToGet turns the specified http.Request into a GET (it assumes it wasn't). +// This is mainly useful for long-running operations that use the Azure-AsyncOperation +// header, so we change the initial PUT into a GET to retrieve the final result. +func ChangeToGet(req *http.Request) *http.Request { + req.Method = "GET" + req.Body = nil + req.ContentLength = 0 + req.Header.Del("Content-Length") + return req +} + +// IsTokenRefreshError returns true if the specified error implements the TokenRefreshError +// interface. If err is a DetailedError it will walk the chain of Original errors. +func IsTokenRefreshError(err error) bool { + if _, ok := err.(adal.TokenRefreshError); ok { + return true + } + if de, ok := err.(DetailedError); ok { + return IsTokenRefreshError(de.Original) + } + return false +} + +// IsTemporaryNetworkError returns true if the specified error is a temporary network error or false +// if it's not. If the error doesn't implement the net.Error interface the return value is true. +func IsTemporaryNetworkError(err error) bool { + if netErr, ok := err.(net.Error); !ok || (ok && netErr.Temporary()) { + return true + } + return false +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/version.go b/vendor/github.com/Azure/go-autorest/autorest/version.go new file mode 100644 index 00000000..3c645154 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/version.go @@ -0,0 +1,22 @@ +package autorest + +import "github.com/Azure/go-autorest/version" + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Version returns the semantic version (see http://semver.org). +func Version() string { + return version.Number +} diff --git a/vendor/github.com/Azure/go-autorest/logger/logger.go b/vendor/github.com/Azure/go-autorest/logger/logger.go new file mode 100644 index 00000000..756fd80c --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/logger/logger.go @@ -0,0 +1,328 @@ +package logger + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "strings" + "sync" + "time" +) + +// LevelType tells a logger the minimum level to log. When code reports a log entry, +// the LogLevel indicates the level of the log entry. The logger only records entries +// whose level is at least the level it was told to log. See the Log* constants. +// For example, if a logger is configured with LogError, then LogError, LogPanic, +// and LogFatal entries will be logged; lower level entries are ignored. +type LevelType uint32 + +const ( + // LogNone tells a logger not to log any entries passed to it. + LogNone LevelType = iota + + // LogFatal tells a logger to log all LogFatal entries passed to it. + LogFatal + + // LogPanic tells a logger to log all LogPanic and LogFatal entries passed to it. + LogPanic + + // LogError tells a logger to log all LogError, LogPanic and LogFatal entries passed to it. + LogError + + // LogWarning tells a logger to log all LogWarning, LogError, LogPanic and LogFatal entries passed to it. + LogWarning + + // LogInfo tells a logger to log all LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it. + LogInfo + + // LogDebug tells a logger to log all LogDebug, LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it. + LogDebug +) + +const ( + logNone = "NONE" + logFatal = "FATAL" + logPanic = "PANIC" + logError = "ERROR" + logWarning = "WARNING" + logInfo = "INFO" + logDebug = "DEBUG" + logUnknown = "UNKNOWN" +) + +// ParseLevel converts the specified string into the corresponding LevelType. +func ParseLevel(s string) (lt LevelType, err error) { + switch strings.ToUpper(s) { + case logFatal: + lt = LogFatal + case logPanic: + lt = LogPanic + case logError: + lt = LogError + case logWarning: + lt = LogWarning + case logInfo: + lt = LogInfo + case logDebug: + lt = LogDebug + default: + err = fmt.Errorf("bad log level '%s'", s) + } + return +} + +// String implements the stringer interface for LevelType. +func (lt LevelType) String() string { + switch lt { + case LogNone: + return logNone + case LogFatal: + return logFatal + case LogPanic: + return logPanic + case LogError: + return logError + case LogWarning: + return logWarning + case LogInfo: + return logInfo + case LogDebug: + return logDebug + default: + return logUnknown + } +} + +// Filter defines functions for filtering HTTP request/response content. +type Filter struct { + // URL returns a potentially modified string representation of a request URL. + URL func(u *url.URL) string + + // Header returns a potentially modified set of values for the specified key. + // To completely exclude the header key/values return false. + Header func(key string, val []string) (bool, []string) + + // Body returns a potentially modified request/response body. + Body func(b []byte) []byte +} + +func (f Filter) processURL(u *url.URL) string { + if f.URL == nil { + return u.String() + } + return f.URL(u) +} + +func (f Filter) processHeader(k string, val []string) (bool, []string) { + if f.Header == nil { + return true, val + } + return f.Header(k, val) +} + +func (f Filter) processBody(b []byte) []byte { + if f.Body == nil { + return b + } + return f.Body(b) +} + +// Writer defines methods for writing to a logging facility. +type Writer interface { + // Writeln writes the specified message with the standard log entry header and new-line character. + Writeln(level LevelType, message string) + + // Writef writes the specified format specifier with the standard log entry header and no new-line character. + Writef(level LevelType, format string, a ...interface{}) + + // WriteRequest writes the specified HTTP request to the logger if the log level is greater than + // or equal to LogInfo. The request body, if set, is logged at level LogDebug or higher. + // Custom filters can be specified to exclude URL, header, and/or body content from the log. + // By default no request content is excluded. + WriteRequest(req *http.Request, filter Filter) + + // WriteResponse writes the specified HTTP response to the logger if the log level is greater than + // or equal to LogInfo. The response body, if set, is logged at level LogDebug or higher. + // Custom filters can be specified to exclude URL, header, and/or body content from the log. + // By default no respone content is excluded. + WriteResponse(resp *http.Response, filter Filter) +} + +// Instance is the default log writer initialized during package init. +// This can be replaced with a custom implementation as required. +var Instance Writer + +// default log level +var logLevel = LogNone + +// Level returns the value specified in AZURE_GO_AUTOREST_LOG_LEVEL. +// If no value was specified the default value is LogNone. +// Custom loggers can call this to retrieve the configured log level. +func Level() LevelType { + return logLevel +} + +func init() { + // separated for testing purposes + initDefaultLogger() +} + +func initDefaultLogger() { + // init with nilLogger so callers don't have to do a nil check on Default + Instance = nilLogger{} + llStr := strings.ToLower(os.Getenv("AZURE_GO_SDK_LOG_LEVEL")) + if llStr == "" { + return + } + var err error + logLevel, err = ParseLevel(llStr) + if err != nil { + fmt.Fprintf(os.Stderr, "go-autorest: failed to parse log level: %s\n", err.Error()) + return + } + if logLevel == LogNone { + return + } + // default to stderr + dest := os.Stderr + lfStr := os.Getenv("AZURE_GO_SDK_LOG_FILE") + if strings.EqualFold(lfStr, "stdout") { + dest = os.Stdout + } else if lfStr != "" { + lf, err := os.Create(lfStr) + if err == nil { + dest = lf + } else { + fmt.Fprintf(os.Stderr, "go-autorest: failed to create log file, using stderr: %s\n", err.Error()) + } + } + Instance = fileLogger{ + logLevel: logLevel, + mu: &sync.Mutex{}, + logFile: dest, + } +} + +// the nil logger does nothing +type nilLogger struct{} + +func (nilLogger) Writeln(LevelType, string) {} + +func (nilLogger) Writef(LevelType, string, ...interface{}) {} + +func (nilLogger) WriteRequest(*http.Request, Filter) {} + +func (nilLogger) WriteResponse(*http.Response, Filter) {} + +// A File is used instead of a Logger so the stream can be flushed after every write. +type fileLogger struct { + logLevel LevelType + mu *sync.Mutex // for synchronizing writes to logFile + logFile *os.File +} + +func (fl fileLogger) Writeln(level LevelType, message string) { + fl.Writef(level, "%s\n", message) +} + +func (fl fileLogger) Writef(level LevelType, format string, a ...interface{}) { + if fl.logLevel >= level { + fl.mu.Lock() + defer fl.mu.Unlock() + fmt.Fprintf(fl.logFile, "%s %s", entryHeader(level), fmt.Sprintf(format, a...)) + fl.logFile.Sync() + } +} + +func (fl fileLogger) WriteRequest(req *http.Request, filter Filter) { + if req == nil || fl.logLevel < LogInfo { + return + } + b := &bytes.Buffer{} + fmt.Fprintf(b, "%s REQUEST: %s %s\n", entryHeader(LogInfo), req.Method, filter.processURL(req.URL)) + // dump headers + for k, v := range req.Header { + if ok, mv := filter.processHeader(k, v); ok { + fmt.Fprintf(b, "%s: %s\n", k, strings.Join(mv, ",")) + } + } + if fl.shouldLogBody(req.Header, req.Body) { + // dump body + body, err := ioutil.ReadAll(req.Body) + if err == nil { + fmt.Fprintln(b, string(filter.processBody(body))) + if nc, ok := req.Body.(io.Seeker); ok { + // rewind to the beginning + nc.Seek(0, io.SeekStart) + } else { + // recreate the body + req.Body = ioutil.NopCloser(bytes.NewReader(body)) + } + } else { + fmt.Fprintf(b, "failed to read body: %v\n", err) + } + } + fl.mu.Lock() + defer fl.mu.Unlock() + fmt.Fprint(fl.logFile, b.String()) + fl.logFile.Sync() +} + +func (fl fileLogger) WriteResponse(resp *http.Response, filter Filter) { + if resp == nil || fl.logLevel < LogInfo { + return + } + b := &bytes.Buffer{} + fmt.Fprintf(b, "%s RESPONSE: %d %s\n", entryHeader(LogInfo), resp.StatusCode, filter.processURL(resp.Request.URL)) + // dump headers + for k, v := range resp.Header { + if ok, mv := filter.processHeader(k, v); ok { + fmt.Fprintf(b, "%s: %s\n", k, strings.Join(mv, ",")) + } + } + if fl.shouldLogBody(resp.Header, resp.Body) { + // dump body + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err == nil { + fmt.Fprintln(b, string(filter.processBody(body))) + resp.Body = ioutil.NopCloser(bytes.NewReader(body)) + } else { + fmt.Fprintf(b, "failed to read body: %v\n", err) + } + } + fl.mu.Lock() + defer fl.mu.Unlock() + fmt.Fprint(fl.logFile, b.String()) + fl.logFile.Sync() +} + +// returns true if the provided body should be included in the log +func (fl fileLogger) shouldLogBody(header http.Header, body io.ReadCloser) bool { + ct := header.Get("Content-Type") + return fl.logLevel >= LogDebug && body != nil && strings.Index(ct, "application/octet-stream") == -1 +} + +// creates standard header for log entries, it contains a timestamp and the log level +func entryHeader(level LevelType) string { + // this format provides a fixed number of digits so the size of the timestamp is constant + return fmt.Sprintf("(%s) %s:", time.Now().Format("2006-01-02T15:04:05.0000000Z07:00"), level.String()) +} diff --git a/vendor/github.com/Azure/go-autorest/version/version.go b/vendor/github.com/Azure/go-autorest/version/version.go new file mode 100644 index 00000000..c9876a9b --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/version/version.go @@ -0,0 +1,37 @@ +package version + +// Copyright 2017 Microsoft Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import ( + "fmt" + "runtime" +) + +// Number contains the semantic version of this SDK. +const Number = "v11.1.2" + +var ( + userAgent = fmt.Sprintf("Go/%s (%s-%s) go-autorest/%s", + runtime.Version(), + runtime.GOARCH, + runtime.GOOS, + Number, + ) +) + +// UserAgent returns a string containing the Go version, system archityecture and OS, and the go-autorest version. +func UserAgent() string { + return userAgent +} diff --git a/vendor/github.com/Microsoft/go-winio/.gitignore b/vendor/github.com/Microsoft/go-winio/.gitignore new file mode 100644 index 00000000..b883f1fd --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/.gitignore @@ -0,0 +1 @@ +*.exe diff --git a/vendor/github.com/Microsoft/go-winio/LICENSE b/vendor/github.com/Microsoft/go-winio/LICENSE new file mode 100644 index 00000000..b8b569d7 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/vendor/github.com/Microsoft/go-winio/README.md b/vendor/github.com/Microsoft/go-winio/README.md new file mode 100644 index 00000000..56800105 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/README.md @@ -0,0 +1,22 @@ +# go-winio + +This repository contains utilities for efficiently performing Win32 IO operations in +Go. Currently, this is focused on accessing named pipes and other file handles, and +for using named pipes as a net transport. + +This code relies on IO completion ports to avoid blocking IO on system threads, allowing Go +to reuse the thread to schedule another goroutine. This limits support to Windows Vista and +newer operating systems. This is similar to the implementation of network sockets in Go's net +package. + +Please see the LICENSE file for licensing information. + +This project has adopted the [Microsoft Open Source Code of +Conduct](https://opensource.microsoft.com/codeofconduct/). For more information +see the [Code of Conduct +FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact +[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional +questions or comments. + +Thanks to natefinch for the inspiration for this library. See https://github.com/natefinch/npipe +for another named pipe implementation. diff --git a/vendor/github.com/Microsoft/go-winio/backup.go b/vendor/github.com/Microsoft/go-winio/backup.go new file mode 100644 index 00000000..2be34af4 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/backup.go @@ -0,0 +1,280 @@ +// +build windows + +package winio + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "runtime" + "syscall" + "unicode/utf16" +) + +//sys backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupRead +//sys backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupWrite + +const ( + BackupData = uint32(iota + 1) + BackupEaData + BackupSecurity + BackupAlternateData + BackupLink + BackupPropertyData + BackupObjectId + BackupReparseData + BackupSparseBlock + BackupTxfsData +) + +const ( + StreamSparseAttributes = uint32(8) +) + +const ( + WRITE_DAC = 0x40000 + WRITE_OWNER = 0x80000 + ACCESS_SYSTEM_SECURITY = 0x1000000 +) + +// BackupHeader represents a backup stream of a file. +type BackupHeader struct { + Id uint32 // The backup stream ID + Attributes uint32 // Stream attributes + Size int64 // The size of the stream in bytes + Name string // The name of the stream (for BackupAlternateData only). + Offset int64 // The offset of the stream in the file (for BackupSparseBlock only). +} + +type win32StreamId struct { + StreamId uint32 + Attributes uint32 + Size uint64 + NameSize uint32 +} + +// BackupStreamReader reads from a stream produced by the BackupRead Win32 API and produces a series +// of BackupHeader values. +type BackupStreamReader struct { + r io.Reader + bytesLeft int64 +} + +// NewBackupStreamReader produces a BackupStreamReader from any io.Reader. +func NewBackupStreamReader(r io.Reader) *BackupStreamReader { + return &BackupStreamReader{r, 0} +} + +// Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if +// it was not completely read. +func (r *BackupStreamReader) Next() (*BackupHeader, error) { + if r.bytesLeft > 0 { + if s, ok := r.r.(io.Seeker); ok { + // Make sure Seek on io.SeekCurrent sometimes succeeds + // before trying the actual seek. + if _, err := s.Seek(0, io.SeekCurrent); err == nil { + if _, err = s.Seek(r.bytesLeft, io.SeekCurrent); err != nil { + return nil, err + } + r.bytesLeft = 0 + } + } + if _, err := io.Copy(ioutil.Discard, r); err != nil { + return nil, err + } + } + var wsi win32StreamId + if err := binary.Read(r.r, binary.LittleEndian, &wsi); err != nil { + return nil, err + } + hdr := &BackupHeader{ + Id: wsi.StreamId, + Attributes: wsi.Attributes, + Size: int64(wsi.Size), + } + if wsi.NameSize != 0 { + name := make([]uint16, int(wsi.NameSize/2)) + if err := binary.Read(r.r, binary.LittleEndian, name); err != nil { + return nil, err + } + hdr.Name = syscall.UTF16ToString(name) + } + if wsi.StreamId == BackupSparseBlock { + if err := binary.Read(r.r, binary.LittleEndian, &hdr.Offset); err != nil { + return nil, err + } + hdr.Size -= 8 + } + r.bytesLeft = hdr.Size + return hdr, nil +} + +// Read reads from the current backup stream. +func (r *BackupStreamReader) Read(b []byte) (int, error) { + if r.bytesLeft == 0 { + return 0, io.EOF + } + if int64(len(b)) > r.bytesLeft { + b = b[:r.bytesLeft] + } + n, err := r.r.Read(b) + r.bytesLeft -= int64(n) + if err == io.EOF { + err = io.ErrUnexpectedEOF + } else if r.bytesLeft == 0 && err == nil { + err = io.EOF + } + return n, err +} + +// BackupStreamWriter writes a stream compatible with the BackupWrite Win32 API. +type BackupStreamWriter struct { + w io.Writer + bytesLeft int64 +} + +// NewBackupStreamWriter produces a BackupStreamWriter on top of an io.Writer. +func NewBackupStreamWriter(w io.Writer) *BackupStreamWriter { + return &BackupStreamWriter{w, 0} +} + +// WriteHeader writes the next backup stream header and prepares for calls to Write(). +func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error { + if w.bytesLeft != 0 { + return fmt.Errorf("missing %d bytes", w.bytesLeft) + } + name := utf16.Encode([]rune(hdr.Name)) + wsi := win32StreamId{ + StreamId: hdr.Id, + Attributes: hdr.Attributes, + Size: uint64(hdr.Size), + NameSize: uint32(len(name) * 2), + } + if hdr.Id == BackupSparseBlock { + // Include space for the int64 block offset + wsi.Size += 8 + } + if err := binary.Write(w.w, binary.LittleEndian, &wsi); err != nil { + return err + } + if len(name) != 0 { + if err := binary.Write(w.w, binary.LittleEndian, name); err != nil { + return err + } + } + if hdr.Id == BackupSparseBlock { + if err := binary.Write(w.w, binary.LittleEndian, hdr.Offset); err != nil { + return err + } + } + w.bytesLeft = hdr.Size + return nil +} + +// Write writes to the current backup stream. +func (w *BackupStreamWriter) Write(b []byte) (int, error) { + if w.bytesLeft < int64(len(b)) { + return 0, fmt.Errorf("too many bytes by %d", int64(len(b))-w.bytesLeft) + } + n, err := w.w.Write(b) + w.bytesLeft -= int64(n) + return n, err +} + +// BackupFileReader provides an io.ReadCloser interface on top of the BackupRead Win32 API. +type BackupFileReader struct { + f *os.File + includeSecurity bool + ctx uintptr +} + +// NewBackupFileReader returns a new BackupFileReader from a file handle. If includeSecurity is true, +// Read will attempt to read the security descriptor of the file. +func NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileReader { + r := &BackupFileReader{f, includeSecurity, 0} + return r +} + +// Read reads a backup stream from the file by calling the Win32 API BackupRead(). +func (r *BackupFileReader) Read(b []byte) (int, error) { + var bytesRead uint32 + err := backupRead(syscall.Handle(r.f.Fd()), b, &bytesRead, false, r.includeSecurity, &r.ctx) + if err != nil { + return 0, &os.PathError{"BackupRead", r.f.Name(), err} + } + runtime.KeepAlive(r.f) + if bytesRead == 0 { + return 0, io.EOF + } + return int(bytesRead), nil +} + +// Close frees Win32 resources associated with the BackupFileReader. It does not close +// the underlying file. +func (r *BackupFileReader) Close() error { + if r.ctx != 0 { + backupRead(syscall.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx) + runtime.KeepAlive(r.f) + r.ctx = 0 + } + return nil +} + +// BackupFileWriter provides an io.WriteCloser interface on top of the BackupWrite Win32 API. +type BackupFileWriter struct { + f *os.File + includeSecurity bool + ctx uintptr +} + +// NewBackupFileWriter returns a new BackupFileWriter from a file handle. If includeSecurity is true, +// Write() will attempt to restore the security descriptor from the stream. +func NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWriter { + w := &BackupFileWriter{f, includeSecurity, 0} + return w +} + +// Write restores a portion of the file using the provided backup stream. +func (w *BackupFileWriter) Write(b []byte) (int, error) { + var bytesWritten uint32 + err := backupWrite(syscall.Handle(w.f.Fd()), b, &bytesWritten, false, w.includeSecurity, &w.ctx) + if err != nil { + return 0, &os.PathError{"BackupWrite", w.f.Name(), err} + } + runtime.KeepAlive(w.f) + if int(bytesWritten) != len(b) { + return int(bytesWritten), errors.New("not all bytes could be written") + } + return len(b), nil +} + +// Close frees Win32 resources associated with the BackupFileWriter. It does not +// close the underlying file. +func (w *BackupFileWriter) Close() error { + if w.ctx != 0 { + backupWrite(syscall.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx) + runtime.KeepAlive(w.f) + w.ctx = 0 + } + return nil +} + +// OpenForBackup opens a file or directory, potentially skipping access checks if the backup +// or restore privileges have been acquired. +// +// If the file opened was a directory, it cannot be used with Readdir(). +func OpenForBackup(path string, access uint32, share uint32, createmode uint32) (*os.File, error) { + winPath, err := syscall.UTF16FromString(path) + if err != nil { + return nil, err + } + h, err := syscall.CreateFile(&winPath[0], access, share, nil, createmode, syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT, 0) + if err != nil { + err = &os.PathError{Op: "open", Path: path, Err: err} + return nil, err + } + return os.NewFile(uintptr(h), path), nil +} diff --git a/vendor/github.com/Microsoft/go-winio/ea.go b/vendor/github.com/Microsoft/go-winio/ea.go new file mode 100644 index 00000000..4051c1b3 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/ea.go @@ -0,0 +1,137 @@ +package winio + +import ( + "bytes" + "encoding/binary" + "errors" +) + +type fileFullEaInformation struct { + NextEntryOffset uint32 + Flags uint8 + NameLength uint8 + ValueLength uint16 +} + +var ( + fileFullEaInformationSize = binary.Size(&fileFullEaInformation{}) + + errInvalidEaBuffer = errors.New("invalid extended attribute buffer") + errEaNameTooLarge = errors.New("extended attribute name too large") + errEaValueTooLarge = errors.New("extended attribute value too large") +) + +// ExtendedAttribute represents a single Windows EA. +type ExtendedAttribute struct { + Name string + Value []byte + Flags uint8 +} + +func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) { + var info fileFullEaInformation + err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &info) + if err != nil { + err = errInvalidEaBuffer + return + } + + nameOffset := fileFullEaInformationSize + nameLen := int(info.NameLength) + valueOffset := nameOffset + int(info.NameLength) + 1 + valueLen := int(info.ValueLength) + nextOffset := int(info.NextEntryOffset) + if valueLen+valueOffset > len(b) || nextOffset < 0 || nextOffset > len(b) { + err = errInvalidEaBuffer + return + } + + ea.Name = string(b[nameOffset : nameOffset+nameLen]) + ea.Value = b[valueOffset : valueOffset+valueLen] + ea.Flags = info.Flags + if info.NextEntryOffset != 0 { + nb = b[info.NextEntryOffset:] + } + return +} + +// DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION +// buffer retrieved from BackupRead, ZwQueryEaFile, etc. +func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error) { + for len(b) != 0 { + ea, nb, err := parseEa(b) + if err != nil { + return nil, err + } + + eas = append(eas, ea) + b = nb + } + return +} + +func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error { + if int(uint8(len(ea.Name))) != len(ea.Name) { + return errEaNameTooLarge + } + if int(uint16(len(ea.Value))) != len(ea.Value) { + return errEaValueTooLarge + } + entrySize := uint32(fileFullEaInformationSize + len(ea.Name) + 1 + len(ea.Value)) + withPadding := (entrySize + 3) &^ 3 + nextOffset := uint32(0) + if !last { + nextOffset = withPadding + } + info := fileFullEaInformation{ + NextEntryOffset: nextOffset, + Flags: ea.Flags, + NameLength: uint8(len(ea.Name)), + ValueLength: uint16(len(ea.Value)), + } + + err := binary.Write(buf, binary.LittleEndian, &info) + if err != nil { + return err + } + + _, err = buf.Write([]byte(ea.Name)) + if err != nil { + return err + } + + err = buf.WriteByte(0) + if err != nil { + return err + } + + _, err = buf.Write(ea.Value) + if err != nil { + return err + } + + _, err = buf.Write([]byte{0, 0, 0}[0 : withPadding-entrySize]) + if err != nil { + return err + } + + return nil +} + +// EncodeExtendedAttributes encodes a list of EAs into a FILE_FULL_EA_INFORMATION +// buffer for use with BackupWrite, ZwSetEaFile, etc. +func EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error) { + var buf bytes.Buffer + for i := range eas { + last := false + if i == len(eas)-1 { + last = true + } + + err := writeEa(&buf, &eas[i], last) + if err != nil { + return nil, err + } + } + return buf.Bytes(), nil +} diff --git a/vendor/github.com/Microsoft/go-winio/file.go b/vendor/github.com/Microsoft/go-winio/file.go new file mode 100644 index 00000000..0385e410 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/file.go @@ -0,0 +1,323 @@ +// +build windows + +package winio + +import ( + "errors" + "io" + "runtime" + "sync" + "sync/atomic" + "syscall" + "time" +) + +//sys cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) = CancelIoEx +//sys createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) = CreateIoCompletionPort +//sys getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) = GetQueuedCompletionStatus +//sys setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) = SetFileCompletionNotificationModes +//sys wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult + +type atomicBool int32 + +func (b *atomicBool) isSet() bool { return atomic.LoadInt32((*int32)(b)) != 0 } +func (b *atomicBool) setFalse() { atomic.StoreInt32((*int32)(b), 0) } +func (b *atomicBool) setTrue() { atomic.StoreInt32((*int32)(b), 1) } +func (b *atomicBool) swap(new bool) bool { + var newInt int32 + if new { + newInt = 1 + } + return atomic.SwapInt32((*int32)(b), newInt) == 1 +} + +const ( + cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1 + cFILE_SKIP_SET_EVENT_ON_HANDLE = 2 +) + +var ( + ErrFileClosed = errors.New("file has already been closed") + ErrTimeout = &timeoutError{} +) + +type timeoutError struct{} + +func (e *timeoutError) Error() string { return "i/o timeout" } +func (e *timeoutError) Timeout() bool { return true } +func (e *timeoutError) Temporary() bool { return true } + +type timeoutChan chan struct{} + +var ioInitOnce sync.Once +var ioCompletionPort syscall.Handle + +// ioResult contains the result of an asynchronous IO operation +type ioResult struct { + bytes uint32 + err error +} + +// ioOperation represents an outstanding asynchronous Win32 IO +type ioOperation struct { + o syscall.Overlapped + ch chan ioResult +} + +func initIo() { + h, err := createIoCompletionPort(syscall.InvalidHandle, 0, 0, 0xffffffff) + if err != nil { + panic(err) + } + ioCompletionPort = h + go ioCompletionProcessor(h) +} + +// win32File implements Reader, Writer, and Closer on a Win32 handle without blocking in a syscall. +// It takes ownership of this handle and will close it if it is garbage collected. +type win32File struct { + handle syscall.Handle + wg sync.WaitGroup + wgLock sync.RWMutex + closing atomicBool + socket bool + readDeadline deadlineHandler + writeDeadline deadlineHandler +} + +type deadlineHandler struct { + setLock sync.Mutex + channel timeoutChan + channelLock sync.RWMutex + timer *time.Timer + timedout atomicBool +} + +// makeWin32File makes a new win32File from an existing file handle +func makeWin32File(h syscall.Handle) (*win32File, error) { + f := &win32File{handle: h} + ioInitOnce.Do(initIo) + _, err := createIoCompletionPort(h, ioCompletionPort, 0, 0xffffffff) + if err != nil { + return nil, err + } + err = setFileCompletionNotificationModes(h, cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS|cFILE_SKIP_SET_EVENT_ON_HANDLE) + if err != nil { + return nil, err + } + f.readDeadline.channel = make(timeoutChan) + f.writeDeadline.channel = make(timeoutChan) + return f, nil +} + +func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) { + // If we return the result of makeWin32File directly, it can result in an + // interface-wrapped nil, rather than a nil interface value. + f, err := makeWin32File(h) + if err != nil { + return nil, err + } + return f, nil +} + +// closeHandle closes the resources associated with a Win32 handle +func (f *win32File) closeHandle() { + f.wgLock.Lock() + // Atomically set that we are closing, releasing the resources only once. + if !f.closing.swap(true) { + f.wgLock.Unlock() + // cancel all IO and wait for it to complete + cancelIoEx(f.handle, nil) + f.wg.Wait() + // at this point, no new IO can start + syscall.Close(f.handle) + f.handle = 0 + } else { + f.wgLock.Unlock() + } +} + +// Close closes a win32File. +func (f *win32File) Close() error { + f.closeHandle() + return nil +} + +// prepareIo prepares for a new IO operation. +// The caller must call f.wg.Done() when the IO is finished, prior to Close() returning. +func (f *win32File) prepareIo() (*ioOperation, error) { + f.wgLock.RLock() + if f.closing.isSet() { + f.wgLock.RUnlock() + return nil, ErrFileClosed + } + f.wg.Add(1) + f.wgLock.RUnlock() + c := &ioOperation{} + c.ch = make(chan ioResult) + return c, nil +} + +// ioCompletionProcessor processes completed async IOs forever +func ioCompletionProcessor(h syscall.Handle) { + for { + var bytes uint32 + var key uintptr + var op *ioOperation + err := getQueuedCompletionStatus(h, &bytes, &key, &op, syscall.INFINITE) + if op == nil { + panic(err) + } + op.ch <- ioResult{bytes, err} + } +} + +// asyncIo processes the return value from ReadFile or WriteFile, blocking until +// the operation has actually completed. +func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) { + if err != syscall.ERROR_IO_PENDING { + return int(bytes), err + } + + if f.closing.isSet() { + cancelIoEx(f.handle, &c.o) + } + + var timeout timeoutChan + if d != nil { + d.channelLock.Lock() + timeout = d.channel + d.channelLock.Unlock() + } + + var r ioResult + select { + case r = <-c.ch: + err = r.err + if err == syscall.ERROR_OPERATION_ABORTED { + if f.closing.isSet() { + err = ErrFileClosed + } + } else if err != nil && f.socket { + // err is from Win32. Query the overlapped structure to get the winsock error. + var bytes, flags uint32 + err = wsaGetOverlappedResult(f.handle, &c.o, &bytes, false, &flags) + } + case <-timeout: + cancelIoEx(f.handle, &c.o) + r = <-c.ch + err = r.err + if err == syscall.ERROR_OPERATION_ABORTED { + err = ErrTimeout + } + } + + // runtime.KeepAlive is needed, as c is passed via native + // code to ioCompletionProcessor, c must remain alive + // until the channel read is complete. + runtime.KeepAlive(c) + return int(r.bytes), err +} + +// Read reads from a file handle. +func (f *win32File) Read(b []byte) (int, error) { + c, err := f.prepareIo() + if err != nil { + return 0, err + } + defer f.wg.Done() + + if f.readDeadline.timedout.isSet() { + return 0, ErrTimeout + } + + var bytes uint32 + err = syscall.ReadFile(f.handle, b, &bytes, &c.o) + n, err := f.asyncIo(c, &f.readDeadline, bytes, err) + runtime.KeepAlive(b) + + // Handle EOF conditions. + if err == nil && n == 0 && len(b) != 0 { + return 0, io.EOF + } else if err == syscall.ERROR_BROKEN_PIPE { + return 0, io.EOF + } else { + return n, err + } +} + +// Write writes to a file handle. +func (f *win32File) Write(b []byte) (int, error) { + c, err := f.prepareIo() + if err != nil { + return 0, err + } + defer f.wg.Done() + + if f.writeDeadline.timedout.isSet() { + return 0, ErrTimeout + } + + var bytes uint32 + err = syscall.WriteFile(f.handle, b, &bytes, &c.o) + n, err := f.asyncIo(c, &f.writeDeadline, bytes, err) + runtime.KeepAlive(b) + return n, err +} + +func (f *win32File) SetReadDeadline(deadline time.Time) error { + return f.readDeadline.set(deadline) +} + +func (f *win32File) SetWriteDeadline(deadline time.Time) error { + return f.writeDeadline.set(deadline) +} + +func (f *win32File) Flush() error { + return syscall.FlushFileBuffers(f.handle) +} + +func (f *win32File) Fd() uintptr { + return uintptr(f.handle) +} + +func (d *deadlineHandler) set(deadline time.Time) error { + d.setLock.Lock() + defer d.setLock.Unlock() + + if d.timer != nil { + if !d.timer.Stop() { + <-d.channel + } + d.timer = nil + } + d.timedout.setFalse() + + select { + case <-d.channel: + d.channelLock.Lock() + d.channel = make(chan struct{}) + d.channelLock.Unlock() + default: + } + + if deadline.IsZero() { + return nil + } + + timeoutIO := func() { + d.timedout.setTrue() + close(d.channel) + } + + now := time.Now() + duration := deadline.Sub(now) + if deadline.After(now) { + // Deadline is in the future, set a timer to wait + d.timer = time.AfterFunc(duration, timeoutIO) + } else { + // Deadline is in the past. Cancel all pending IO now. + timeoutIO() + } + return nil +} diff --git a/vendor/github.com/Microsoft/go-winio/fileinfo.go b/vendor/github.com/Microsoft/go-winio/fileinfo.go new file mode 100644 index 00000000..ada2fbab --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/fileinfo.go @@ -0,0 +1,61 @@ +// +build windows + +package winio + +import ( + "os" + "runtime" + "syscall" + "unsafe" +) + +//sys getFileInformationByHandleEx(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) = GetFileInformationByHandleEx +//sys setFileInformationByHandle(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) = SetFileInformationByHandle + +const ( + fileBasicInfo = 0 + fileIDInfo = 0x12 +) + +// FileBasicInfo contains file access time and file attributes information. +type FileBasicInfo struct { + CreationTime, LastAccessTime, LastWriteTime, ChangeTime syscall.Filetime + FileAttributes uint32 + pad uint32 // padding +} + +// GetFileBasicInfo retrieves times and attributes for a file. +func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) { + bi := &FileBasicInfo{} + if err := getFileInformationByHandleEx(syscall.Handle(f.Fd()), fileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil { + return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return bi, nil +} + +// SetFileBasicInfo sets times and attributes for a file. +func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error { + if err := setFileInformationByHandle(syscall.Handle(f.Fd()), fileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil { + return &os.PathError{Op: "SetFileInformationByHandle", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return nil +} + +// FileIDInfo contains the volume serial number and file ID for a file. This pair should be +// unique on a system. +type FileIDInfo struct { + VolumeSerialNumber uint64 + FileID [16]byte +} + +// GetFileID retrieves the unique (volume, file ID) pair for a file. +func GetFileID(f *os.File) (*FileIDInfo, error) { + fileID := &FileIDInfo{} + if err := getFileInformationByHandleEx(syscall.Handle(f.Fd()), fileIDInfo, (*byte)(unsafe.Pointer(fileID)), uint32(unsafe.Sizeof(*fileID))); err != nil { + return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} + } + runtime.KeepAlive(f) + return fileID, nil +} diff --git a/vendor/github.com/Microsoft/go-winio/go.mod b/vendor/github.com/Microsoft/go-winio/go.mod new file mode 100644 index 00000000..b3846826 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/go.mod @@ -0,0 +1,9 @@ +module github.com/Microsoft/go-winio + +go 1.12 + +require ( + github.com/pkg/errors v0.8.1 + github.com/sirupsen/logrus v1.4.1 + golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b +) diff --git a/vendor/github.com/Microsoft/go-winio/go.sum b/vendor/github.com/Microsoft/go-winio/go.sum new file mode 100644 index 00000000..babb4a70 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/go.sum @@ -0,0 +1,16 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b h1:ag/x1USPSsqHud38I9BAC88qdNLDHHtQ4mlgQIZPPNA= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/Microsoft/go-winio/hvsock.go b/vendor/github.com/Microsoft/go-winio/hvsock.go new file mode 100644 index 00000000..dbfe790e --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/hvsock.go @@ -0,0 +1,305 @@ +package winio + +import ( + "fmt" + "io" + "net" + "os" + "syscall" + "time" + "unsafe" + + "github.com/Microsoft/go-winio/pkg/guid" +) + +//sys bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind + +const ( + afHvSock = 34 // AF_HYPERV + + socketError = ^uintptr(0) +) + +// An HvsockAddr is an address for a AF_HYPERV socket. +type HvsockAddr struct { + VMID guid.GUID + ServiceID guid.GUID +} + +type rawHvsockAddr struct { + Family uint16 + _ uint16 + VMID guid.GUID + ServiceID guid.GUID +} + +// Network returns the address's network name, "hvsock". +func (addr *HvsockAddr) Network() string { + return "hvsock" +} + +func (addr *HvsockAddr) String() string { + return fmt.Sprintf("%s:%s", &addr.VMID, &addr.ServiceID) +} + +// VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port. +func VsockServiceID(port uint32) guid.GUID { + g, _ := guid.FromString("00000000-facb-11e6-bd58-64006a7986d3") + g.Data1 = port + return g +} + +func (addr *HvsockAddr) raw() rawHvsockAddr { + return rawHvsockAddr{ + Family: afHvSock, + VMID: addr.VMID, + ServiceID: addr.ServiceID, + } +} + +func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) { + addr.VMID = raw.VMID + addr.ServiceID = raw.ServiceID +} + +// HvsockListener is a socket listener for the AF_HYPERV address family. +type HvsockListener struct { + sock *win32File + addr HvsockAddr +} + +// HvsockConn is a connected socket of the AF_HYPERV address family. +type HvsockConn struct { + sock *win32File + local, remote HvsockAddr +} + +func newHvSocket() (*win32File, error) { + fd, err := syscall.Socket(afHvSock, syscall.SOCK_STREAM, 1) + if err != nil { + return nil, os.NewSyscallError("socket", err) + } + f, err := makeWin32File(fd) + if err != nil { + syscall.Close(fd) + return nil, err + } + f.socket = true + return f, nil +} + +// ListenHvsock listens for connections on the specified hvsock address. +func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) { + l := &HvsockListener{addr: *addr} + sock, err := newHvSocket() + if err != nil { + return nil, l.opErr("listen", err) + } + sa := addr.raw() + err = bind(sock.handle, unsafe.Pointer(&sa), int32(unsafe.Sizeof(sa))) + if err != nil { + return nil, l.opErr("listen", os.NewSyscallError("socket", err)) + } + err = syscall.Listen(sock.handle, 16) + if err != nil { + return nil, l.opErr("listen", os.NewSyscallError("listen", err)) + } + return &HvsockListener{sock: sock, addr: *addr}, nil +} + +func (l *HvsockListener) opErr(op string, err error) error { + return &net.OpError{Op: op, Net: "hvsock", Addr: &l.addr, Err: err} +} + +// Addr returns the listener's network address. +func (l *HvsockListener) Addr() net.Addr { + return &l.addr +} + +// Accept waits for the next connection and returns it. +func (l *HvsockListener) Accept() (_ net.Conn, err error) { + sock, err := newHvSocket() + if err != nil { + return nil, l.opErr("accept", err) + } + defer func() { + if sock != nil { + sock.Close() + } + }() + c, err := l.sock.prepareIo() + if err != nil { + return nil, l.opErr("accept", err) + } + defer l.sock.wg.Done() + + // AcceptEx, per documentation, requires an extra 16 bytes per address. + const addrlen = uint32(16 + unsafe.Sizeof(rawHvsockAddr{})) + var addrbuf [addrlen * 2]byte + + var bytes uint32 + err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0, addrlen, addrlen, &bytes, &c.o) + _, err = l.sock.asyncIo(c, nil, bytes, err) + if err != nil { + return nil, l.opErr("accept", os.NewSyscallError("acceptex", err)) + } + conn := &HvsockConn{ + sock: sock, + } + conn.local.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[0]))) + conn.remote.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[addrlen]))) + sock = nil + return conn, nil +} + +// Close closes the listener, causing any pending Accept calls to fail. +func (l *HvsockListener) Close() error { + return l.sock.Close() +} + +/* Need to finish ConnectEx handling +func DialHvsock(ctx context.Context, addr *HvsockAddr) (*HvsockConn, error) { + sock, err := newHvSocket() + if err != nil { + return nil, err + } + defer func() { + if sock != nil { + sock.Close() + } + }() + c, err := sock.prepareIo() + if err != nil { + return nil, err + } + defer sock.wg.Done() + var bytes uint32 + err = windows.ConnectEx(windows.Handle(sock.handle), sa, nil, 0, &bytes, &c.o) + _, err = sock.asyncIo(ctx, c, nil, bytes, err) + if err != nil { + return nil, err + } + conn := &HvsockConn{ + sock: sock, + remote: *addr, + } + sock = nil + return conn, nil +} +*/ + +func (conn *HvsockConn) opErr(op string, err error) error { + return &net.OpError{Op: op, Net: "hvsock", Source: &conn.local, Addr: &conn.remote, Err: err} +} + +func (conn *HvsockConn) Read(b []byte) (int, error) { + c, err := conn.sock.prepareIo() + if err != nil { + return 0, conn.opErr("read", err) + } + defer conn.sock.wg.Done() + buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} + var flags, bytes uint32 + err = syscall.WSARecv(conn.sock.handle, &buf, 1, &bytes, &flags, &c.o, nil) + n, err := conn.sock.asyncIo(c, &conn.sock.readDeadline, bytes, err) + if err != nil { + if _, ok := err.(syscall.Errno); ok { + err = os.NewSyscallError("wsarecv", err) + } + return 0, conn.opErr("read", err) + } else if n == 0 { + err = io.EOF + } + return n, err +} + +func (conn *HvsockConn) Write(b []byte) (int, error) { + t := 0 + for len(b) != 0 { + n, err := conn.write(b) + if err != nil { + return t + n, err + } + t += n + b = b[n:] + } + return t, nil +} + +func (conn *HvsockConn) write(b []byte) (int, error) { + c, err := conn.sock.prepareIo() + if err != nil { + return 0, conn.opErr("write", err) + } + defer conn.sock.wg.Done() + buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} + var bytes uint32 + err = syscall.WSASend(conn.sock.handle, &buf, 1, &bytes, 0, &c.o, nil) + n, err := conn.sock.asyncIo(c, &conn.sock.writeDeadline, bytes, err) + if err != nil { + if _, ok := err.(syscall.Errno); ok { + err = os.NewSyscallError("wsasend", err) + } + return 0, conn.opErr("write", err) + } + return n, err +} + +// Close closes the socket connection, failing any pending read or write calls. +func (conn *HvsockConn) Close() error { + return conn.sock.Close() +} + +func (conn *HvsockConn) shutdown(how int) error { + err := syscall.Shutdown(conn.sock.handle, syscall.SHUT_RD) + if err != nil { + return os.NewSyscallError("shutdown", err) + } + return nil +} + +// CloseRead shuts down the read end of the socket. +func (conn *HvsockConn) CloseRead() error { + err := conn.shutdown(syscall.SHUT_RD) + if err != nil { + return conn.opErr("close", err) + } + return nil +} + +// CloseWrite shuts down the write end of the socket, notifying the other endpoint that +// no more data will be written. +func (conn *HvsockConn) CloseWrite() error { + err := conn.shutdown(syscall.SHUT_WR) + if err != nil { + return conn.opErr("close", err) + } + return nil +} + +// LocalAddr returns the local address of the connection. +func (conn *HvsockConn) LocalAddr() net.Addr { + return &conn.local +} + +// RemoteAddr returns the remote address of the connection. +func (conn *HvsockConn) RemoteAddr() net.Addr { + return &conn.remote +} + +// SetDeadline implements the net.Conn SetDeadline method. +func (conn *HvsockConn) SetDeadline(t time.Time) error { + conn.SetReadDeadline(t) + conn.SetWriteDeadline(t) + return nil +} + +// SetReadDeadline implements the net.Conn SetReadDeadline method. +func (conn *HvsockConn) SetReadDeadline(t time.Time) error { + return conn.sock.SetReadDeadline(t) +} + +// SetWriteDeadline implements the net.Conn SetWriteDeadline method. +func (conn *HvsockConn) SetWriteDeadline(t time.Time) error { + return conn.sock.SetWriteDeadline(t) +} diff --git a/vendor/github.com/Microsoft/go-winio/pipe.go b/vendor/github.com/Microsoft/go-winio/pipe.go new file mode 100644 index 00000000..d6a46f6a --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pipe.go @@ -0,0 +1,510 @@ +// +build windows + +package winio + +import ( + "context" + "errors" + "fmt" + "io" + "net" + "os" + "runtime" + "syscall" + "time" + "unsafe" +) + +//sys connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) = ConnectNamedPipe +//sys createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateNamedPipeW +//sys createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateFileW +//sys getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo +//sys getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW +//sys localAlloc(uFlags uint32, length uint32) (ptr uintptr) = LocalAlloc +//sys ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) = ntdll.NtCreateNamedPipeFile +//sys rtlNtStatusToDosError(status ntstatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb +//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) = ntdll.RtlDosPathNameToNtPathName_U +//sys rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) = ntdll.RtlDefaultNpAcl + +type ioStatusBlock struct { + Status, Information uintptr +} + +type objectAttributes struct { + Length uintptr + RootDirectory uintptr + ObjectName *unicodeString + Attributes uintptr + SecurityDescriptor *securityDescriptor + SecurityQoS uintptr +} + +type unicodeString struct { + Length uint16 + MaximumLength uint16 + Buffer uintptr +} + +type securityDescriptor struct { + Revision byte + Sbz1 byte + Control uint16 + Owner uintptr + Group uintptr + Sacl uintptr + Dacl uintptr +} + +type ntstatus int32 + +func (status ntstatus) Err() error { + if status >= 0 { + return nil + } + return rtlNtStatusToDosError(status) +} + +const ( + cERROR_PIPE_BUSY = syscall.Errno(231) + cERROR_NO_DATA = syscall.Errno(232) + cERROR_PIPE_CONNECTED = syscall.Errno(535) + cERROR_SEM_TIMEOUT = syscall.Errno(121) + + cSECURITY_SQOS_PRESENT = 0x100000 + cSECURITY_ANONYMOUS = 0 + + cPIPE_TYPE_MESSAGE = 4 + + cPIPE_READMODE_MESSAGE = 2 + + cFILE_OPEN = 1 + cFILE_CREATE = 2 + + cFILE_PIPE_MESSAGE_TYPE = 1 + cFILE_PIPE_REJECT_REMOTE_CLIENTS = 2 + + cSE_DACL_PRESENT = 4 +) + +var ( + // ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed. + // This error should match net.errClosing since docker takes a dependency on its text. + ErrPipeListenerClosed = errors.New("use of closed network connection") + + errPipeWriteClosed = errors.New("pipe has been closed for write") +) + +type win32Pipe struct { + *win32File + path string +} + +type win32MessageBytePipe struct { + win32Pipe + writeClosed bool + readEOF bool +} + +type pipeAddress string + +func (f *win32Pipe) LocalAddr() net.Addr { + return pipeAddress(f.path) +} + +func (f *win32Pipe) RemoteAddr() net.Addr { + return pipeAddress(f.path) +} + +func (f *win32Pipe) SetDeadline(t time.Time) error { + f.SetReadDeadline(t) + f.SetWriteDeadline(t) + return nil +} + +// CloseWrite closes the write side of a message pipe in byte mode. +func (f *win32MessageBytePipe) CloseWrite() error { + if f.writeClosed { + return errPipeWriteClosed + } + err := f.win32File.Flush() + if err != nil { + return err + } + _, err = f.win32File.Write(nil) + if err != nil { + return err + } + f.writeClosed = true + return nil +} + +// Write writes bytes to a message pipe in byte mode. Zero-byte writes are ignored, since +// they are used to implement CloseWrite(). +func (f *win32MessageBytePipe) Write(b []byte) (int, error) { + if f.writeClosed { + return 0, errPipeWriteClosed + } + if len(b) == 0 { + return 0, nil + } + return f.win32File.Write(b) +} + +// Read reads bytes from a message pipe in byte mode. A read of a zero-byte message on a message +// mode pipe will return io.EOF, as will all subsequent reads. +func (f *win32MessageBytePipe) Read(b []byte) (int, error) { + if f.readEOF { + return 0, io.EOF + } + n, err := f.win32File.Read(b) + if err == io.EOF { + // If this was the result of a zero-byte read, then + // it is possible that the read was due to a zero-size + // message. Since we are simulating CloseWrite with a + // zero-byte message, ensure that all future Read() calls + // also return EOF. + f.readEOF = true + } else if err == syscall.ERROR_MORE_DATA { + // ERROR_MORE_DATA indicates that the pipe's read mode is message mode + // and the message still has more bytes. Treat this as a success, since + // this package presents all named pipes as byte streams. + err = nil + } + return n, err +} + +func (s pipeAddress) Network() string { + return "pipe" +} + +func (s pipeAddress) String() string { + return string(s) +} + +// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout. +func tryDialPipe(ctx context.Context, path *string) (syscall.Handle, error) { + for { + select { + case <-ctx.Done(): + return syscall.Handle(0), ctx.Err() + default: + h, err := createFile(*path, syscall.GENERIC_READ|syscall.GENERIC_WRITE, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0) + if err == nil { + return h, nil + } + if err != cERROR_PIPE_BUSY { + return h, &os.PathError{Err: err, Op: "open", Path: *path} + } + // Wait 10 msec and try again. This is a rather simplistic + // view, as we always try each 10 milliseconds. + time.Sleep(time.Millisecond * 10) + } + } +} + +// DialPipe connects to a named pipe by path, timing out if the connection +// takes longer than the specified duration. If timeout is nil, then we use +// a default timeout of 2 seconds. (We do not use WaitNamedPipe.) +func DialPipe(path string, timeout *time.Duration) (net.Conn, error) { + var absTimeout time.Time + if timeout != nil { + absTimeout = time.Now().Add(*timeout) + } else { + absTimeout = time.Now().Add(time.Second * 2) + } + ctx, _ := context.WithDeadline(context.Background(), absTimeout) + conn, err := DialPipeContext(ctx, path) + if err == context.DeadlineExceeded { + return nil, ErrTimeout + } + return conn, err +} + +// DialPipeContext attempts to connect to a named pipe by `path` until `ctx` +// cancellation or timeout. +func DialPipeContext(ctx context.Context, path string) (net.Conn, error) { + var err error + var h syscall.Handle + h, err = tryDialPipe(ctx, &path) + if err != nil { + return nil, err + } + + var flags uint32 + err = getNamedPipeInfo(h, &flags, nil, nil, nil) + if err != nil { + return nil, err + } + + f, err := makeWin32File(h) + if err != nil { + syscall.Close(h) + return nil, err + } + + // If the pipe is in message mode, return a message byte pipe, which + // supports CloseWrite(). + if flags&cPIPE_TYPE_MESSAGE != 0 { + return &win32MessageBytePipe{ + win32Pipe: win32Pipe{win32File: f, path: path}, + }, nil + } + return &win32Pipe{win32File: f, path: path}, nil +} + +type acceptResponse struct { + f *win32File + err error +} + +type win32PipeListener struct { + firstHandle syscall.Handle + path string + config PipeConfig + acceptCh chan (chan acceptResponse) + closeCh chan int + doneCh chan int +} + +func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (syscall.Handle, error) { + path16, err := syscall.UTF16FromString(path) + if err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + + var oa objectAttributes + oa.Length = unsafe.Sizeof(oa) + + var ntPath unicodeString + if err := rtlDosPathNameToNtPathName(&path16[0], &ntPath, 0, 0).Err(); err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + defer localFree(ntPath.Buffer) + oa.ObjectName = &ntPath + + // The security descriptor is only needed for the first pipe. + if first { + if sd != nil { + len := uint32(len(sd)) + sdb := localAlloc(0, len) + defer localFree(sdb) + copy((*[0xffff]byte)(unsafe.Pointer(sdb))[:], sd) + oa.SecurityDescriptor = (*securityDescriptor)(unsafe.Pointer(sdb)) + } else { + // Construct the default named pipe security descriptor. + var dacl uintptr + if err := rtlDefaultNpAcl(&dacl).Err(); err != nil { + return 0, fmt.Errorf("getting default named pipe ACL: %s", err) + } + defer localFree(dacl) + + sdb := &securityDescriptor{ + Revision: 1, + Control: cSE_DACL_PRESENT, + Dacl: dacl, + } + oa.SecurityDescriptor = sdb + } + } + + typ := uint32(cFILE_PIPE_REJECT_REMOTE_CLIENTS) + if c.MessageMode { + typ |= cFILE_PIPE_MESSAGE_TYPE + } + + disposition := uint32(cFILE_OPEN) + access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | syscall.SYNCHRONIZE) + if first { + disposition = cFILE_CREATE + // By not asking for read or write access, the named pipe file system + // will put this pipe into an initially disconnected state, blocking + // client connections until the next call with first == false. + access = syscall.SYNCHRONIZE + } + + timeout := int64(-50 * 10000) // 50ms + + var ( + h syscall.Handle + iosb ioStatusBlock + ) + err = ntCreateNamedPipeFile(&h, access, &oa, &iosb, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE, disposition, 0, typ, 0, 0, 0xffffffff, uint32(c.InputBufferSize), uint32(c.OutputBufferSize), &timeout).Err() + if err != nil { + return 0, &os.PathError{Op: "open", Path: path, Err: err} + } + + runtime.KeepAlive(ntPath) + return h, nil +} + +func (l *win32PipeListener) makeServerPipe() (*win32File, error) { + h, err := makeServerPipeHandle(l.path, nil, &l.config, false) + if err != nil { + return nil, err + } + f, err := makeWin32File(h) + if err != nil { + syscall.Close(h) + return nil, err + } + return f, nil +} + +func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) { + p, err := l.makeServerPipe() + if err != nil { + return nil, err + } + + // Wait for the client to connect. + ch := make(chan error) + go func(p *win32File) { + ch <- connectPipe(p) + }(p) + + select { + case err = <-ch: + if err != nil { + p.Close() + p = nil + } + case <-l.closeCh: + // Abort the connect request by closing the handle. + p.Close() + p = nil + err = <-ch + if err == nil || err == ErrFileClosed { + err = ErrPipeListenerClosed + } + } + return p, err +} + +func (l *win32PipeListener) listenerRoutine() { + closed := false + for !closed { + select { + case <-l.closeCh: + closed = true + case responseCh := <-l.acceptCh: + var ( + p *win32File + err error + ) + for { + p, err = l.makeConnectedServerPipe() + // If the connection was immediately closed by the client, try + // again. + if err != cERROR_NO_DATA { + break + } + } + responseCh <- acceptResponse{p, err} + closed = err == ErrPipeListenerClosed + } + } + syscall.Close(l.firstHandle) + l.firstHandle = 0 + // Notify Close() and Accept() callers that the handle has been closed. + close(l.doneCh) +} + +// PipeConfig contain configuration for the pipe listener. +type PipeConfig struct { + // SecurityDescriptor contains a Windows security descriptor in SDDL format. + SecurityDescriptor string + + // MessageMode determines whether the pipe is in byte or message mode. In either + // case the pipe is read in byte mode by default. The only practical difference in + // this implementation is that CloseWrite() is only supported for message mode pipes; + // CloseWrite() is implemented as a zero-byte write, but zero-byte writes are only + // transferred to the reader (and returned as io.EOF in this implementation) + // when the pipe is in message mode. + MessageMode bool + + // InputBufferSize specifies the size the input buffer, in bytes. + InputBufferSize int32 + + // OutputBufferSize specifies the size the input buffer, in bytes. + OutputBufferSize int32 +} + +// ListenPipe creates a listener on a Windows named pipe path, e.g. \\.\pipe\mypipe. +// The pipe must not already exist. +func ListenPipe(path string, c *PipeConfig) (net.Listener, error) { + var ( + sd []byte + err error + ) + if c == nil { + c = &PipeConfig{} + } + if c.SecurityDescriptor != "" { + sd, err = SddlToSecurityDescriptor(c.SecurityDescriptor) + if err != nil { + return nil, err + } + } + h, err := makeServerPipeHandle(path, sd, c, true) + if err != nil { + return nil, err + } + l := &win32PipeListener{ + firstHandle: h, + path: path, + config: *c, + acceptCh: make(chan (chan acceptResponse)), + closeCh: make(chan int), + doneCh: make(chan int), + } + go l.listenerRoutine() + return l, nil +} + +func connectPipe(p *win32File) error { + c, err := p.prepareIo() + if err != nil { + return err + } + defer p.wg.Done() + + err = connectNamedPipe(p.handle, &c.o) + _, err = p.asyncIo(c, nil, 0, err) + if err != nil && err != cERROR_PIPE_CONNECTED { + return err + } + return nil +} + +func (l *win32PipeListener) Accept() (net.Conn, error) { + ch := make(chan acceptResponse) + select { + case l.acceptCh <- ch: + response := <-ch + err := response.err + if err != nil { + return nil, err + } + if l.config.MessageMode { + return &win32MessageBytePipe{ + win32Pipe: win32Pipe{win32File: response.f, path: l.path}, + }, nil + } + return &win32Pipe{win32File: response.f, path: l.path}, nil + case <-l.doneCh: + return nil, ErrPipeListenerClosed + } +} + +func (l *win32PipeListener) Close() error { + select { + case l.closeCh <- 1: + <-l.doneCh + case <-l.doneCh: + } + return nil +} + +func (l *win32PipeListener) Addr() net.Addr { + return pipeAddress(l.path) +} diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go new file mode 100644 index 00000000..58640657 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go @@ -0,0 +1,235 @@ +// Package guid provides a GUID type. The backing structure for a GUID is +// identical to that used by the golang.org/x/sys/windows GUID type. +// There are two main binary encodings used for a GUID, the big-endian encoding, +// and the Windows (mixed-endian) encoding. See here for details: +// https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding +package guid + +import ( + "crypto/rand" + "crypto/sha1" + "encoding" + "encoding/binary" + "fmt" + "strconv" + + "golang.org/x/sys/windows" +) + +// Variant specifies which GUID variant (or "type") of the GUID. It determines +// how the entirety of the rest of the GUID is interpreted. +type Variant uint8 + +// The variants specified by RFC 4122. +const ( + // VariantUnknown specifies a GUID variant which does not conform to one of + // the variant encodings specified in RFC 4122. + VariantUnknown Variant = iota + VariantNCS + VariantRFC4122 + VariantMicrosoft + VariantFuture +) + +// Version specifies how the bits in the GUID were generated. For instance, a +// version 4 GUID is randomly generated, and a version 5 is generated from the +// hash of an input string. +type Version uint8 + +var _ = (encoding.TextMarshaler)(GUID{}) +var _ = (encoding.TextUnmarshaler)(&GUID{}) + +// GUID represents a GUID/UUID. It has the same structure as +// golang.org/x/sys/windows.GUID so that it can be used with functions expecting +// that type. It is defined as its own type so that stringification and +// marshaling can be supported. The representation matches that used by native +// Windows code. +type GUID windows.GUID + +// NewV4 returns a new version 4 (pseudorandom) GUID, as defined by RFC 4122. +func NewV4() (GUID, error) { + var b [16]byte + if _, err := rand.Read(b[:]); err != nil { + return GUID{}, err + } + + g := FromArray(b) + g.setVersion(4) // Version 4 means randomly generated. + g.setVariant(VariantRFC4122) + + return g, nil +} + +// NewV5 returns a new version 5 (generated from a string via SHA-1 hashing) +// GUID, as defined by RFC 4122. The RFC is unclear on the encoding of the name, +// and the sample code treats it as a series of bytes, so we do the same here. +// +// Some implementations, such as those found on Windows, treat the name as a +// big-endian UTF16 stream of bytes. If that is desired, the string can be +// encoded as such before being passed to this function. +func NewV5(namespace GUID, name []byte) (GUID, error) { + b := sha1.New() + namespaceBytes := namespace.ToArray() + b.Write(namespaceBytes[:]) + b.Write(name) + + a := [16]byte{} + copy(a[:], b.Sum(nil)) + + g := FromArray(a) + g.setVersion(5) // Version 5 means generated from a string. + g.setVariant(VariantRFC4122) + + return g, nil +} + +func fromArray(b [16]byte, order binary.ByteOrder) GUID { + var g GUID + g.Data1 = order.Uint32(b[0:4]) + g.Data2 = order.Uint16(b[4:6]) + g.Data3 = order.Uint16(b[6:8]) + copy(g.Data4[:], b[8:16]) + return g +} + +func (g GUID) toArray(order binary.ByteOrder) [16]byte { + b := [16]byte{} + order.PutUint32(b[0:4], g.Data1) + order.PutUint16(b[4:6], g.Data2) + order.PutUint16(b[6:8], g.Data3) + copy(b[8:16], g.Data4[:]) + return b +} + +// FromArray constructs a GUID from a big-endian encoding array of 16 bytes. +func FromArray(b [16]byte) GUID { + return fromArray(b, binary.BigEndian) +} + +// ToArray returns an array of 16 bytes representing the GUID in big-endian +// encoding. +func (g GUID) ToArray() [16]byte { + return g.toArray(binary.BigEndian) +} + +// FromWindowsArray constructs a GUID from a Windows encoding array of bytes. +func FromWindowsArray(b [16]byte) GUID { + return fromArray(b, binary.LittleEndian) +} + +// ToWindowsArray returns an array of 16 bytes representing the GUID in Windows +// encoding. +func (g GUID) ToWindowsArray() [16]byte { + return g.toArray(binary.LittleEndian) +} + +func (g GUID) String() string { + return fmt.Sprintf( + "%08x-%04x-%04x-%04x-%012x", + g.Data1, + g.Data2, + g.Data3, + g.Data4[:2], + g.Data4[2:]) +} + +// FromString parses a string containing a GUID and returns the GUID. The only +// format currently supported is the `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` +// format. +func FromString(s string) (GUID, error) { + if len(s) != 36 { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + + var g GUID + + data1, err := strconv.ParseUint(s[0:8], 16, 32) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data1 = uint32(data1) + + data2, err := strconv.ParseUint(s[9:13], 16, 16) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data2 = uint16(data2) + + data3, err := strconv.ParseUint(s[14:18], 16, 16) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data3 = uint16(data3) + + for i, x := range []int{19, 21, 24, 26, 28, 30, 32, 34} { + v, err := strconv.ParseUint(s[x:x+2], 16, 8) + if err != nil { + return GUID{}, fmt.Errorf("invalid GUID %q", s) + } + g.Data4[i] = uint8(v) + } + + return g, nil +} + +func (g *GUID) setVariant(v Variant) { + d := g.Data4[0] + switch v { + case VariantNCS: + d = (d & 0x7f) + case VariantRFC4122: + d = (d & 0x3f) | 0x80 + case VariantMicrosoft: + d = (d & 0x1f) | 0xc0 + case VariantFuture: + d = (d & 0x0f) | 0xe0 + case VariantUnknown: + fallthrough + default: + panic(fmt.Sprintf("invalid variant: %d", v)) + } + g.Data4[0] = d +} + +// Variant returns the GUID variant, as defined in RFC 4122. +func (g GUID) Variant() Variant { + b := g.Data4[0] + if b&0x80 == 0 { + return VariantNCS + } else if b&0xc0 == 0x80 { + return VariantRFC4122 + } else if b&0xe0 == 0xc0 { + return VariantMicrosoft + } else if b&0xe0 == 0xe0 { + return VariantFuture + } + return VariantUnknown +} + +func (g *GUID) setVersion(v Version) { + g.Data3 = (g.Data3 & 0x0fff) | (uint16(v) << 12) +} + +// Version returns the GUID version, as defined in RFC 4122. +func (g GUID) Version() Version { + return Version((g.Data3 & 0xF000) >> 12) +} + +// MarshalText returns the textual representation of the GUID. +func (g GUID) MarshalText() ([]byte, error) { + return []byte(g.String()), nil +} + +// UnmarshalText takes the textual representation of a GUID, and unmarhals it +// into this GUID. +func (g *GUID) UnmarshalText(text []byte) error { + g2, err := FromString(string(text)) + if err != nil { + return err + } + *g = g2 + return nil +} diff --git a/vendor/github.com/Microsoft/go-winio/privilege.go b/vendor/github.com/Microsoft/go-winio/privilege.go new file mode 100644 index 00000000..9c83d36f --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/privilege.go @@ -0,0 +1,202 @@ +// +build windows + +package winio + +import ( + "bytes" + "encoding/binary" + "fmt" + "runtime" + "sync" + "syscall" + "unicode/utf16" + + "golang.org/x/sys/windows" +) + +//sys adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges +//sys impersonateSelf(level uint32) (err error) = advapi32.ImpersonateSelf +//sys revertToSelf() (err error) = advapi32.RevertToSelf +//sys openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) = advapi32.OpenThreadToken +//sys getCurrentThread() (h syscall.Handle) = GetCurrentThread +//sys lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) = advapi32.LookupPrivilegeValueW +//sys lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW +//sys lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) = advapi32.LookupPrivilegeDisplayNameW + +const ( + SE_PRIVILEGE_ENABLED = 2 + + ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300 + + SeBackupPrivilege = "SeBackupPrivilege" + SeRestorePrivilege = "SeRestorePrivilege" +) + +const ( + securityAnonymous = iota + securityIdentification + securityImpersonation + securityDelegation +) + +var ( + privNames = make(map[string]uint64) + privNameMutex sync.Mutex +) + +// PrivilegeError represents an error enabling privileges. +type PrivilegeError struct { + privileges []uint64 +} + +func (e *PrivilegeError) Error() string { + s := "" + if len(e.privileges) > 1 { + s = "Could not enable privileges " + } else { + s = "Could not enable privilege " + } + for i, p := range e.privileges { + if i != 0 { + s += ", " + } + s += `"` + s += getPrivilegeName(p) + s += `"` + } + return s +} + +// RunWithPrivilege enables a single privilege for a function call. +func RunWithPrivilege(name string, fn func() error) error { + return RunWithPrivileges([]string{name}, fn) +} + +// RunWithPrivileges enables privileges for a function call. +func RunWithPrivileges(names []string, fn func() error) error { + privileges, err := mapPrivileges(names) + if err != nil { + return err + } + runtime.LockOSThread() + defer runtime.UnlockOSThread() + token, err := newThreadToken() + if err != nil { + return err + } + defer releaseThreadToken(token) + err = adjustPrivileges(token, privileges, SE_PRIVILEGE_ENABLED) + if err != nil { + return err + } + return fn() +} + +func mapPrivileges(names []string) ([]uint64, error) { + var privileges []uint64 + privNameMutex.Lock() + defer privNameMutex.Unlock() + for _, name := range names { + p, ok := privNames[name] + if !ok { + err := lookupPrivilegeValue("", name, &p) + if err != nil { + return nil, err + } + privNames[name] = p + } + privileges = append(privileges, p) + } + return privileges, nil +} + +// EnableProcessPrivileges enables privileges globally for the process. +func EnableProcessPrivileges(names []string) error { + return enableDisableProcessPrivilege(names, SE_PRIVILEGE_ENABLED) +} + +// DisableProcessPrivileges disables privileges globally for the process. +func DisableProcessPrivileges(names []string) error { + return enableDisableProcessPrivilege(names, 0) +} + +func enableDisableProcessPrivilege(names []string, action uint32) error { + privileges, err := mapPrivileges(names) + if err != nil { + return err + } + + p, _ := windows.GetCurrentProcess() + var token windows.Token + err = windows.OpenProcessToken(p, windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, &token) + if err != nil { + return err + } + + defer token.Close() + return adjustPrivileges(token, privileges, action) +} + +func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) error { + var b bytes.Buffer + binary.Write(&b, binary.LittleEndian, uint32(len(privileges))) + for _, p := range privileges { + binary.Write(&b, binary.LittleEndian, p) + binary.Write(&b, binary.LittleEndian, action) + } + prevState := make([]byte, b.Len()) + reqSize := uint32(0) + success, err := adjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(len(prevState)), &prevState[0], &reqSize) + if !success { + return err + } + if err == ERROR_NOT_ALL_ASSIGNED { + return &PrivilegeError{privileges} + } + return nil +} + +func getPrivilegeName(luid uint64) string { + var nameBuffer [256]uint16 + bufSize := uint32(len(nameBuffer)) + err := lookupPrivilegeName("", &luid, &nameBuffer[0], &bufSize) + if err != nil { + return fmt.Sprintf("", luid) + } + + var displayNameBuffer [256]uint16 + displayBufSize := uint32(len(displayNameBuffer)) + var langID uint32 + err = lookupPrivilegeDisplayName("", &nameBuffer[0], &displayNameBuffer[0], &displayBufSize, &langID) + if err != nil { + return fmt.Sprintf("", string(utf16.Decode(nameBuffer[:bufSize]))) + } + + return string(utf16.Decode(displayNameBuffer[:displayBufSize])) +} + +func newThreadToken() (windows.Token, error) { + err := impersonateSelf(securityImpersonation) + if err != nil { + return 0, err + } + + var token windows.Token + err = openThreadToken(getCurrentThread(), syscall.TOKEN_ADJUST_PRIVILEGES|syscall.TOKEN_QUERY, false, &token) + if err != nil { + rerr := revertToSelf() + if rerr != nil { + panic(rerr) + } + return 0, err + } + return token, nil +} + +func releaseThreadToken(h windows.Token) { + err := revertToSelf() + if err != nil { + panic(err) + } + h.Close() +} diff --git a/vendor/github.com/Microsoft/go-winio/reparse.go b/vendor/github.com/Microsoft/go-winio/reparse.go new file mode 100644 index 00000000..fc1ee4d3 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/reparse.go @@ -0,0 +1,128 @@ +package winio + +import ( + "bytes" + "encoding/binary" + "fmt" + "strings" + "unicode/utf16" + "unsafe" +) + +const ( + reparseTagMountPoint = 0xA0000003 + reparseTagSymlink = 0xA000000C +) + +type reparseDataBuffer struct { + ReparseTag uint32 + ReparseDataLength uint16 + Reserved uint16 + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 +} + +// ReparsePoint describes a Win32 symlink or mount point. +type ReparsePoint struct { + Target string + IsMountPoint bool +} + +// UnsupportedReparsePointError is returned when trying to decode a non-symlink or +// mount point reparse point. +type UnsupportedReparsePointError struct { + Tag uint32 +} + +func (e *UnsupportedReparsePointError) Error() string { + return fmt.Sprintf("unsupported reparse point %x", e.Tag) +} + +// DecodeReparsePoint decodes a Win32 REPARSE_DATA_BUFFER structure containing either a symlink +// or a mount point. +func DecodeReparsePoint(b []byte) (*ReparsePoint, error) { + tag := binary.LittleEndian.Uint32(b[0:4]) + return DecodeReparsePointData(tag, b[8:]) +} + +func DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error) { + isMountPoint := false + switch tag { + case reparseTagMountPoint: + isMountPoint = true + case reparseTagSymlink: + default: + return nil, &UnsupportedReparsePointError{tag} + } + nameOffset := 8 + binary.LittleEndian.Uint16(b[4:6]) + if !isMountPoint { + nameOffset += 4 + } + nameLength := binary.LittleEndian.Uint16(b[6:8]) + name := make([]uint16, nameLength/2) + err := binary.Read(bytes.NewReader(b[nameOffset:nameOffset+nameLength]), binary.LittleEndian, &name) + if err != nil { + return nil, err + } + return &ReparsePoint{string(utf16.Decode(name)), isMountPoint}, nil +} + +func isDriveLetter(c byte) bool { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') +} + +// EncodeReparsePoint encodes a Win32 REPARSE_DATA_BUFFER structure describing a symlink or +// mount point. +func EncodeReparsePoint(rp *ReparsePoint) []byte { + // Generate an NT path and determine if this is a relative path. + var ntTarget string + relative := false + if strings.HasPrefix(rp.Target, `\\?\`) { + ntTarget = `\??\` + rp.Target[4:] + } else if strings.HasPrefix(rp.Target, `\\`) { + ntTarget = `\??\UNC\` + rp.Target[2:] + } else if len(rp.Target) >= 2 && isDriveLetter(rp.Target[0]) && rp.Target[1] == ':' { + ntTarget = `\??\` + rp.Target + } else { + ntTarget = rp.Target + relative = true + } + + // The paths must be NUL-terminated even though they are counted strings. + target16 := utf16.Encode([]rune(rp.Target + "\x00")) + ntTarget16 := utf16.Encode([]rune(ntTarget + "\x00")) + + size := int(unsafe.Sizeof(reparseDataBuffer{})) - 8 + size += len(ntTarget16)*2 + len(target16)*2 + + tag := uint32(reparseTagMountPoint) + if !rp.IsMountPoint { + tag = reparseTagSymlink + size += 4 // Add room for symlink flags + } + + data := reparseDataBuffer{ + ReparseTag: tag, + ReparseDataLength: uint16(size), + SubstituteNameOffset: 0, + SubstituteNameLength: uint16((len(ntTarget16) - 1) * 2), + PrintNameOffset: uint16(len(ntTarget16) * 2), + PrintNameLength: uint16((len(target16) - 1) * 2), + } + + var b bytes.Buffer + binary.Write(&b, binary.LittleEndian, &data) + if !rp.IsMountPoint { + flags := uint32(0) + if relative { + flags |= 1 + } + binary.Write(&b, binary.LittleEndian, flags) + } + + binary.Write(&b, binary.LittleEndian, ntTarget16) + binary.Write(&b, binary.LittleEndian, target16) + return b.Bytes() +} diff --git a/vendor/github.com/Microsoft/go-winio/sd.go b/vendor/github.com/Microsoft/go-winio/sd.go new file mode 100644 index 00000000..db1b370a --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/sd.go @@ -0,0 +1,98 @@ +// +build windows + +package winio + +import ( + "syscall" + "unsafe" +) + +//sys lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountNameW +//sys convertSidToStringSid(sid *byte, str **uint16) (err error) = advapi32.ConvertSidToStringSidW +//sys convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW +//sys convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW +//sys localFree(mem uintptr) = LocalFree +//sys getSecurityDescriptorLength(sd uintptr) (len uint32) = advapi32.GetSecurityDescriptorLength + +const ( + cERROR_NONE_MAPPED = syscall.Errno(1332) +) + +type AccountLookupError struct { + Name string + Err error +} + +func (e *AccountLookupError) Error() string { + if e.Name == "" { + return "lookup account: empty account name specified" + } + var s string + switch e.Err { + case cERROR_NONE_MAPPED: + s = "not found" + default: + s = e.Err.Error() + } + return "lookup account " + e.Name + ": " + s +} + +type SddlConversionError struct { + Sddl string + Err error +} + +func (e *SddlConversionError) Error() string { + return "convert " + e.Sddl + ": " + e.Err.Error() +} + +// LookupSidByName looks up the SID of an account by name +func LookupSidByName(name string) (sid string, err error) { + if name == "" { + return "", &AccountLookupError{name, cERROR_NONE_MAPPED} + } + + var sidSize, sidNameUse, refDomainSize uint32 + err = lookupAccountName(nil, name, nil, &sidSize, nil, &refDomainSize, &sidNameUse) + if err != nil && err != syscall.ERROR_INSUFFICIENT_BUFFER { + return "", &AccountLookupError{name, err} + } + sidBuffer := make([]byte, sidSize) + refDomainBuffer := make([]uint16, refDomainSize) + err = lookupAccountName(nil, name, &sidBuffer[0], &sidSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse) + if err != nil { + return "", &AccountLookupError{name, err} + } + var strBuffer *uint16 + err = convertSidToStringSid(&sidBuffer[0], &strBuffer) + if err != nil { + return "", &AccountLookupError{name, err} + } + sid = syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(strBuffer))[:]) + localFree(uintptr(unsafe.Pointer(strBuffer))) + return sid, nil +} + +func SddlToSecurityDescriptor(sddl string) ([]byte, error) { + var sdBuffer uintptr + err := convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &sdBuffer, nil) + if err != nil { + return nil, &SddlConversionError{sddl, err} + } + defer localFree(sdBuffer) + sd := make([]byte, getSecurityDescriptorLength(sdBuffer)) + copy(sd, (*[0xffff]byte)(unsafe.Pointer(sdBuffer))[:len(sd)]) + return sd, nil +} + +func SecurityDescriptorToSddl(sd []byte) (string, error) { + var sddl *uint16 + // The returned string length seems to including an aribtrary number of terminating NULs. + // Don't use it. + err := convertSecurityDescriptorToStringSecurityDescriptor(&sd[0], 1, 0xff, &sddl, nil) + if err != nil { + return "", err + } + defer localFree(uintptr(unsafe.Pointer(sddl))) + return syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(sddl))[:]), nil +} diff --git a/vendor/github.com/Microsoft/go-winio/syscall.go b/vendor/github.com/Microsoft/go-winio/syscall.go new file mode 100644 index 00000000..5cb52bc7 --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/syscall.go @@ -0,0 +1,3 @@ +package winio + +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go file.go pipe.go sd.go fileinfo.go privilege.go backup.go hvsock.go diff --git a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go new file mode 100644 index 00000000..e26b01fa --- /dev/null +++ b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go @@ -0,0 +1,562 @@ +// Code generated by 'go generate'; DO NOT EDIT. + +package winio + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + modws2_32 = windows.NewLazySystemDLL("ws2_32.dll") + modntdll = windows.NewLazySystemDLL("ntdll.dll") + modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") + + procCancelIoEx = modkernel32.NewProc("CancelIoEx") + procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") + procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") + procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") + procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult") + procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") + procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") + procCreateFileW = modkernel32.NewProc("CreateFileW") + procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo") + procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW") + procLocalAlloc = modkernel32.NewProc("LocalAlloc") + procNtCreateNamedPipeFile = modntdll.NewProc("NtCreateNamedPipeFile") + procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb") + procRtlDosPathNameToNtPathName_U = modntdll.NewProc("RtlDosPathNameToNtPathName_U") + procRtlDefaultNpAcl = modntdll.NewProc("RtlDefaultNpAcl") + procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") + procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") + procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW") + procConvertSecurityDescriptorToStringSecurityDescriptorW = modadvapi32.NewProc("ConvertSecurityDescriptorToStringSecurityDescriptorW") + procLocalFree = modkernel32.NewProc("LocalFree") + procGetSecurityDescriptorLength = modadvapi32.NewProc("GetSecurityDescriptorLength") + procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx") + procSetFileInformationByHandle = modkernel32.NewProc("SetFileInformationByHandle") + procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") + procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf") + procRevertToSelf = modadvapi32.NewProc("RevertToSelf") + procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") + procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") + procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW") + procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW") + procLookupPrivilegeDisplayNameW = modadvapi32.NewProc("LookupPrivilegeDisplayNameW") + procBackupRead = modkernel32.NewProc("BackupRead") + procBackupWrite = modkernel32.NewProc("BackupWrite") + procbind = modws2_32.NewProc("bind") +) + +func cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(file), uintptr(unsafe.Pointer(o)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(file), uintptr(port), uintptr(key), uintptr(threadCount), 0, 0) + newport = syscall.Handle(r0) + if newport == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(port), uintptr(unsafe.Pointer(bytes)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(o)), uintptr(timeout), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(h), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) { + var _p0 uint32 + if wait { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall6(procWSAGetOverlappedResult.Addr(), 5, uintptr(h), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(bytes)), uintptr(_p0), uintptr(unsafe.Pointer(flags)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) { + r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(pipe), uintptr(unsafe.Pointer(o)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(name) + if err != nil { + return + } + return _createNamedPipe(_p0, flags, pipeMode, maxInstances, outSize, inSize, defaultTimeout, sa) +} + +func _createNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { + r0, _, e1 := syscall.Syscall9(procCreateNamedPipeW.Addr(), 8, uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(pipeMode), uintptr(maxInstances), uintptr(outSize), uintptr(inSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)), 0) + handle = syscall.Handle(r0) + if handle == syscall.InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(name) + if err != nil { + return + } + return _createFile(_p0, access, mode, sa, createmode, attrs, templatefile) +} + +func _createFile(name *uint16, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { + r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) + handle = syscall.Handle(r0) + if handle == syscall.InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetNamedPipeInfo.Addr(), 5, uintptr(pipe), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(outSize)), uintptr(unsafe.Pointer(inSize)), uintptr(unsafe.Pointer(maxInstances)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procGetNamedPipeHandleStateW.Addr(), 7, uintptr(pipe), uintptr(unsafe.Pointer(state)), uintptr(unsafe.Pointer(curInstances)), uintptr(unsafe.Pointer(maxCollectionCount)), uintptr(unsafe.Pointer(collectDataTimeout)), uintptr(unsafe.Pointer(userName)), uintptr(maxUserNameSize), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func localAlloc(uFlags uint32, length uint32) (ptr uintptr) { + r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(uFlags), uintptr(length), 0) + ptr = uintptr(r0) + return +} + +func ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) { + r0, _, _ := syscall.Syscall15(procNtCreateNamedPipeFile.Addr(), 14, uintptr(unsafe.Pointer(pipe)), uintptr(access), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(share), uintptr(disposition), uintptr(options), uintptr(typ), uintptr(readMode), uintptr(completionMode), uintptr(maxInstances), uintptr(inboundQuota), uintptr(outputQuota), uintptr(unsafe.Pointer(timeout)), 0) + status = ntstatus(r0) + return +} + +func rtlNtStatusToDosError(status ntstatus) (winerr error) { + r0, _, _ := syscall.Syscall(procRtlNtStatusToDosErrorNoTeb.Addr(), 1, uintptr(status), 0, 0) + if r0 != 0 { + winerr = syscall.Errno(r0) + } + return +} + +func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) { + r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U.Addr(), 4, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(ntName)), uintptr(filePart), uintptr(reserved), 0, 0) + status = ntstatus(r0) + return +} + +func rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) { + r0, _, _ := syscall.Syscall(procRtlDefaultNpAcl.Addr(), 1, uintptr(unsafe.Pointer(dacl)), 0, 0) + status = ntstatus(r0) + return +} + +func lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(accountName) + if err != nil { + return + } + return _lookupAccountName(systemName, _p0, sid, sidSize, refDomain, refDomainSize, sidNameUse) +} + +func _lookupAccountName(systemName *uint16, accountName *uint16, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func convertSidToStringSid(sid *byte, str **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(str)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(str) + if err != nil { + return + } + return _convertStringSecurityDescriptorToSecurityDescriptor(_p0, revision, sd, size) +} + +func _convertStringSecurityDescriptorToSecurityDescriptor(str *uint16, revision uint32, sd *uintptr, size *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procConvertStringSecurityDescriptorToSecurityDescriptorW.Addr(), 4, uintptr(unsafe.Pointer(str)), uintptr(revision), uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(size)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procConvertSecurityDescriptorToStringSecurityDescriptorW.Addr(), 5, uintptr(unsafe.Pointer(sd)), uintptr(revision), uintptr(secInfo), uintptr(unsafe.Pointer(sddl)), uintptr(unsafe.Pointer(sddlSize)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func localFree(mem uintptr) { + syscall.Syscall(procLocalFree.Addr(), 1, uintptr(mem), 0, 0) + return +} + +func getSecurityDescriptorLength(sd uintptr) (len uint32) { + r0, _, _ := syscall.Syscall(procGetSecurityDescriptorLength.Addr(), 1, uintptr(sd), 0, 0) + len = uint32(r0) + return +} + +func getFileInformationByHandleEx(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), 4, uintptr(h), uintptr(class), uintptr(unsafe.Pointer(buffer)), uintptr(size), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func setFileInformationByHandle(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procSetFileInformationByHandle.Addr(), 4, uintptr(h), uintptr(class), uintptr(unsafe.Pointer(buffer)), uintptr(size), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) { + var _p0 uint32 + if releaseAll { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize))) + success = r0 != 0 + if true { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func impersonateSelf(level uint32) (err error) { + r1, _, e1 := syscall.Syscall(procImpersonateSelf.Addr(), 1, uintptr(level), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func revertToSelf() (err error) { + r1, _, e1 := syscall.Syscall(procRevertToSelf.Addr(), 0, 0, 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) { + var _p0 uint32 + if openAsSelf { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall6(procOpenThreadToken.Addr(), 4, uintptr(thread), uintptr(accessMask), uintptr(_p0), uintptr(unsafe.Pointer(token)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getCurrentThread() (h syscall.Handle) { + r0, _, _ := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0) + h = syscall.Handle(r0) + return +} + +func lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(systemName) + if err != nil { + return + } + var _p1 *uint16 + _p1, err = syscall.UTF16PtrFromString(name) + if err != nil { + return + } + return _lookupPrivilegeValue(_p0, _p1, luid) +} + +func _lookupPrivilegeValue(systemName *uint16, name *uint16, luid *uint64) (err error) { + r1, _, e1 := syscall.Syscall(procLookupPrivilegeValueW.Addr(), 3, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(systemName) + if err != nil { + return + } + return _lookupPrivilegeName(_p0, luid, buffer, size) +} + +func _lookupPrivilegeName(systemName *uint16, luid *uint64, buffer *uint16, size *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procLookupPrivilegeNameW.Addr(), 4, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(systemName) + if err != nil { + return + } + return _lookupPrivilegeDisplayName(_p0, name, buffer, size, languageId) +} + +func _lookupPrivilegeDisplayName(systemName *uint16, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procLookupPrivilegeDisplayNameW.Addr(), 5, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(languageId)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 uint32 + if abort { + _p1 = 1 + } else { + _p1 = 0 + } + var _p2 uint32 + if processSecurity { + _p2 = 1 + } else { + _p2 = 0 + } + r1, _, e1 := syscall.Syscall9(procBackupRead.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesRead)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 uint32 + if abort { + _p1 = 1 + } else { + _p1 = 0 + } + var _p2 uint32 + if processSecurity { + _p2 = 1 + } else { + _p2 = 0 + } + r1, _, e1 := syscall.Syscall9(procBackupWrite.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesWritten)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socketError { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/vendor/github.com/darkSasori/todoist/go.mod b/vendor/github.com/darkSasori/todoist/go.mod deleted file mode 100644 index 8b42dbd0..00000000 --- a/vendor/github.com/darkSasori/todoist/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/darkSasori/todoist - -go 1.12 - -require ( - github.com/darkSasori/todoist v0.0.0-20180625015933-ab3a9f0b9d55 - gopkg.in/jarcoal/httpmock.v1 v1.0.0-20180615191036-16f9a43967d6 -) diff --git a/vendor/github.com/darkSasori/todoist/todoist.go b/vendor/github.com/darkSasori/todoist/todoist.go index 12908472..d487426c 100644 --- a/vendor/github.com/darkSasori/todoist/todoist.go +++ b/vendor/github.com/darkSasori/todoist/todoist.go @@ -12,7 +12,7 @@ import ( // Token save the personal token from todoist var Token string -var todoistURL = "https://api.todoist.com/rest/v1/" +var todoistURL = "https://beta.todoist.com/API/v8/" func makeRequest(method, endpoint string, data interface{}) (*http.Response, error) { url := todoistURL + endpoint diff --git a/vendor/github.com/dgrijalva/jwt-go/.gitignore b/vendor/github.com/dgrijalva/jwt-go/.gitignore new file mode 100644 index 00000000..80bed650 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/.gitignore @@ -0,0 +1,4 @@ +.DS_Store +bin + + diff --git a/vendor/github.com/dgrijalva/jwt-go/.travis.yml b/vendor/github.com/dgrijalva/jwt-go/.travis.yml new file mode 100644 index 00000000..1027f56c --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/.travis.yml @@ -0,0 +1,13 @@ +language: go + +script: + - go vet ./... + - go test -v ./... + +go: + - 1.3 + - 1.4 + - 1.5 + - 1.6 + - 1.7 + - tip diff --git a/vendor/github.com/dgrijalva/jwt-go/LICENSE b/vendor/github.com/dgrijalva/jwt-go/LICENSE new file mode 100644 index 00000000..df83a9c2 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/LICENSE @@ -0,0 +1,8 @@ +Copyright (c) 2012 Dave Grijalva + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md b/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md new file mode 100644 index 00000000..7fc1f793 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md @@ -0,0 +1,97 @@ +## Migration Guide from v2 -> v3 + +Version 3 adds several new, frequently requested features. To do so, it introduces a few breaking changes. We've worked to keep these as minimal as possible. This guide explains the breaking changes and how you can quickly update your code. + +### `Token.Claims` is now an interface type + +The most requested feature from the 2.0 verison of this library was the ability to provide a custom type to the JSON parser for claims. This was implemented by introducing a new interface, `Claims`, to replace `map[string]interface{}`. We also included two concrete implementations of `Claims`: `MapClaims` and `StandardClaims`. + +`MapClaims` is an alias for `map[string]interface{}` with built in validation behavior. It is the default claims type when using `Parse`. The usage is unchanged except you must type cast the claims property. + +The old example for parsing a token looked like this.. + +```go + if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { + fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) + } +``` + +is now directly mapped to... + +```go + if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { + claims := token.Claims.(jwt.MapClaims) + fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) + } +``` + +`StandardClaims` is designed to be embedded in your custom type. You can supply a custom claims type with the new `ParseWithClaims` function. Here's an example of using a custom claims type. + +```go + type MyCustomClaims struct { + User string + *StandardClaims + } + + if token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, keyLookupFunc); err == nil { + claims := token.Claims.(*MyCustomClaims) + fmt.Printf("Token for user %v expires %v", claims.User, claims.StandardClaims.ExpiresAt) + } +``` + +### `ParseFromRequest` has been moved + +To keep this library focused on the tokens without becoming overburdened with complex request processing logic, `ParseFromRequest` and its new companion `ParseFromRequestWithClaims` have been moved to a subpackage, `request`. The method signatues have also been augmented to receive a new argument: `Extractor`. + +`Extractors` do the work of picking the token string out of a request. The interface is simple and composable. + +This simple parsing example: + +```go + if token, err := jwt.ParseFromRequest(tokenString, req, keyLookupFunc); err == nil { + fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) + } +``` + +is directly mapped to: + +```go + if token, err := request.ParseFromRequest(req, request.OAuth2Extractor, keyLookupFunc); err == nil { + claims := token.Claims.(jwt.MapClaims) + fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) + } +``` + +There are several concrete `Extractor` types provided for your convenience: + +* `HeaderExtractor` will search a list of headers until one contains content. +* `ArgumentExtractor` will search a list of keys in request query and form arguments until one contains content. +* `MultiExtractor` will try a list of `Extractors` in order until one returns content. +* `AuthorizationHeaderExtractor` will look in the `Authorization` header for a `Bearer` token. +* `OAuth2Extractor` searches the places an OAuth2 token would be specified (per the spec): `Authorization` header and `access_token` argument +* `PostExtractionFilter` wraps an `Extractor`, allowing you to process the content before it's parsed. A simple example is stripping the `Bearer ` text from a header + + +### RSA signing methods no longer accept `[]byte` keys + +Due to a [critical vulnerability](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/), we've decided the convenience of accepting `[]byte` instead of `rsa.PublicKey` or `rsa.PrivateKey` isn't worth the risk of misuse. + +To replace this behavior, we've added two helper methods: `ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error)` and `ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error)`. These are just simple helpers for unpacking PEM encoded PKCS1 and PKCS8 keys. If your keys are encoded any other way, all you need to do is convert them to the `crypto/rsa` package's types. + +```go + func keyLookupFunc(*Token) (interface{}, error) { + // Don't forget to validate the alg is what you expect: + if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { + return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) + } + + // Look up key + key, err := lookupPublicKey(token.Header["kid"]) + if err != nil { + return nil, err + } + + // Unpack key from PEM encoded PKCS8 + return jwt.ParseRSAPublicKeyFromPEM(key) + } +``` diff --git a/vendor/github.com/dgrijalva/jwt-go/README.md b/vendor/github.com/dgrijalva/jwt-go/README.md new file mode 100644 index 00000000..d358d881 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/README.md @@ -0,0 +1,100 @@ +# jwt-go + +[![Build Status](https://travis-ci.org/dgrijalva/jwt-go.svg?branch=master)](https://travis-ci.org/dgrijalva/jwt-go) +[![GoDoc](https://godoc.org/github.com/dgrijalva/jwt-go?status.svg)](https://godoc.org/github.com/dgrijalva/jwt-go) + +A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html) + +**NEW VERSION COMING:** There have been a lot of improvements suggested since the version 3.0.0 released in 2016. I'm working now on cutting two different releases: 3.2.0 will contain any non-breaking changes or enhancements. 4.0.0 will follow shortly which will include breaking changes. See the 4.0.0 milestone to get an idea of what's coming. If you have other ideas, or would like to participate in 4.0.0, now's the time. If you depend on this library and don't want to be interrupted, I recommend you use your dependency mangement tool to pin to version 3. + +**SECURITY NOTICE:** Some older versions of Go have a security issue in the cryotp/elliptic. Recommendation is to upgrade to at least 1.8.3. See issue #216 for more detail. + +**SECURITY NOTICE:** It's important that you [validate the `alg` presented is what you expect](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/). This library attempts to make it easy to do the right thing by requiring key types match the expected alg, but you should take the extra step to verify it in your usage. See the examples provided. + +## What the heck is a JWT? + +JWT.io has [a great introduction](https://jwt.io/introduction) to JSON Web Tokens. + +In short, it's a signed JSON object that does something useful (for example, authentication). It's commonly used for `Bearer` tokens in Oauth 2. A token is made of three parts, separated by `.`'s. The first two parts are JSON objects, that have been [base64url](http://tools.ietf.org/html/rfc4648) encoded. The last part is the signature, encoded the same way. + +The first part is called the header. It contains the necessary information for verifying the last part, the signature. For example, which encryption method was used for signing and what key was used. + +The part in the middle is the interesting bit. It's called the Claims and contains the actual stuff you care about. Refer to [the RFC](http://self-issued.info/docs/draft-jones-json-web-token.html) for information about reserved keys and the proper way to add your own. + +## What's in the box? + +This library supports the parsing and verification as well as the generation and signing of JWTs. Current supported signing algorithms are HMAC SHA, RSA, RSA-PSS, and ECDSA, though hooks are present for adding your own. + +## Examples + +See [the project documentation](https://godoc.org/github.com/dgrijalva/jwt-go) for examples of usage: + +* [Simple example of parsing and validating a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-Parse--Hmac) +* [Simple example of building and signing a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-New--Hmac) +* [Directory of Examples](https://godoc.org/github.com/dgrijalva/jwt-go#pkg-examples) + +## Extensions + +This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`. + +Here's an example of an extension that integrates with the Google App Engine signing tools: https://github.com/someone1/gcp-jwt-go + +## Compliance + +This library was last reviewed to comply with [RTF 7519](http://www.rfc-editor.org/info/rfc7519) dated May 2015 with a few notable differences: + +* In order to protect against accidental use of [Unsecured JWTs](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#UnsecuredJWT), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key. + +## Project Status & Versioning + +This library is considered production ready. Feedback and feature requests are appreciated. The API should be considered stable. There should be very few backwards-incompatible changes outside of major version updates (and only with good reason). + +This project uses [Semantic Versioning 2.0.0](http://semver.org). Accepted pull requests will land on `master`. Periodically, versions will be tagged from `master`. You can find all the releases on [the project releases page](https://github.com/dgrijalva/jwt-go/releases). + +While we try to make it obvious when we make breaking changes, there isn't a great mechanism for pushing announcements out to users. You may want to use this alternative package include: `gopkg.in/dgrijalva/jwt-go.v3`. It will do the right thing WRT semantic versioning. + +**BREAKING CHANGES:*** +* Version 3.0.0 includes _a lot_ of changes from the 2.x line, including a few that break the API. We've tried to break as few things as possible, so there should just be a few type signature changes. A full list of breaking changes is available in `VERSION_HISTORY.md`. See `MIGRATION_GUIDE.md` for more information on updating your code. + +## Usage Tips + +### Signing vs Encryption + +A token is simply a JSON object that is signed by its author. this tells you exactly two things about the data: + +* The author of the token was in the possession of the signing secret +* The data has not been modified since it was signed + +It's important to know that JWT does not provide encryption, which means anyone who has access to the token can read its contents. If you need to protect (encrypt) the data, there is a companion spec, `JWE`, that provides this functionality. JWE is currently outside the scope of this library. + +### Choosing a Signing Method + +There are several signing methods available, and you should probably take the time to learn about the various options before choosing one. The principal design decision is most likely going to be symmetric vs asymmetric. + +Symmetric signing methods, such as HSA, use only a single secret. This is probably the simplest signing method to use since any `[]byte` can be used as a valid secret. They are also slightly computationally faster to use, though this rarely is enough to matter. Symmetric signing methods work the best when both producers and consumers of tokens are trusted, or even the same system. Since the same secret is used to both sign and validate tokens, you can't easily distribute the key for validation. + +Asymmetric signing methods, such as RSA, use different keys for signing and verifying tokens. This makes it possible to produce tokens with a private key, and allow any consumer to access the public key for verification. + +### Signing Methods and Key Types + +Each signing method expects a different object type for its signing keys. See the package documentation for details. Here are the most common ones: + +* The [HMAC signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodHMAC) (`HS256`,`HS384`,`HS512`) expect `[]byte` values for signing and validation +* The [RSA signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodRSA) (`RS256`,`RS384`,`RS512`) expect `*rsa.PrivateKey` for signing and `*rsa.PublicKey` for validation +* The [ECDSA signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodECDSA) (`ES256`,`ES384`,`ES512`) expect `*ecdsa.PrivateKey` for signing and `*ecdsa.PublicKey` for validation + +### JWT and OAuth + +It's worth mentioning that OAuth and JWT are not the same thing. A JWT token is simply a signed JSON object. It can be used anywhere such a thing is useful. There is some confusion, though, as JWT is the most common type of bearer token used in OAuth2 authentication. + +Without going too far down the rabbit hole, here's a description of the interaction of these technologies: + +* OAuth is a protocol for allowing an identity provider to be separate from the service a user is logging in to. For example, whenever you use Facebook to log into a different service (Yelp, Spotify, etc), you are using OAuth. +* OAuth defines several options for passing around authentication data. One popular method is called a "bearer token". A bearer token is simply a string that _should_ only be held by an authenticated user. Thus, simply presenting this token proves your identity. You can probably derive from here why a JWT might make a good bearer token. +* Because bearer tokens are used for authentication, it's important they're kept secret. This is why transactions that use bearer tokens typically happen over SSL. + +## More + +Documentation can be found [on godoc.org](http://godoc.org/github.com/dgrijalva/jwt-go). + +The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in the documentation. diff --git a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md b/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md new file mode 100644 index 00000000..63702983 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md @@ -0,0 +1,118 @@ +## `jwt-go` Version History + +#### 3.2.0 + +* Added method `ParseUnverified` to allow users to split up the tasks of parsing and validation +* HMAC signing method returns `ErrInvalidKeyType` instead of `ErrInvalidKey` where appropriate +* Added options to `request.ParseFromRequest`, which allows for an arbitrary list of modifiers to parsing behavior. Initial set include `WithClaims` and `WithParser`. Existing usage of this function will continue to work as before. +* Deprecated `ParseFromRequestWithClaims` to simplify API in the future. + +#### 3.1.0 + +* Improvements to `jwt` command line tool +* Added `SkipClaimsValidation` option to `Parser` +* Documentation updates + +#### 3.0.0 + +* **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code + * Dropped support for `[]byte` keys when using RSA signing methods. This convenience feature could contribute to security vulnerabilities involving mismatched key types with signing methods. + * `ParseFromRequest` has been moved to `request` subpackage and usage has changed + * The `Claims` property on `Token` is now type `Claims` instead of `map[string]interface{}`. The default value is type `MapClaims`, which is an alias to `map[string]interface{}`. This makes it possible to use a custom type when decoding claims. +* Other Additions and Changes + * Added `Claims` interface type to allow users to decode the claims into a custom type + * Added `ParseWithClaims`, which takes a third argument of type `Claims`. Use this function instead of `Parse` if you have a custom type you'd like to decode into. + * Dramatically improved the functionality and flexibility of `ParseFromRequest`, which is now in the `request` subpackage + * Added `ParseFromRequestWithClaims` which is the `FromRequest` equivalent of `ParseWithClaims` + * Added new interface type `Extractor`, which is used for extracting JWT strings from http requests. Used with `ParseFromRequest` and `ParseFromRequestWithClaims`. + * Added several new, more specific, validation errors to error type bitmask + * Moved examples from README to executable example files + * Signing method registry is now thread safe + * Added new property to `ValidationError`, which contains the raw error returned by calls made by parse/verify (such as those returned by keyfunc or json parser) + +#### 2.7.0 + +This will likely be the last backwards compatible release before 3.0.0, excluding essential bug fixes. + +* Added new option `-show` to the `jwt` command that will just output the decoded token without verifying +* Error text for expired tokens includes how long it's been expired +* Fixed incorrect error returned from `ParseRSAPublicKeyFromPEM` +* Documentation updates + +#### 2.6.0 + +* Exposed inner error within ValidationError +* Fixed validation errors when using UseJSONNumber flag +* Added several unit tests + +#### 2.5.0 + +* Added support for signing method none. You shouldn't use this. The API tries to make this clear. +* Updated/fixed some documentation +* Added more helpful error message when trying to parse tokens that begin with `BEARER ` + +#### 2.4.0 + +* Added new type, Parser, to allow for configuration of various parsing parameters + * You can now specify a list of valid signing methods. Anything outside this set will be rejected. + * You can now opt to use the `json.Number` type instead of `float64` when parsing token JSON +* Added support for [Travis CI](https://travis-ci.org/dgrijalva/jwt-go) +* Fixed some bugs with ECDSA parsing + +#### 2.3.0 + +* Added support for ECDSA signing methods +* Added support for RSA PSS signing methods (requires go v1.4) + +#### 2.2.0 + +* Gracefully handle a `nil` `Keyfunc` being passed to `Parse`. Result will now be the parsed token and an error, instead of a panic. + +#### 2.1.0 + +Backwards compatible API change that was missed in 2.0.0. + +* The `SignedString` method on `Token` now takes `interface{}` instead of `[]byte` + +#### 2.0.0 + +There were two major reasons for breaking backwards compatibility with this update. The first was a refactor required to expand the width of the RSA and HMAC-SHA signing implementations. There will likely be no required code changes to support this change. + +The second update, while unfortunately requiring a small change in integration, is required to open up this library to other signing methods. Not all keys used for all signing methods have a single standard on-disk representation. Requiring `[]byte` as the type for all keys proved too limiting. Additionally, this implementation allows for pre-parsed tokens to be reused, which might matter in an application that parses a high volume of tokens with a small set of keys. Backwards compatibilty has been maintained for passing `[]byte` to the RSA signing methods, but they will also accept `*rsa.PublicKey` and `*rsa.PrivateKey`. + +It is likely the only integration change required here will be to change `func(t *jwt.Token) ([]byte, error)` to `func(t *jwt.Token) (interface{}, error)` when calling `Parse`. + +* **Compatibility Breaking Changes** + * `SigningMethodHS256` is now `*SigningMethodHMAC` instead of `type struct` + * `SigningMethodRS256` is now `*SigningMethodRSA` instead of `type struct` + * `KeyFunc` now returns `interface{}` instead of `[]byte` + * `SigningMethod.Sign` now takes `interface{}` instead of `[]byte` for the key + * `SigningMethod.Verify` now takes `interface{}` instead of `[]byte` for the key +* Renamed type `SigningMethodHS256` to `SigningMethodHMAC`. Specific sizes are now just instances of this type. + * Added public package global `SigningMethodHS256` + * Added public package global `SigningMethodHS384` + * Added public package global `SigningMethodHS512` +* Renamed type `SigningMethodRS256` to `SigningMethodRSA`. Specific sizes are now just instances of this type. + * Added public package global `SigningMethodRS256` + * Added public package global `SigningMethodRS384` + * Added public package global `SigningMethodRS512` +* Moved sample private key for HMAC tests from an inline value to a file on disk. Value is unchanged. +* Refactored the RSA implementation to be easier to read +* Exposed helper methods `ParseRSAPrivateKeyFromPEM` and `ParseRSAPublicKeyFromPEM` + +#### 1.0.2 + +* Fixed bug in parsing public keys from certificates +* Added more tests around the parsing of keys for RS256 +* Code refactoring in RS256 implementation. No functional changes + +#### 1.0.1 + +* Fixed panic if RS256 signing method was passed an invalid key + +#### 1.0.0 + +* First versioned release +* API stabilized +* Supports creating, signing, parsing, and validating JWT tokens +* Supports RS256 and HS256 signing methods \ No newline at end of file diff --git a/vendor/github.com/dgrijalva/jwt-go/claims.go b/vendor/github.com/dgrijalva/jwt-go/claims.go new file mode 100644 index 00000000..f0228f02 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/claims.go @@ -0,0 +1,134 @@ +package jwt + +import ( + "crypto/subtle" + "fmt" + "time" +) + +// For a type to be a Claims object, it must just have a Valid method that determines +// if the token is invalid for any supported reason +type Claims interface { + Valid() error +} + +// Structured version of Claims Section, as referenced at +// https://tools.ietf.org/html/rfc7519#section-4.1 +// See examples for how to use this with your own claim types +type StandardClaims struct { + Audience string `json:"aud,omitempty"` + ExpiresAt int64 `json:"exp,omitempty"` + Id string `json:"jti,omitempty"` + IssuedAt int64 `json:"iat,omitempty"` + Issuer string `json:"iss,omitempty"` + NotBefore int64 `json:"nbf,omitempty"` + Subject string `json:"sub,omitempty"` +} + +// Validates time based claims "exp, iat, nbf". +// There is no accounting for clock skew. +// As well, if any of the above claims are not in the token, it will still +// be considered a valid claim. +func (c StandardClaims) Valid() error { + vErr := new(ValidationError) + now := TimeFunc().Unix() + + // The claims below are optional, by default, so if they are set to the + // default value in Go, let's not fail the verification for them. + if c.VerifyExpiresAt(now, false) == false { + delta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0)) + vErr.Inner = fmt.Errorf("token is expired by %v", delta) + vErr.Errors |= ValidationErrorExpired + } + + if c.VerifyIssuedAt(now, false) == false { + vErr.Inner = fmt.Errorf("Token used before issued") + vErr.Errors |= ValidationErrorIssuedAt + } + + if c.VerifyNotBefore(now, false) == false { + vErr.Inner = fmt.Errorf("token is not valid yet") + vErr.Errors |= ValidationErrorNotValidYet + } + + if vErr.valid() { + return nil + } + + return vErr +} + +// Compares the aud claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (c *StandardClaims) VerifyAudience(cmp string, req bool) bool { + return verifyAud(c.Audience, cmp, req) +} + +// Compares the exp claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool { + return verifyExp(c.ExpiresAt, cmp, req) +} + +// Compares the iat claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool { + return verifyIat(c.IssuedAt, cmp, req) +} + +// Compares the iss claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool { + return verifyIss(c.Issuer, cmp, req) +} + +// Compares the nbf claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool { + return verifyNbf(c.NotBefore, cmp, req) +} + +// ----- helpers + +func verifyAud(aud string, cmp string, required bool) bool { + if aud == "" { + return !required + } + if subtle.ConstantTimeCompare([]byte(aud), []byte(cmp)) != 0 { + return true + } else { + return false + } +} + +func verifyExp(exp int64, now int64, required bool) bool { + if exp == 0 { + return !required + } + return now <= exp +} + +func verifyIat(iat int64, now int64, required bool) bool { + if iat == 0 { + return !required + } + return now >= iat +} + +func verifyIss(iss string, cmp string, required bool) bool { + if iss == "" { + return !required + } + if subtle.ConstantTimeCompare([]byte(iss), []byte(cmp)) != 0 { + return true + } else { + return false + } +} + +func verifyNbf(nbf int64, now int64, required bool) bool { + if nbf == 0 { + return !required + } + return now >= nbf +} diff --git a/vendor/github.com/dgrijalva/jwt-go/doc.go b/vendor/github.com/dgrijalva/jwt-go/doc.go new file mode 100644 index 00000000..a86dc1a3 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/doc.go @@ -0,0 +1,4 @@ +// Package jwt is a Go implementation of JSON Web Tokens: http://self-issued.info/docs/draft-jones-json-web-token.html +// +// See README.md for more info. +package jwt diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa.go new file mode 100644 index 00000000..f9773812 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/ecdsa.go @@ -0,0 +1,148 @@ +package jwt + +import ( + "crypto" + "crypto/ecdsa" + "crypto/rand" + "errors" + "math/big" +) + +var ( + // Sadly this is missing from crypto/ecdsa compared to crypto/rsa + ErrECDSAVerification = errors.New("crypto/ecdsa: verification error") +) + +// Implements the ECDSA family of signing methods signing methods +// Expects *ecdsa.PrivateKey for signing and *ecdsa.PublicKey for verification +type SigningMethodECDSA struct { + Name string + Hash crypto.Hash + KeySize int + CurveBits int +} + +// Specific instances for EC256 and company +var ( + SigningMethodES256 *SigningMethodECDSA + SigningMethodES384 *SigningMethodECDSA + SigningMethodES512 *SigningMethodECDSA +) + +func init() { + // ES256 + SigningMethodES256 = &SigningMethodECDSA{"ES256", crypto.SHA256, 32, 256} + RegisterSigningMethod(SigningMethodES256.Alg(), func() SigningMethod { + return SigningMethodES256 + }) + + // ES384 + SigningMethodES384 = &SigningMethodECDSA{"ES384", crypto.SHA384, 48, 384} + RegisterSigningMethod(SigningMethodES384.Alg(), func() SigningMethod { + return SigningMethodES384 + }) + + // ES512 + SigningMethodES512 = &SigningMethodECDSA{"ES512", crypto.SHA512, 66, 521} + RegisterSigningMethod(SigningMethodES512.Alg(), func() SigningMethod { + return SigningMethodES512 + }) +} + +func (m *SigningMethodECDSA) Alg() string { + return m.Name +} + +// Implements the Verify method from SigningMethod +// For this verify method, key must be an ecdsa.PublicKey struct +func (m *SigningMethodECDSA) Verify(signingString, signature string, key interface{}) error { + var err error + + // Decode the signature + var sig []byte + if sig, err = DecodeSegment(signature); err != nil { + return err + } + + // Get the key + var ecdsaKey *ecdsa.PublicKey + switch k := key.(type) { + case *ecdsa.PublicKey: + ecdsaKey = k + default: + return ErrInvalidKeyType + } + + if len(sig) != 2*m.KeySize { + return ErrECDSAVerification + } + + r := big.NewInt(0).SetBytes(sig[:m.KeySize]) + s := big.NewInt(0).SetBytes(sig[m.KeySize:]) + + // Create hasher + if !m.Hash.Available() { + return ErrHashUnavailable + } + hasher := m.Hash.New() + hasher.Write([]byte(signingString)) + + // Verify the signature + if verifystatus := ecdsa.Verify(ecdsaKey, hasher.Sum(nil), r, s); verifystatus == true { + return nil + } else { + return ErrECDSAVerification + } +} + +// Implements the Sign method from SigningMethod +// For this signing method, key must be an ecdsa.PrivateKey struct +func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string, error) { + // Get the key + var ecdsaKey *ecdsa.PrivateKey + switch k := key.(type) { + case *ecdsa.PrivateKey: + ecdsaKey = k + default: + return "", ErrInvalidKeyType + } + + // Create the hasher + if !m.Hash.Available() { + return "", ErrHashUnavailable + } + + hasher := m.Hash.New() + hasher.Write([]byte(signingString)) + + // Sign the string and return r, s + if r, s, err := ecdsa.Sign(rand.Reader, ecdsaKey, hasher.Sum(nil)); err == nil { + curveBits := ecdsaKey.Curve.Params().BitSize + + if m.CurveBits != curveBits { + return "", ErrInvalidKey + } + + keyBytes := curveBits / 8 + if curveBits%8 > 0 { + keyBytes += 1 + } + + // We serialize the outpus (r and s) into big-endian byte arrays and pad + // them with zeros on the left to make sure the sizes work out. Both arrays + // must be keyBytes long, and the output must be 2*keyBytes long. + rBytes := r.Bytes() + rBytesPadded := make([]byte, keyBytes) + copy(rBytesPadded[keyBytes-len(rBytes):], rBytes) + + sBytes := s.Bytes() + sBytesPadded := make([]byte, keyBytes) + copy(sBytesPadded[keyBytes-len(sBytes):], sBytes) + + out := append(rBytesPadded, sBytesPadded...) + + return EncodeSegment(out), nil + } else { + return "", err + } +} diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go new file mode 100644 index 00000000..d19624b7 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go @@ -0,0 +1,67 @@ +package jwt + +import ( + "crypto/ecdsa" + "crypto/x509" + "encoding/pem" + "errors" +) + +var ( + ErrNotECPublicKey = errors.New("Key is not a valid ECDSA public key") + ErrNotECPrivateKey = errors.New("Key is not a valid ECDSA private key") +) + +// Parse PEM encoded Elliptic Curve Private Key Structure +func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) { + var err error + + // Parse PEM block + var block *pem.Block + if block, _ = pem.Decode(key); block == nil { + return nil, ErrKeyMustBePEMEncoded + } + + // Parse the key + var parsedKey interface{} + if parsedKey, err = x509.ParseECPrivateKey(block.Bytes); err != nil { + return nil, err + } + + var pkey *ecdsa.PrivateKey + var ok bool + if pkey, ok = parsedKey.(*ecdsa.PrivateKey); !ok { + return nil, ErrNotECPrivateKey + } + + return pkey, nil +} + +// Parse PEM encoded PKCS1 or PKCS8 public key +func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) { + var err error + + // Parse PEM block + var block *pem.Block + if block, _ = pem.Decode(key); block == nil { + return nil, ErrKeyMustBePEMEncoded + } + + // Parse the key + var parsedKey interface{} + if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { + if cert, err := x509.ParseCertificate(block.Bytes); err == nil { + parsedKey = cert.PublicKey + } else { + return nil, err + } + } + + var pkey *ecdsa.PublicKey + var ok bool + if pkey, ok = parsedKey.(*ecdsa.PublicKey); !ok { + return nil, ErrNotECPublicKey + } + + return pkey, nil +} diff --git a/vendor/github.com/dgrijalva/jwt-go/errors.go b/vendor/github.com/dgrijalva/jwt-go/errors.go new file mode 100644 index 00000000..1c93024a --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/errors.go @@ -0,0 +1,59 @@ +package jwt + +import ( + "errors" +) + +// Error constants +var ( + ErrInvalidKey = errors.New("key is invalid") + ErrInvalidKeyType = errors.New("key is of invalid type") + ErrHashUnavailable = errors.New("the requested hash function is unavailable") +) + +// The errors that might occur when parsing and validating a token +const ( + ValidationErrorMalformed uint32 = 1 << iota // Token is malformed + ValidationErrorUnverifiable // Token could not be verified because of signing problems + ValidationErrorSignatureInvalid // Signature validation failed + + // Standard Claim validation errors + ValidationErrorAudience // AUD validation failed + ValidationErrorExpired // EXP validation failed + ValidationErrorIssuedAt // IAT validation failed + ValidationErrorIssuer // ISS validation failed + ValidationErrorNotValidYet // NBF validation failed + ValidationErrorId // JTI validation failed + ValidationErrorClaimsInvalid // Generic claims validation error +) + +// Helper for constructing a ValidationError with a string error message +func NewValidationError(errorText string, errorFlags uint32) *ValidationError { + return &ValidationError{ + text: errorText, + Errors: errorFlags, + } +} + +// The error from Parse if token is not valid +type ValidationError struct { + Inner error // stores the error returned by external dependencies, i.e.: KeyFunc + Errors uint32 // bitfield. see ValidationError... constants + text string // errors that do not have a valid error just have text +} + +// Validation error is an error type +func (e ValidationError) Error() string { + if e.Inner != nil { + return e.Inner.Error() + } else if e.text != "" { + return e.text + } else { + return "token is invalid" + } +} + +// No errors +func (e *ValidationError) valid() bool { + return e.Errors == 0 +} diff --git a/vendor/github.com/dgrijalva/jwt-go/hmac.go b/vendor/github.com/dgrijalva/jwt-go/hmac.go new file mode 100644 index 00000000..addbe5d4 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/hmac.go @@ -0,0 +1,95 @@ +package jwt + +import ( + "crypto" + "crypto/hmac" + "errors" +) + +// Implements the HMAC-SHA family of signing methods signing methods +// Expects key type of []byte for both signing and validation +type SigningMethodHMAC struct { + Name string + Hash crypto.Hash +} + +// Specific instances for HS256 and company +var ( + SigningMethodHS256 *SigningMethodHMAC + SigningMethodHS384 *SigningMethodHMAC + SigningMethodHS512 *SigningMethodHMAC + ErrSignatureInvalid = errors.New("signature is invalid") +) + +func init() { + // HS256 + SigningMethodHS256 = &SigningMethodHMAC{"HS256", crypto.SHA256} + RegisterSigningMethod(SigningMethodHS256.Alg(), func() SigningMethod { + return SigningMethodHS256 + }) + + // HS384 + SigningMethodHS384 = &SigningMethodHMAC{"HS384", crypto.SHA384} + RegisterSigningMethod(SigningMethodHS384.Alg(), func() SigningMethod { + return SigningMethodHS384 + }) + + // HS512 + SigningMethodHS512 = &SigningMethodHMAC{"HS512", crypto.SHA512} + RegisterSigningMethod(SigningMethodHS512.Alg(), func() SigningMethod { + return SigningMethodHS512 + }) +} + +func (m *SigningMethodHMAC) Alg() string { + return m.Name +} + +// Verify the signature of HSXXX tokens. Returns nil if the signature is valid. +func (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error { + // Verify the key is the right type + keyBytes, ok := key.([]byte) + if !ok { + return ErrInvalidKeyType + } + + // Decode signature, for comparison + sig, err := DecodeSegment(signature) + if err != nil { + return err + } + + // Can we use the specified hashing method? + if !m.Hash.Available() { + return ErrHashUnavailable + } + + // This signing method is symmetric, so we validate the signature + // by reproducing the signature from the signing string and key, then + // comparing that against the provided signature. + hasher := hmac.New(m.Hash.New, keyBytes) + hasher.Write([]byte(signingString)) + if !hmac.Equal(sig, hasher.Sum(nil)) { + return ErrSignatureInvalid + } + + // No validation errors. Signature is good. + return nil +} + +// Implements the Sign method from SigningMethod for this signing method. +// Key must be []byte +func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) { + if keyBytes, ok := key.([]byte); ok { + if !m.Hash.Available() { + return "", ErrHashUnavailable + } + + hasher := hmac.New(m.Hash.New, keyBytes) + hasher.Write([]byte(signingString)) + + return EncodeSegment(hasher.Sum(nil)), nil + } + + return "", ErrInvalidKeyType +} diff --git a/vendor/github.com/dgrijalva/jwt-go/map_claims.go b/vendor/github.com/dgrijalva/jwt-go/map_claims.go new file mode 100644 index 00000000..291213c4 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/map_claims.go @@ -0,0 +1,94 @@ +package jwt + +import ( + "encoding/json" + "errors" + // "fmt" +) + +// Claims type that uses the map[string]interface{} for JSON decoding +// This is the default claims type if you don't supply one +type MapClaims map[string]interface{} + +// Compares the aud claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (m MapClaims) VerifyAudience(cmp string, req bool) bool { + aud, _ := m["aud"].(string) + return verifyAud(aud, cmp, req) +} + +// Compares the exp claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool { + switch exp := m["exp"].(type) { + case float64: + return verifyExp(int64(exp), cmp, req) + case json.Number: + v, _ := exp.Int64() + return verifyExp(v, cmp, req) + } + return req == false +} + +// Compares the iat claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool { + switch iat := m["iat"].(type) { + case float64: + return verifyIat(int64(iat), cmp, req) + case json.Number: + v, _ := iat.Int64() + return verifyIat(v, cmp, req) + } + return req == false +} + +// Compares the iss claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (m MapClaims) VerifyIssuer(cmp string, req bool) bool { + iss, _ := m["iss"].(string) + return verifyIss(iss, cmp, req) +} + +// Compares the nbf claim against cmp. +// If required is false, this method will return true if the value matches or is unset +func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool { + switch nbf := m["nbf"].(type) { + case float64: + return verifyNbf(int64(nbf), cmp, req) + case json.Number: + v, _ := nbf.Int64() + return verifyNbf(v, cmp, req) + } + return req == false +} + +// Validates time based claims "exp, iat, nbf". +// There is no accounting for clock skew. +// As well, if any of the above claims are not in the token, it will still +// be considered a valid claim. +func (m MapClaims) Valid() error { + vErr := new(ValidationError) + now := TimeFunc().Unix() + + if m.VerifyExpiresAt(now, false) == false { + vErr.Inner = errors.New("Token is expired") + vErr.Errors |= ValidationErrorExpired + } + + if m.VerifyIssuedAt(now, false) == false { + vErr.Inner = errors.New("Token used before issued") + vErr.Errors |= ValidationErrorIssuedAt + } + + if m.VerifyNotBefore(now, false) == false { + vErr.Inner = errors.New("Token is not valid yet") + vErr.Errors |= ValidationErrorNotValidYet + } + + if vErr.valid() { + return nil + } + + return vErr +} diff --git a/vendor/github.com/dgrijalva/jwt-go/none.go b/vendor/github.com/dgrijalva/jwt-go/none.go new file mode 100644 index 00000000..f04d189d --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/none.go @@ -0,0 +1,52 @@ +package jwt + +// Implements the none signing method. This is required by the spec +// but you probably should never use it. +var SigningMethodNone *signingMethodNone + +const UnsafeAllowNoneSignatureType unsafeNoneMagicConstant = "none signing method allowed" + +var NoneSignatureTypeDisallowedError error + +type signingMethodNone struct{} +type unsafeNoneMagicConstant string + +func init() { + SigningMethodNone = &signingMethodNone{} + NoneSignatureTypeDisallowedError = NewValidationError("'none' signature type is not allowed", ValidationErrorSignatureInvalid) + + RegisterSigningMethod(SigningMethodNone.Alg(), func() SigningMethod { + return SigningMethodNone + }) +} + +func (m *signingMethodNone) Alg() string { + return "none" +} + +// Only allow 'none' alg type if UnsafeAllowNoneSignatureType is specified as the key +func (m *signingMethodNone) Verify(signingString, signature string, key interface{}) (err error) { + // Key must be UnsafeAllowNoneSignatureType to prevent accidentally + // accepting 'none' signing method + if _, ok := key.(unsafeNoneMagicConstant); !ok { + return NoneSignatureTypeDisallowedError + } + // If signing method is none, signature must be an empty string + if signature != "" { + return NewValidationError( + "'none' signing method with non-empty signature", + ValidationErrorSignatureInvalid, + ) + } + + // Accept 'none' signing method. + return nil +} + +// Only allow 'none' signing if UnsafeAllowNoneSignatureType is specified as the key +func (m *signingMethodNone) Sign(signingString string, key interface{}) (string, error) { + if _, ok := key.(unsafeNoneMagicConstant); ok { + return "", nil + } + return "", NoneSignatureTypeDisallowedError +} diff --git a/vendor/github.com/dgrijalva/jwt-go/parser.go b/vendor/github.com/dgrijalva/jwt-go/parser.go new file mode 100644 index 00000000..d6901d9a --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/parser.go @@ -0,0 +1,148 @@ +package jwt + +import ( + "bytes" + "encoding/json" + "fmt" + "strings" +) + +type Parser struct { + ValidMethods []string // If populated, only these methods will be considered valid + UseJSONNumber bool // Use JSON Number format in JSON decoder + SkipClaimsValidation bool // Skip claims validation during token parsing +} + +// Parse, validate, and return a token. +// keyFunc will receive the parsed token and should return the key for validating. +// If everything is kosher, err will be nil +func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { + return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) +} + +func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { + token, parts, err := p.ParseUnverified(tokenString, claims) + if err != nil { + return token, err + } + + // Verify signing method is in the required set + if p.ValidMethods != nil { + var signingMethodValid = false + var alg = token.Method.Alg() + for _, m := range p.ValidMethods { + if m == alg { + signingMethodValid = true + break + } + } + if !signingMethodValid { + // signing method is not in the listed set + return token, NewValidationError(fmt.Sprintf("signing method %v is invalid", alg), ValidationErrorSignatureInvalid) + } + } + + // Lookup key + var key interface{} + if keyFunc == nil { + // keyFunc was not provided. short circuiting validation + return token, NewValidationError("no Keyfunc was provided.", ValidationErrorUnverifiable) + } + if key, err = keyFunc(token); err != nil { + // keyFunc returned an error + if ve, ok := err.(*ValidationError); ok { + return token, ve + } + return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable} + } + + vErr := &ValidationError{} + + // Validate Claims + if !p.SkipClaimsValidation { + if err := token.Claims.Valid(); err != nil { + + // If the Claims Valid returned an error, check if it is a validation error, + // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set + if e, ok := err.(*ValidationError); !ok { + vErr = &ValidationError{Inner: err, Errors: ValidationErrorClaimsInvalid} + } else { + vErr = e + } + } + } + + // Perform validation + token.Signature = parts[2] + if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { + vErr.Inner = err + vErr.Errors |= ValidationErrorSignatureInvalid + } + + if vErr.valid() { + token.Valid = true + return token, nil + } + + return token, vErr +} + +// WARNING: Don't use this method unless you know what you're doing +// +// This method parses the token but doesn't validate the signature. It's only +// ever useful in cases where you know the signature is valid (because it has +// been checked previously in the stack) and you want to extract values from +// it. +func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { + parts = strings.Split(tokenString, ".") + if len(parts) != 3 { + return nil, parts, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) + } + + token = &Token{Raw: tokenString} + + // parse Header + var headerBytes []byte + if headerBytes, err = DecodeSegment(parts[0]); err != nil { + if strings.HasPrefix(strings.ToLower(tokenString), "bearer ") { + return token, parts, NewValidationError("tokenstring should not contain 'bearer '", ValidationErrorMalformed) + } + return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} + } + if err = json.Unmarshal(headerBytes, &token.Header); err != nil { + return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} + } + + // parse Claims + var claimBytes []byte + token.Claims = claims + + if claimBytes, err = DecodeSegment(parts[1]); err != nil { + return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} + } + dec := json.NewDecoder(bytes.NewBuffer(claimBytes)) + if p.UseJSONNumber { + dec.UseNumber() + } + // JSON Decode. Special case for map type to avoid weird pointer behavior + if c, ok := token.Claims.(MapClaims); ok { + err = dec.Decode(&c) + } else { + err = dec.Decode(&claims) + } + // Handle decode error + if err != nil { + return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} + } + + // Lookup signature method + if method, ok := token.Header["alg"].(string); ok { + if token.Method = GetSigningMethod(method); token.Method == nil { + return token, parts, NewValidationError("signing method (alg) is unavailable.", ValidationErrorUnverifiable) + } + } else { + return token, parts, NewValidationError("signing method (alg) is unspecified.", ValidationErrorUnverifiable) + } + + return token, parts, nil +} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa.go b/vendor/github.com/dgrijalva/jwt-go/rsa.go new file mode 100644 index 00000000..e4caf1ca --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/rsa.go @@ -0,0 +1,101 @@ +package jwt + +import ( + "crypto" + "crypto/rand" + "crypto/rsa" +) + +// Implements the RSA family of signing methods signing methods +// Expects *rsa.PrivateKey for signing and *rsa.PublicKey for validation +type SigningMethodRSA struct { + Name string + Hash crypto.Hash +} + +// Specific instances for RS256 and company +var ( + SigningMethodRS256 *SigningMethodRSA + SigningMethodRS384 *SigningMethodRSA + SigningMethodRS512 *SigningMethodRSA +) + +func init() { + // RS256 + SigningMethodRS256 = &SigningMethodRSA{"RS256", crypto.SHA256} + RegisterSigningMethod(SigningMethodRS256.Alg(), func() SigningMethod { + return SigningMethodRS256 + }) + + // RS384 + SigningMethodRS384 = &SigningMethodRSA{"RS384", crypto.SHA384} + RegisterSigningMethod(SigningMethodRS384.Alg(), func() SigningMethod { + return SigningMethodRS384 + }) + + // RS512 + SigningMethodRS512 = &SigningMethodRSA{"RS512", crypto.SHA512} + RegisterSigningMethod(SigningMethodRS512.Alg(), func() SigningMethod { + return SigningMethodRS512 + }) +} + +func (m *SigningMethodRSA) Alg() string { + return m.Name +} + +// Implements the Verify method from SigningMethod +// For this signing method, must be an *rsa.PublicKey structure. +func (m *SigningMethodRSA) Verify(signingString, signature string, key interface{}) error { + var err error + + // Decode the signature + var sig []byte + if sig, err = DecodeSegment(signature); err != nil { + return err + } + + var rsaKey *rsa.PublicKey + var ok bool + + if rsaKey, ok = key.(*rsa.PublicKey); !ok { + return ErrInvalidKeyType + } + + // Create hasher + if !m.Hash.Available() { + return ErrHashUnavailable + } + hasher := m.Hash.New() + hasher.Write([]byte(signingString)) + + // Verify the signature + return rsa.VerifyPKCS1v15(rsaKey, m.Hash, hasher.Sum(nil), sig) +} + +// Implements the Sign method from SigningMethod +// For this signing method, must be an *rsa.PrivateKey structure. +func (m *SigningMethodRSA) Sign(signingString string, key interface{}) (string, error) { + var rsaKey *rsa.PrivateKey + var ok bool + + // Validate type of key + if rsaKey, ok = key.(*rsa.PrivateKey); !ok { + return "", ErrInvalidKey + } + + // Create the hasher + if !m.Hash.Available() { + return "", ErrHashUnavailable + } + + hasher := m.Hash.New() + hasher.Write([]byte(signingString)) + + // Sign the string and return the encoded bytes + if sigBytes, err := rsa.SignPKCS1v15(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil)); err == nil { + return EncodeSegment(sigBytes), nil + } else { + return "", err + } +} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go b/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go new file mode 100644 index 00000000..10ee9db8 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go @@ -0,0 +1,126 @@ +// +build go1.4 + +package jwt + +import ( + "crypto" + "crypto/rand" + "crypto/rsa" +) + +// Implements the RSAPSS family of signing methods signing methods +type SigningMethodRSAPSS struct { + *SigningMethodRSA + Options *rsa.PSSOptions +} + +// Specific instances for RS/PS and company +var ( + SigningMethodPS256 *SigningMethodRSAPSS + SigningMethodPS384 *SigningMethodRSAPSS + SigningMethodPS512 *SigningMethodRSAPSS +) + +func init() { + // PS256 + SigningMethodPS256 = &SigningMethodRSAPSS{ + &SigningMethodRSA{ + Name: "PS256", + Hash: crypto.SHA256, + }, + &rsa.PSSOptions{ + SaltLength: rsa.PSSSaltLengthAuto, + Hash: crypto.SHA256, + }, + } + RegisterSigningMethod(SigningMethodPS256.Alg(), func() SigningMethod { + return SigningMethodPS256 + }) + + // PS384 + SigningMethodPS384 = &SigningMethodRSAPSS{ + &SigningMethodRSA{ + Name: "PS384", + Hash: crypto.SHA384, + }, + &rsa.PSSOptions{ + SaltLength: rsa.PSSSaltLengthAuto, + Hash: crypto.SHA384, + }, + } + RegisterSigningMethod(SigningMethodPS384.Alg(), func() SigningMethod { + return SigningMethodPS384 + }) + + // PS512 + SigningMethodPS512 = &SigningMethodRSAPSS{ + &SigningMethodRSA{ + Name: "PS512", + Hash: crypto.SHA512, + }, + &rsa.PSSOptions{ + SaltLength: rsa.PSSSaltLengthAuto, + Hash: crypto.SHA512, + }, + } + RegisterSigningMethod(SigningMethodPS512.Alg(), func() SigningMethod { + return SigningMethodPS512 + }) +} + +// Implements the Verify method from SigningMethod +// For this verify method, key must be an rsa.PublicKey struct +func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interface{}) error { + var err error + + // Decode the signature + var sig []byte + if sig, err = DecodeSegment(signature); err != nil { + return err + } + + var rsaKey *rsa.PublicKey + switch k := key.(type) { + case *rsa.PublicKey: + rsaKey = k + default: + return ErrInvalidKey + } + + // Create hasher + if !m.Hash.Available() { + return ErrHashUnavailable + } + hasher := m.Hash.New() + hasher.Write([]byte(signingString)) + + return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, m.Options) +} + +// Implements the Sign method from SigningMethod +// For this signing method, key must be an rsa.PrivateKey struct +func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) (string, error) { + var rsaKey *rsa.PrivateKey + + switch k := key.(type) { + case *rsa.PrivateKey: + rsaKey = k + default: + return "", ErrInvalidKeyType + } + + // Create the hasher + if !m.Hash.Available() { + return "", ErrHashUnavailable + } + + hasher := m.Hash.New() + hasher.Write([]byte(signingString)) + + // Sign the string and return the encoded bytes + if sigBytes, err := rsa.SignPSS(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil), m.Options); err == nil { + return EncodeSegment(sigBytes), nil + } else { + return "", err + } +} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go new file mode 100644 index 00000000..a5ababf9 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go @@ -0,0 +1,101 @@ +package jwt + +import ( + "crypto/rsa" + "crypto/x509" + "encoding/pem" + "errors" +) + +var ( + ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be PEM encoded PKCS1 or PKCS8 private key") + ErrNotRSAPrivateKey = errors.New("Key is not a valid RSA private key") + ErrNotRSAPublicKey = errors.New("Key is not a valid RSA public key") +) + +// Parse PEM encoded PKCS1 or PKCS8 private key +func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) { + var err error + + // Parse PEM block + var block *pem.Block + if block, _ = pem.Decode(key); block == nil { + return nil, ErrKeyMustBePEMEncoded + } + + var parsedKey interface{} + if parsedKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil { + if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil { + return nil, err + } + } + + var pkey *rsa.PrivateKey + var ok bool + if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { + return nil, ErrNotRSAPrivateKey + } + + return pkey, nil +} + +// Parse PEM encoded PKCS1 or PKCS8 private key protected with password +func ParseRSAPrivateKeyFromPEMWithPassword(key []byte, password string) (*rsa.PrivateKey, error) { + var err error + + // Parse PEM block + var block *pem.Block + if block, _ = pem.Decode(key); block == nil { + return nil, ErrKeyMustBePEMEncoded + } + + var parsedKey interface{} + + var blockDecrypted []byte + if blockDecrypted, err = x509.DecryptPEMBlock(block, []byte(password)); err != nil { + return nil, err + } + + if parsedKey, err = x509.ParsePKCS1PrivateKey(blockDecrypted); err != nil { + if parsedKey, err = x509.ParsePKCS8PrivateKey(blockDecrypted); err != nil { + return nil, err + } + } + + var pkey *rsa.PrivateKey + var ok bool + if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { + return nil, ErrNotRSAPrivateKey + } + + return pkey, nil +} + +// Parse PEM encoded PKCS1 or PKCS8 public key +func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) { + var err error + + // Parse PEM block + var block *pem.Block + if block, _ = pem.Decode(key); block == nil { + return nil, ErrKeyMustBePEMEncoded + } + + // Parse the key + var parsedKey interface{} + if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { + if cert, err := x509.ParseCertificate(block.Bytes); err == nil { + parsedKey = cert.PublicKey + } else { + return nil, err + } + } + + var pkey *rsa.PublicKey + var ok bool + if pkey, ok = parsedKey.(*rsa.PublicKey); !ok { + return nil, ErrNotRSAPublicKey + } + + return pkey, nil +} diff --git a/vendor/github.com/dgrijalva/jwt-go/signing_method.go b/vendor/github.com/dgrijalva/jwt-go/signing_method.go new file mode 100644 index 00000000..ed1f212b --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/signing_method.go @@ -0,0 +1,35 @@ +package jwt + +import ( + "sync" +) + +var signingMethods = map[string]func() SigningMethod{} +var signingMethodLock = new(sync.RWMutex) + +// Implement SigningMethod to add new methods for signing or verifying tokens. +type SigningMethod interface { + Verify(signingString, signature string, key interface{}) error // Returns nil if signature is valid + Sign(signingString string, key interface{}) (string, error) // Returns encoded signature or error + Alg() string // returns the alg identifier for this method (example: 'HS256') +} + +// Register the "alg" name and a factory function for signing method. +// This is typically done during init() in the method's implementation +func RegisterSigningMethod(alg string, f func() SigningMethod) { + signingMethodLock.Lock() + defer signingMethodLock.Unlock() + + signingMethods[alg] = f +} + +// Get a signing method from an "alg" string +func GetSigningMethod(alg string) (method SigningMethod) { + signingMethodLock.RLock() + defer signingMethodLock.RUnlock() + + if methodF, ok := signingMethods[alg]; ok { + method = methodF() + } + return +} diff --git a/vendor/github.com/dgrijalva/jwt-go/token.go b/vendor/github.com/dgrijalva/jwt-go/token.go new file mode 100644 index 00000000..d637e086 --- /dev/null +++ b/vendor/github.com/dgrijalva/jwt-go/token.go @@ -0,0 +1,108 @@ +package jwt + +import ( + "encoding/base64" + "encoding/json" + "strings" + "time" +) + +// TimeFunc provides the current time when parsing token to validate "exp" claim (expiration time). +// You can override it to use another time value. This is useful for testing or if your +// server uses a different time zone than your tokens. +var TimeFunc = time.Now + +// Parse methods use this callback function to supply +// the key for verification. The function receives the parsed, +// but unverified Token. This allows you to use properties in the +// Header of the token (such as `kid`) to identify which key to use. +type Keyfunc func(*Token) (interface{}, error) + +// A JWT Token. Different fields will be used depending on whether you're +// creating or parsing/verifying a token. +type Token struct { + Raw string // The raw token. Populated when you Parse a token + Method SigningMethod // The signing method used or to be used + Header map[string]interface{} // The first segment of the token + Claims Claims // The second segment of the token + Signature string // The third segment of the token. Populated when you Parse a token + Valid bool // Is the token valid? Populated when you Parse/Verify a token +} + +// Create a new Token. Takes a signing method +func New(method SigningMethod) *Token { + return NewWithClaims(method, MapClaims{}) +} + +func NewWithClaims(method SigningMethod, claims Claims) *Token { + return &Token{ + Header: map[string]interface{}{ + "typ": "JWT", + "alg": method.Alg(), + }, + Claims: claims, + Method: method, + } +} + +// Get the complete, signed token +func (t *Token) SignedString(key interface{}) (string, error) { + var sig, sstr string + var err error + if sstr, err = t.SigningString(); err != nil { + return "", err + } + if sig, err = t.Method.Sign(sstr, key); err != nil { + return "", err + } + return strings.Join([]string{sstr, sig}, "."), nil +} + +// Generate the signing string. This is the +// most expensive part of the whole deal. Unless you +// need this for something special, just go straight for +// the SignedString. +func (t *Token) SigningString() (string, error) { + var err error + parts := make([]string, 2) + for i, _ := range parts { + var jsonValue []byte + if i == 0 { + if jsonValue, err = json.Marshal(t.Header); err != nil { + return "", err + } + } else { + if jsonValue, err = json.Marshal(t.Claims); err != nil { + return "", err + } + } + + parts[i] = EncodeSegment(jsonValue) + } + return strings.Join(parts, "."), nil +} + +// Parse, validate, and return a token. +// keyFunc will receive the parsed token and should return the key for validating. +// If everything is kosher, err will be nil +func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { + return new(Parser).Parse(tokenString, keyFunc) +} + +func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { + return new(Parser).ParseWithClaims(tokenString, claims, keyFunc) +} + +// Encode JWT specific base64url encoding with padding stripped +func EncodeSegment(seg []byte) string { + return strings.TrimRight(base64.URLEncoding.EncodeToString(seg), "=") +} + +// Decode JWT specific base64url encoding with padding stripped +func DecodeSegment(seg string) ([]byte, error) { + if l := len(seg) % 4; l > 0 { + seg += strings.Repeat("=", 4-l) + } + + return base64.URLEncoding.DecodeString(seg) +} diff --git a/vendor/github.com/docker/distribution/LICENSE b/vendor/github.com/docker/distribution/LICENSE new file mode 100644 index 00000000..e06d2081 --- /dev/null +++ b/vendor/github.com/docker/distribution/LICENSE @@ -0,0 +1,202 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/vendor/github.com/docker/distribution/digestset/set.go b/vendor/github.com/docker/distribution/digestset/set.go new file mode 100644 index 00000000..71327dca --- /dev/null +++ b/vendor/github.com/docker/distribution/digestset/set.go @@ -0,0 +1,247 @@ +package digestset + +import ( + "errors" + "sort" + "strings" + "sync" + + digest "github.com/opencontainers/go-digest" +) + +var ( + // ErrDigestNotFound is used when a matching digest + // could not be found in a set. + ErrDigestNotFound = errors.New("digest not found") + + // ErrDigestAmbiguous is used when multiple digests + // are found in a set. None of the matching digests + // should be considered valid matches. + ErrDigestAmbiguous = errors.New("ambiguous digest string") +) + +// Set is used to hold a unique set of digests which +// may be easily referenced by easily referenced by a string +// representation of the digest as well as short representation. +// The uniqueness of the short representation is based on other +// digests in the set. If digests are omitted from this set, +// collisions in a larger set may not be detected, therefore it +// is important to always do short representation lookups on +// the complete set of digests. To mitigate collisions, an +// appropriately long short code should be used. +type Set struct { + mutex sync.RWMutex + entries digestEntries +} + +// NewSet creates an empty set of digests +// which may have digests added. +func NewSet() *Set { + return &Set{ + entries: digestEntries{}, + } +} + +// checkShortMatch checks whether two digests match as either whole +// values or short values. This function does not test equality, +// rather whether the second value could match against the first +// value. +func checkShortMatch(alg digest.Algorithm, hex, shortAlg, shortHex string) bool { + if len(hex) == len(shortHex) { + if hex != shortHex { + return false + } + if len(shortAlg) > 0 && string(alg) != shortAlg { + return false + } + } else if !strings.HasPrefix(hex, shortHex) { + return false + } else if len(shortAlg) > 0 && string(alg) != shortAlg { + return false + } + return true +} + +// Lookup looks for a digest matching the given string representation. +// If no digests could be found ErrDigestNotFound will be returned +// with an empty digest value. If multiple matches are found +// ErrDigestAmbiguous will be returned with an empty digest value. +func (dst *Set) Lookup(d string) (digest.Digest, error) { + dst.mutex.RLock() + defer dst.mutex.RUnlock() + if len(dst.entries) == 0 { + return "", ErrDigestNotFound + } + var ( + searchFunc func(int) bool + alg digest.Algorithm + hex string + ) + dgst, err := digest.Parse(d) + if err == digest.ErrDigestInvalidFormat { + hex = d + searchFunc = func(i int) bool { + return dst.entries[i].val >= d + } + } else { + hex = dgst.Hex() + alg = dgst.Algorithm() + searchFunc = func(i int) bool { + if dst.entries[i].val == hex { + return dst.entries[i].alg >= alg + } + return dst.entries[i].val >= hex + } + } + idx := sort.Search(len(dst.entries), searchFunc) + if idx == len(dst.entries) || !checkShortMatch(dst.entries[idx].alg, dst.entries[idx].val, string(alg), hex) { + return "", ErrDigestNotFound + } + if dst.entries[idx].alg == alg && dst.entries[idx].val == hex { + return dst.entries[idx].digest, nil + } + if idx+1 < len(dst.entries) && checkShortMatch(dst.entries[idx+1].alg, dst.entries[idx+1].val, string(alg), hex) { + return "", ErrDigestAmbiguous + } + + return dst.entries[idx].digest, nil +} + +// Add adds the given digest to the set. An error will be returned +// if the given digest is invalid. If the digest already exists in the +// set, this operation will be a no-op. +func (dst *Set) Add(d digest.Digest) error { + if err := d.Validate(); err != nil { + return err + } + dst.mutex.Lock() + defer dst.mutex.Unlock() + entry := &digestEntry{alg: d.Algorithm(), val: d.Hex(), digest: d} + searchFunc := func(i int) bool { + if dst.entries[i].val == entry.val { + return dst.entries[i].alg >= entry.alg + } + return dst.entries[i].val >= entry.val + } + idx := sort.Search(len(dst.entries), searchFunc) + if idx == len(dst.entries) { + dst.entries = append(dst.entries, entry) + return nil + } else if dst.entries[idx].digest == d { + return nil + } + + entries := append(dst.entries, nil) + copy(entries[idx+1:], entries[idx:len(entries)-1]) + entries[idx] = entry + dst.entries = entries + return nil +} + +// Remove removes the given digest from the set. An err will be +// returned if the given digest is invalid. If the digest does +// not exist in the set, this operation will be a no-op. +func (dst *Set) Remove(d digest.Digest) error { + if err := d.Validate(); err != nil { + return err + } + dst.mutex.Lock() + defer dst.mutex.Unlock() + entry := &digestEntry{alg: d.Algorithm(), val: d.Hex(), digest: d} + searchFunc := func(i int) bool { + if dst.entries[i].val == entry.val { + return dst.entries[i].alg >= entry.alg + } + return dst.entries[i].val >= entry.val + } + idx := sort.Search(len(dst.entries), searchFunc) + // Not found if idx is after or value at idx is not digest + if idx == len(dst.entries) || dst.entries[idx].digest != d { + return nil + } + + entries := dst.entries + copy(entries[idx:], entries[idx+1:]) + entries = entries[:len(entries)-1] + dst.entries = entries + + return nil +} + +// All returns all the digests in the set +func (dst *Set) All() []digest.Digest { + dst.mutex.RLock() + defer dst.mutex.RUnlock() + retValues := make([]digest.Digest, len(dst.entries)) + for i := range dst.entries { + retValues[i] = dst.entries[i].digest + } + + return retValues +} + +// ShortCodeTable returns a map of Digest to unique short codes. The +// length represents the minimum value, the maximum length may be the +// entire value of digest if uniqueness cannot be achieved without the +// full value. This function will attempt to make short codes as short +// as possible to be unique. +func ShortCodeTable(dst *Set, length int) map[digest.Digest]string { + dst.mutex.RLock() + defer dst.mutex.RUnlock() + m := make(map[digest.Digest]string, len(dst.entries)) + l := length + resetIdx := 0 + for i := 0; i < len(dst.entries); i++ { + var short string + extended := true + for extended { + extended = false + if len(dst.entries[i].val) <= l { + short = dst.entries[i].digest.String() + } else { + short = dst.entries[i].val[:l] + for j := i + 1; j < len(dst.entries); j++ { + if checkShortMatch(dst.entries[j].alg, dst.entries[j].val, "", short) { + if j > resetIdx { + resetIdx = j + } + extended = true + } else { + break + } + } + if extended { + l++ + } + } + } + m[dst.entries[i].digest] = short + if i >= resetIdx { + l = length + } + } + return m +} + +type digestEntry struct { + alg digest.Algorithm + val string + digest digest.Digest +} + +type digestEntries []*digestEntry + +func (d digestEntries) Len() int { + return len(d) +} + +func (d digestEntries) Less(i, j int) bool { + if d[i].val != d[j].val { + return d[i].val < d[j].val + } + return d[i].alg < d[j].alg +} + +func (d digestEntries) Swap(i, j int) { + d[i], d[j] = d[j], d[i] +} diff --git a/vendor/github.com/docker/distribution/reference/helpers.go b/vendor/github.com/docker/distribution/reference/helpers.go new file mode 100644 index 00000000..978df7ea --- /dev/null +++ b/vendor/github.com/docker/distribution/reference/helpers.go @@ -0,0 +1,42 @@ +package reference + +import "path" + +// IsNameOnly returns true if reference only contains a repo name. +func IsNameOnly(ref Named) bool { + if _, ok := ref.(NamedTagged); ok { + return false + } + if _, ok := ref.(Canonical); ok { + return false + } + return true +} + +// FamiliarName returns the familiar name string +// for the given named, familiarizing if needed. +func FamiliarName(ref Named) string { + if nn, ok := ref.(normalizedNamed); ok { + return nn.Familiar().Name() + } + return ref.Name() +} + +// FamiliarString returns the familiar string representation +// for the given reference, familiarizing if needed. +func FamiliarString(ref Reference) string { + if nn, ok := ref.(normalizedNamed); ok { + return nn.Familiar().String() + } + return ref.String() +} + +// FamiliarMatch reports whether ref matches the specified pattern. +// See https://godoc.org/path#Match for supported patterns. +func FamiliarMatch(pattern string, ref Reference) (bool, error) { + matched, err := path.Match(pattern, FamiliarString(ref)) + if namedRef, isNamed := ref.(Named); isNamed && !matched { + matched, _ = path.Match(pattern, FamiliarName(namedRef)) + } + return matched, err +} diff --git a/vendor/github.com/docker/distribution/reference/normalize.go b/vendor/github.com/docker/distribution/reference/normalize.go new file mode 100644 index 00000000..2d71fc5e --- /dev/null +++ b/vendor/github.com/docker/distribution/reference/normalize.go @@ -0,0 +1,170 @@ +package reference + +import ( + "errors" + "fmt" + "strings" + + "github.com/docker/distribution/digestset" + "github.com/opencontainers/go-digest" +) + +var ( + legacyDefaultDomain = "index.docker.io" + defaultDomain = "docker.io" + officialRepoName = "library" + defaultTag = "latest" +) + +// normalizedNamed represents a name which has been +// normalized and has a familiar form. A familiar name +// is what is used in Docker UI. An example normalized +// name is "docker.io/library/ubuntu" and corresponding +// familiar name of "ubuntu". +type normalizedNamed interface { + Named + Familiar() Named +} + +// ParseNormalizedNamed parses a string into a named reference +// transforming a familiar name from Docker UI to a fully +// qualified reference. If the value may be an identifier +// use ParseAnyReference. +func ParseNormalizedNamed(s string) (Named, error) { + if ok := anchoredIdentifierRegexp.MatchString(s); ok { + return nil, fmt.Errorf("invalid repository name (%s), cannot specify 64-byte hexadecimal strings", s) + } + domain, remainder := splitDockerDomain(s) + var remoteName string + if tagSep := strings.IndexRune(remainder, ':'); tagSep > -1 { + remoteName = remainder[:tagSep] + } else { + remoteName = remainder + } + if strings.ToLower(remoteName) != remoteName { + return nil, errors.New("invalid reference format: repository name must be lowercase") + } + + ref, err := Parse(domain + "/" + remainder) + if err != nil { + return nil, err + } + named, isNamed := ref.(Named) + if !isNamed { + return nil, fmt.Errorf("reference %s has no name", ref.String()) + } + return named, nil +} + +// splitDockerDomain splits a repository name to domain and remotename string. +// If no valid domain is found, the default domain is used. Repository name +// needs to be already validated before. +func splitDockerDomain(name string) (domain, remainder string) { + i := strings.IndexRune(name, '/') + if i == -1 || (!strings.ContainsAny(name[:i], ".:") && name[:i] != "localhost") { + domain, remainder = defaultDomain, name + } else { + domain, remainder = name[:i], name[i+1:] + } + if domain == legacyDefaultDomain { + domain = defaultDomain + } + if domain == defaultDomain && !strings.ContainsRune(remainder, '/') { + remainder = officialRepoName + "/" + remainder + } + return +} + +// familiarizeName returns a shortened version of the name familiar +// to to the Docker UI. Familiar names have the default domain +// "docker.io" and "library/" repository prefix removed. +// For example, "docker.io/library/redis" will have the familiar +// name "redis" and "docker.io/dmcgowan/myapp" will be "dmcgowan/myapp". +// Returns a familiarized named only reference. +func familiarizeName(named namedRepository) repository { + repo := repository{ + domain: named.Domain(), + path: named.Path(), + } + + if repo.domain == defaultDomain { + repo.domain = "" + // Handle official repositories which have the pattern "library/" + if split := strings.Split(repo.path, "/"); len(split) == 2 && split[0] == officialRepoName { + repo.path = split[1] + } + } + return repo +} + +func (r reference) Familiar() Named { + return reference{ + namedRepository: familiarizeName(r.namedRepository), + tag: r.tag, + digest: r.digest, + } +} + +func (r repository) Familiar() Named { + return familiarizeName(r) +} + +func (t taggedReference) Familiar() Named { + return taggedReference{ + namedRepository: familiarizeName(t.namedRepository), + tag: t.tag, + } +} + +func (c canonicalReference) Familiar() Named { + return canonicalReference{ + namedRepository: familiarizeName(c.namedRepository), + digest: c.digest, + } +} + +// TagNameOnly adds the default tag "latest" to a reference if it only has +// a repo name. +func TagNameOnly(ref Named) Named { + if IsNameOnly(ref) { + namedTagged, err := WithTag(ref, defaultTag) + if err != nil { + // Default tag must be valid, to create a NamedTagged + // type with non-validated input the WithTag function + // should be used instead + panic(err) + } + return namedTagged + } + return ref +} + +// ParseAnyReference parses a reference string as a possible identifier, +// full digest, or familiar name. +func ParseAnyReference(ref string) (Reference, error) { + if ok := anchoredIdentifierRegexp.MatchString(ref); ok { + return digestReference("sha256:" + ref), nil + } + if dgst, err := digest.Parse(ref); err == nil { + return digestReference(dgst), nil + } + + return ParseNormalizedNamed(ref) +} + +// ParseAnyReferenceWithSet parses a reference string as a possible short +// identifier to be matched in a digest set, a full digest, or familiar name. +func ParseAnyReferenceWithSet(ref string, ds *digestset.Set) (Reference, error) { + if ok := anchoredShortIdentifierRegexp.MatchString(ref); ok { + dgst, err := ds.Lookup(ref) + if err == nil { + return digestReference(dgst), nil + } + } else { + if dgst, err := digest.Parse(ref); err == nil { + return digestReference(dgst), nil + } + } + + return ParseNormalizedNamed(ref) +} diff --git a/vendor/github.com/docker/distribution/reference/reference.go b/vendor/github.com/docker/distribution/reference/reference.go new file mode 100644 index 00000000..2f66cca8 --- /dev/null +++ b/vendor/github.com/docker/distribution/reference/reference.go @@ -0,0 +1,433 @@ +// Package reference provides a general type to represent any way of referencing images within the registry. +// Its main purpose is to abstract tags and digests (content-addressable hash). +// +// Grammar +// +// reference := name [ ":" tag ] [ "@" digest ] +// name := [domain '/'] path-component ['/' path-component]* +// domain := domain-component ['.' domain-component]* [':' port-number] +// domain-component := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/ +// port-number := /[0-9]+/ +// path-component := alpha-numeric [separator alpha-numeric]* +// alpha-numeric := /[a-z0-9]+/ +// separator := /[_.]|__|[-]*/ +// +// tag := /[\w][\w.-]{0,127}/ +// +// digest := digest-algorithm ":" digest-hex +// digest-algorithm := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ]* +// digest-algorithm-separator := /[+.-_]/ +// digest-algorithm-component := /[A-Za-z][A-Za-z0-9]*/ +// digest-hex := /[0-9a-fA-F]{32,}/ ; At least 128 bit digest value +// +// identifier := /[a-f0-9]{64}/ +// short-identifier := /[a-f0-9]{6,64}/ +package reference + +import ( + "errors" + "fmt" + "strings" + + "github.com/opencontainers/go-digest" +) + +const ( + // NameTotalLengthMax is the maximum total number of characters in a repository name. + NameTotalLengthMax = 255 +) + +var ( + // ErrReferenceInvalidFormat represents an error while trying to parse a string as a reference. + ErrReferenceInvalidFormat = errors.New("invalid reference format") + + // ErrTagInvalidFormat represents an error while trying to parse a string as a tag. + ErrTagInvalidFormat = errors.New("invalid tag format") + + // ErrDigestInvalidFormat represents an error while trying to parse a string as a tag. + ErrDigestInvalidFormat = errors.New("invalid digest format") + + // ErrNameContainsUppercase is returned for invalid repository names that contain uppercase characters. + ErrNameContainsUppercase = errors.New("repository name must be lowercase") + + // ErrNameEmpty is returned for empty, invalid repository names. + ErrNameEmpty = errors.New("repository name must have at least one component") + + // ErrNameTooLong is returned when a repository name is longer than NameTotalLengthMax. + ErrNameTooLong = fmt.Errorf("repository name must not be more than %v characters", NameTotalLengthMax) + + // ErrNameNotCanonical is returned when a name is not canonical. + ErrNameNotCanonical = errors.New("repository name must be canonical") +) + +// Reference is an opaque object reference identifier that may include +// modifiers such as a hostname, name, tag, and digest. +type Reference interface { + // String returns the full reference + String() string +} + +// Field provides a wrapper type for resolving correct reference types when +// working with encoding. +type Field struct { + reference Reference +} + +// AsField wraps a reference in a Field for encoding. +func AsField(reference Reference) Field { + return Field{reference} +} + +// Reference unwraps the reference type from the field to +// return the Reference object. This object should be +// of the appropriate type to further check for different +// reference types. +func (f Field) Reference() Reference { + return f.reference +} + +// MarshalText serializes the field to byte text which +// is the string of the reference. +func (f Field) MarshalText() (p []byte, err error) { + return []byte(f.reference.String()), nil +} + +// UnmarshalText parses text bytes by invoking the +// reference parser to ensure the appropriately +// typed reference object is wrapped by field. +func (f *Field) UnmarshalText(p []byte) error { + r, err := Parse(string(p)) + if err != nil { + return err + } + + f.reference = r + return nil +} + +// Named is an object with a full name +type Named interface { + Reference + Name() string +} + +// Tagged is an object which has a tag +type Tagged interface { + Reference + Tag() string +} + +// NamedTagged is an object including a name and tag. +type NamedTagged interface { + Named + Tag() string +} + +// Digested is an object which has a digest +// in which it can be referenced by +type Digested interface { + Reference + Digest() digest.Digest +} + +// Canonical reference is an object with a fully unique +// name including a name with domain and digest +type Canonical interface { + Named + Digest() digest.Digest +} + +// namedRepository is a reference to a repository with a name. +// A namedRepository has both domain and path components. +type namedRepository interface { + Named + Domain() string + Path() string +} + +// Domain returns the domain part of the Named reference +func Domain(named Named) string { + if r, ok := named.(namedRepository); ok { + return r.Domain() + } + domain, _ := splitDomain(named.Name()) + return domain +} + +// Path returns the name without the domain part of the Named reference +func Path(named Named) (name string) { + if r, ok := named.(namedRepository); ok { + return r.Path() + } + _, path := splitDomain(named.Name()) + return path +} + +func splitDomain(name string) (string, string) { + match := anchoredNameRegexp.FindStringSubmatch(name) + if len(match) != 3 { + return "", name + } + return match[1], match[2] +} + +// SplitHostname splits a named reference into a +// hostname and name string. If no valid hostname is +// found, the hostname is empty and the full value +// is returned as name +// DEPRECATED: Use Domain or Path +func SplitHostname(named Named) (string, string) { + if r, ok := named.(namedRepository); ok { + return r.Domain(), r.Path() + } + return splitDomain(named.Name()) +} + +// Parse parses s and returns a syntactically valid Reference. +// If an error was encountered it is returned, along with a nil Reference. +// NOTE: Parse will not handle short digests. +func Parse(s string) (Reference, error) { + matches := ReferenceRegexp.FindStringSubmatch(s) + if matches == nil { + if s == "" { + return nil, ErrNameEmpty + } + if ReferenceRegexp.FindStringSubmatch(strings.ToLower(s)) != nil { + return nil, ErrNameContainsUppercase + } + return nil, ErrReferenceInvalidFormat + } + + if len(matches[1]) > NameTotalLengthMax { + return nil, ErrNameTooLong + } + + var repo repository + + nameMatch := anchoredNameRegexp.FindStringSubmatch(matches[1]) + if nameMatch != nil && len(nameMatch) == 3 { + repo.domain = nameMatch[1] + repo.path = nameMatch[2] + } else { + repo.domain = "" + repo.path = matches[1] + } + + ref := reference{ + namedRepository: repo, + tag: matches[2], + } + if matches[3] != "" { + var err error + ref.digest, err = digest.Parse(matches[3]) + if err != nil { + return nil, err + } + } + + r := getBestReferenceType(ref) + if r == nil { + return nil, ErrNameEmpty + } + + return r, nil +} + +// ParseNamed parses s and returns a syntactically valid reference implementing +// the Named interface. The reference must have a name and be in the canonical +// form, otherwise an error is returned. +// If an error was encountered it is returned, along with a nil Reference. +// NOTE: ParseNamed will not handle short digests. +func ParseNamed(s string) (Named, error) { + named, err := ParseNormalizedNamed(s) + if err != nil { + return nil, err + } + if named.String() != s { + return nil, ErrNameNotCanonical + } + return named, nil +} + +// WithName returns a named object representing the given string. If the input +// is invalid ErrReferenceInvalidFormat will be returned. +func WithName(name string) (Named, error) { + if len(name) > NameTotalLengthMax { + return nil, ErrNameTooLong + } + + match := anchoredNameRegexp.FindStringSubmatch(name) + if match == nil || len(match) != 3 { + return nil, ErrReferenceInvalidFormat + } + return repository{ + domain: match[1], + path: match[2], + }, nil +} + +// WithTag combines the name from "name" and the tag from "tag" to form a +// reference incorporating both the name and the tag. +func WithTag(name Named, tag string) (NamedTagged, error) { + if !anchoredTagRegexp.MatchString(tag) { + return nil, ErrTagInvalidFormat + } + var repo repository + if r, ok := name.(namedRepository); ok { + repo.domain = r.Domain() + repo.path = r.Path() + } else { + repo.path = name.Name() + } + if canonical, ok := name.(Canonical); ok { + return reference{ + namedRepository: repo, + tag: tag, + digest: canonical.Digest(), + }, nil + } + return taggedReference{ + namedRepository: repo, + tag: tag, + }, nil +} + +// WithDigest combines the name from "name" and the digest from "digest" to form +// a reference incorporating both the name and the digest. +func WithDigest(name Named, digest digest.Digest) (Canonical, error) { + if !anchoredDigestRegexp.MatchString(digest.String()) { + return nil, ErrDigestInvalidFormat + } + var repo repository + if r, ok := name.(namedRepository); ok { + repo.domain = r.Domain() + repo.path = r.Path() + } else { + repo.path = name.Name() + } + if tagged, ok := name.(Tagged); ok { + return reference{ + namedRepository: repo, + tag: tagged.Tag(), + digest: digest, + }, nil + } + return canonicalReference{ + namedRepository: repo, + digest: digest, + }, nil +} + +// TrimNamed removes any tag or digest from the named reference. +func TrimNamed(ref Named) Named { + domain, path := SplitHostname(ref) + return repository{ + domain: domain, + path: path, + } +} + +func getBestReferenceType(ref reference) Reference { + if ref.Name() == "" { + // Allow digest only references + if ref.digest != "" { + return digestReference(ref.digest) + } + return nil + } + if ref.tag == "" { + if ref.digest != "" { + return canonicalReference{ + namedRepository: ref.namedRepository, + digest: ref.digest, + } + } + return ref.namedRepository + } + if ref.digest == "" { + return taggedReference{ + namedRepository: ref.namedRepository, + tag: ref.tag, + } + } + + return ref +} + +type reference struct { + namedRepository + tag string + digest digest.Digest +} + +func (r reference) String() string { + return r.Name() + ":" + r.tag + "@" + r.digest.String() +} + +func (r reference) Tag() string { + return r.tag +} + +func (r reference) Digest() digest.Digest { + return r.digest +} + +type repository struct { + domain string + path string +} + +func (r repository) String() string { + return r.Name() +} + +func (r repository) Name() string { + if r.domain == "" { + return r.path + } + return r.domain + "/" + r.path +} + +func (r repository) Domain() string { + return r.domain +} + +func (r repository) Path() string { + return r.path +} + +type digestReference digest.Digest + +func (d digestReference) String() string { + return digest.Digest(d).String() +} + +func (d digestReference) Digest() digest.Digest { + return digest.Digest(d) +} + +type taggedReference struct { + namedRepository + tag string +} + +func (t taggedReference) String() string { + return t.Name() + ":" + t.tag +} + +func (t taggedReference) Tag() string { + return t.tag +} + +type canonicalReference struct { + namedRepository + digest digest.Digest +} + +func (c canonicalReference) String() string { + return c.Name() + "@" + c.digest.String() +} + +func (c canonicalReference) Digest() digest.Digest { + return c.digest +} diff --git a/vendor/github.com/docker/distribution/reference/regexp.go b/vendor/github.com/docker/distribution/reference/regexp.go new file mode 100644 index 00000000..78603493 --- /dev/null +++ b/vendor/github.com/docker/distribution/reference/regexp.go @@ -0,0 +1,143 @@ +package reference + +import "regexp" + +var ( + // alphaNumericRegexp defines the alpha numeric atom, typically a + // component of names. This only allows lower case characters and digits. + alphaNumericRegexp = match(`[a-z0-9]+`) + + // separatorRegexp defines the separators allowed to be embedded in name + // components. This allow one period, one or two underscore and multiple + // dashes. + separatorRegexp = match(`(?:[._]|__|[-]*)`) + + // nameComponentRegexp restricts registry path component names to start + // with at least one letter or number, with following parts able to be + // separated by one period, one or two underscore and multiple dashes. + nameComponentRegexp = expression( + alphaNumericRegexp, + optional(repeated(separatorRegexp, alphaNumericRegexp))) + + // domainComponentRegexp restricts the registry domain component of a + // repository name to start with a component as defined by DomainRegexp + // and followed by an optional port. + domainComponentRegexp = match(`(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])`) + + // DomainRegexp defines the structure of potential domain components + // that may be part of image names. This is purposely a subset of what is + // allowed by DNS to ensure backwards compatibility with Docker image + // names. + DomainRegexp = expression( + domainComponentRegexp, + optional(repeated(literal(`.`), domainComponentRegexp)), + optional(literal(`:`), match(`[0-9]+`))) + + // TagRegexp matches valid tag names. From docker/docker:graph/tags.go. + TagRegexp = match(`[\w][\w.-]{0,127}`) + + // anchoredTagRegexp matches valid tag names, anchored at the start and + // end of the matched string. + anchoredTagRegexp = anchored(TagRegexp) + + // DigestRegexp matches valid digests. + DigestRegexp = match(`[A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}`) + + // anchoredDigestRegexp matches valid digests, anchored at the start and + // end of the matched string. + anchoredDigestRegexp = anchored(DigestRegexp) + + // NameRegexp is the format for the name component of references. The + // regexp has capturing groups for the domain and name part omitting + // the separating forward slash from either. + NameRegexp = expression( + optional(DomainRegexp, literal(`/`)), + nameComponentRegexp, + optional(repeated(literal(`/`), nameComponentRegexp))) + + // anchoredNameRegexp is used to parse a name value, capturing the + // domain and trailing components. + anchoredNameRegexp = anchored( + optional(capture(DomainRegexp), literal(`/`)), + capture(nameComponentRegexp, + optional(repeated(literal(`/`), nameComponentRegexp)))) + + // ReferenceRegexp is the full supported format of a reference. The regexp + // is anchored and has capturing groups for name, tag, and digest + // components. + ReferenceRegexp = anchored(capture(NameRegexp), + optional(literal(":"), capture(TagRegexp)), + optional(literal("@"), capture(DigestRegexp))) + + // IdentifierRegexp is the format for string identifier used as a + // content addressable identifier using sha256. These identifiers + // are like digests without the algorithm, since sha256 is used. + IdentifierRegexp = match(`([a-f0-9]{64})`) + + // ShortIdentifierRegexp is the format used to represent a prefix + // of an identifier. A prefix may be used to match a sha256 identifier + // within a list of trusted identifiers. + ShortIdentifierRegexp = match(`([a-f0-9]{6,64})`) + + // anchoredIdentifierRegexp is used to check or match an + // identifier value, anchored at start and end of string. + anchoredIdentifierRegexp = anchored(IdentifierRegexp) + + // anchoredShortIdentifierRegexp is used to check if a value + // is a possible identifier prefix, anchored at start and end + // of string. + anchoredShortIdentifierRegexp = anchored(ShortIdentifierRegexp) +) + +// match compiles the string to a regular expression. +var match = regexp.MustCompile + +// literal compiles s into a literal regular expression, escaping any regexp +// reserved characters. +func literal(s string) *regexp.Regexp { + re := match(regexp.QuoteMeta(s)) + + if _, complete := re.LiteralPrefix(); !complete { + panic("must be a literal") + } + + return re +} + +// expression defines a full expression, where each regular expression must +// follow the previous. +func expression(res ...*regexp.Regexp) *regexp.Regexp { + var s string + for _, re := range res { + s += re.String() + } + + return match(s) +} + +// optional wraps the expression in a non-capturing group and makes the +// production optional. +func optional(res ...*regexp.Regexp) *regexp.Regexp { + return match(group(expression(res...)).String() + `?`) +} + +// repeated wraps the regexp in a non-capturing group to get one or more +// matches. +func repeated(res ...*regexp.Regexp) *regexp.Regexp { + return match(group(expression(res...)).String() + `+`) +} + +// group wraps the regexp in a non-capturing group. +func group(res ...*regexp.Regexp) *regexp.Regexp { + return match(`(?:` + expression(res...).String() + `)`) +} + +// capture wraps the expression in a capturing group. +func capture(res ...*regexp.Regexp) *regexp.Regexp { + return match(`(` + expression(res...).String() + `)`) +} + +// anchored anchors the regular expression by adding start and end delimiters. +func anchored(res ...*regexp.Regexp) *regexp.Regexp { + return match(`^` + expression(res...).String() + `$`) +} diff --git a/vendor/github.com/docker/docker/AUTHORS b/vendor/github.com/docker/docker/AUTHORS new file mode 100644 index 00000000..246e2a33 --- /dev/null +++ b/vendor/github.com/docker/docker/AUTHORS @@ -0,0 +1,1652 @@ +# This file lists all individuals having contributed content to the repository. +# For how it is generated, see `hack/generate-authors.sh`. + +Aanand Prasad +Aaron Davidson +Aaron Feng +Aaron Huslage +Aaron Lehmann +Aaron Welch +Abel Muiño +Abhijeet Kasurde +Abhinav Ajgaonkar +Abhishek Chanda +Abin Shahab +Adam Avilla +Adam Kunk +Adam Miller +Adam Mills +Adam Singer +Adam Walz +Aditi Rajagopal +Aditya +Adolfo Ochagavía +Adria Casas +Adrian Moisey +Adrian Mouat +Adrian Oprea +Adrien Folie +Adrien Gallouët +Ahmed Kamal +Ahmet Alp Balkan +Aidan Feldman +Aidan Hobson Sayers +AJ Bowen +Ajey Charantimath +ajneu +Akihiro Suda +Al Tobey +alambike +Alan Scherger +Alan Thompson +Albert Callarisa +Albert Zhang +Aleksa Sarai +Aleksandrs Fadins +Alena Prokharchyk +Alessandro Boch +Alessio Biancalana +Alex Chan +Alex Coventry +Alex Crawford +Alex Ellis +Alex Gaynor +Alex Olshansky +Alex Samorukov +Alex Warhawk +Alexander Artemenko +Alexander Boyd +Alexander Larsson +Alexander Morozov +Alexander Shopov +Alexandre Beslic +Alexandre González +Alexandru Sfirlogea +Alexey Guskov +Alexey Kotlyarov +Alexey Shamrin +Alexis THOMAS +Ali Dehghani +Allen Madsen +Allen Sun +almoehi +Alvaro Saurin +Alvin Richards +amangoel +Amen Belayneh +Amit Bakshi +Amit Krishnan +Amit Shukla +Amy Lindburg +Anand Patil +AnandkumarPatel +Anatoly Borodin +Anchal Agrawal +Anders Janmyr +Andre Dublin <81dublin@gmail.com> +Andre Granovsky +Andrea Luzzardi +Andrea Turli +Andreas Köhler +Andreas Savvides +Andreas Tiefenthaler +Andrei Gherzan +Andrew C. Bodine +Andrew Clay Shafer +Andrew Duckworth +Andrew France +Andrew Gerrand +Andrew Guenther +Andrew Kuklewicz +Andrew Macgregor +Andrew Macpherson +Andrew Martin +Andrew Munsell +Andrew Po +Andrew Weiss +Andrew Williams +Andrews Medina +Andrey Petrov +Andrey Stolbovsky +André Martins +andy +Andy Chambers +andy diller +Andy Goldstein +Andy Kipp +Andy Rothfusz +Andy Smith +Andy Wilson +Anes Hasicic +Anil Belur +Anil Madhavapeddy +Ankush Agarwal +Anonmily +Anthon van der Neut +Anthony Baire +Anthony Bishopric +Anthony Dahanne +Anton Löfgren +Anton Nikitin +Anton Polonskiy +Anton Tiurin +Antonio Murdaca +Antonis Kalipetis +Antony Messerli +Anuj Bahuguna +Anusha Ragunathan +apocas +ArikaChen +Arnaud Lefebvre +Arnaud Porterie +Arthur Barr +Arthur Gautier +Artur Meyster +Arun Gupta +Asbjørn Enge +averagehuman +Avi Das +Avi Miller +Avi Vaid +ayoshitake +Azat Khuyiyakhmetov +Bardia Keyoumarsi +Barnaby Gray +Barry Allard +Bartłomiej Piotrowski +Bastiaan Bakker +bdevloed +Ben Firshman +Ben Golub +Ben Hall +Ben Sargent +Ben Severson +Ben Toews +Ben Wiklund +Benjamin Atkin +Benoit Chesneau +Bernerd Schaefer +Bert Goethals +Bharath Thiruveedula +Bhiraj Butala +Bilal Amarni +Bill W +bin liu +Blake Geno +Boaz Shuster +bobby abbott +boucher +Bouke Haarsma +Boyd Hemphill +boynux +Bradley Cicenas +Bradley Wright +Brandon Liu +Brandon Philips +Brandon Rhodes +Brendan Dixon +Brent Salisbury +Brett Higgins +Brett Kochendorfer +Brian (bex) Exelbierd +Brian Bland +Brian DeHamer +Brian Dorsey +Brian Flad +Brian Goff +Brian McCallister +Brian Olsen +Brian Shumate +Brian Torres-Gil +Brian Trump +Brice Jaglin +Briehan Lombaard +Bruno Bigras +Bruno Binet +Bruno Gazzera +Bruno Renié +Bryan Bess +Bryan Boreham +Bryan Matsuo +Bryan Murphy +buddhamagnet +Burke Libbey +Byung Kang +Caleb Spare +Calen Pennington +Cameron Boehmer +Cameron Spear +Campbell Allen +Candid Dauth +Cao Weiwei +Carl Henrik Lunde +Carl Loa Odin +Carl X. Su +Carlos Alexandro Becker +Carlos Sanchez +Carol Fager-Higgins +Cary +Casey Bisson +Cedric Davies +Cezar Sa Espinola +Chad Swenson +Chance Zibolski +Chander G +Charles Chan +Charles Hooper +Charles Law +Charles Lindsay +Charles Merriam +Charles Sarrazin +Charles Smith +Charlie Lewis +Chase Bolt +ChaYoung You +Chen Chao +Chen Hanxiao +cheney90 +Chewey +Chia-liang Kao +chli +Cholerae Hu +Chris Alfonso +Chris Armstrong +Chris Dituri +Chris Fordham +Chris Khoo +Chris McKinnel +Chris Seto +Chris Snow +Chris St. Pierre +Chris Stivers +Chris Swan +Chris Wahl +Chris Weyl +chrismckinnel +Christian Berendt +Christian Böhme +Christian Persson +Christian Rotzoll +Christian Simon +Christian Stefanescu +ChristoperBiscardi +Christophe Mehay +Christophe Troestler +Christopher Currie +Christopher Jones +Christopher Latham +Christopher Rigor +Christy Perez +Chun Chen +Ciro S. Costa +Clayton Coleman +Clinton Kitson +Coenraad Loubser +Colin Dunklau +Colin Rice +Colin Walters +Collin Guarino +Colm Hally +companycy +Cory Forsyth +cressie176 +CrimsonGlory +Cristian Staretu +cristiano balducci +Cruceru Calin-Cristian +Cyril F +Daan van Berkel +Daehyeok Mun +Dafydd Crosby +dalanlan +Damian Smyth +Damien Nadé +Damien Nozay +Damjan Georgievski +Dan Anolik +Dan Buch +Dan Cotora +Dan Feldman +Dan Griffin +Dan Hirsch +Dan Keder +Dan Levy +Dan McPherson +Dan Stine +Dan Walsh +Dan Williams +Daniel Antlinger +Daniel Exner +Daniel Farrell +Daniel Garcia +Daniel Gasienica +Daniel Hiltgen +Daniel Menet +Daniel Mizyrycki +Daniel Nephin +Daniel Norberg +Daniel Nordberg +Daniel Robinson +Daniel S +Daniel Von Fange +Daniel X Moore +Daniel YC Lin +Daniel Zhang +Daniel, Dao Quang Minh +Danny Berger +Danny Yates +Darren Coxall +Darren Shepherd +Darren Stahl +Davanum Srinivas +Dave Barboza +Dave Henderson +Dave MacDonald +Dave Tucker +David Anderson +David Calavera +David Corking +David Cramer +David Currie +David Davis +David Dooling +David Gageot +David Gebler +David Lawrence +David Lechner +David M. Karr +David Mackey +David Mat +David Mcanulty +David Pelaez +David R. Jenni +David Röthlisberger +David Sheets +David Sissitka +David Trott +David Xia +David Young +Davide Ceretti +Dawn Chen +dbdd +dcylabs +decadent +deed02392 +Deng Guangxing +Deni Bertovic +Denis Gladkikh +Denis Ollier +Dennis Docter +Derek +Derek +Derek Ch +Derek McGowan +Deric Crago +Deshi Xiao +devmeyster +Devvyn Murphy +Dharmit Shah +Dieter Reuter +Dillon Dixon +Dima Stopel +Dimitri John Ledkov +Dimitris Rozakis +Dimitry Andric +Dinesh Subhraveti +Diogo Monica +DiuDiugirl +Djibril Koné +dkumor +Dmitri Logvinenko +Dmitri Shuralyov +Dmitry Demeshchuk +Dmitry Gusev +Dmitry Smirnov +Dmitry V. Krivenok +Dmitry Vorobev +Dolph Mathews +Dominik Finkbeiner +Dominik Honnef +Don Kirkby +Don Kjer +Don Spaulding +Donald Huang +Dong Chen +Donovan Jones +Doron Podoleanu +Doug Davis +Doug MacEachern +Doug Tangren +Dr Nic Williams +dragon788 +Dražen Lučanin +Drew Erny +Dustin Sallings +Ed Costello +Edmund Wagner +Eiichi Tsukata +Eike Herzbach +Eivin Giske Skaaren +Eivind Uggedal +Elan Ruusamäe +Elias Probst +Elijah Zupancic +eluck +Elvir Kuric +Emil Hernvall +Emily Maier +Emily Rose +Emir Ozer +Enguerran +Eohyung Lee +Eric Barch +Eric Hanchrow +Eric Lee +Eric Myhre +Eric Paris +Eric Rafaloff +Eric Rosenberg +Eric Sage +Eric Windisch +Eric Yang +Eric-Olivier Lamey +Erik Bray +Erik Dubbelboer +Erik Hollensbe +Erik Inge Bolsø +Erik Kristensen +Erik Weathers +Erno Hopearuoho +Erwin van der Koogh +Euan +Eugene Yakubovich +eugenkrizo +evalle +Evan Allrich +Evan Carmi +Evan Hazlett +Evan Krall +Evan Phoenix +Evan Wies +Everett Toews +Evgeny Vereshchagin +Ewa Czechowska +Eystein Måløy Stenberg +ezbercih +Fabiano Rosas +Fabio Falci +Fabio Rapposelli +Fabio Rehm +Fabrizio Regini +Fabrizio Soppelsa +Faiz Khan +falmp +Fangyuan Gao <21551127@zju.edu.cn> +Fareed Dudhia +Fathi Boudra +Federico Gimenez +Felix Geisendörfer +Felix Hupfeld +Felix Rabe +Felix Ruess +Felix Schindler +Ferenc Szabo +Fernando +Fero Volar +Ferran Rodenas +Filipe Brandenburger +Filipe Oliveira +fl0yd +Flavio Castelli +FLGMwt +Florian +Florian Klein +Florian Maier +Florian Weingarten +Florin Asavoaie +fonglh +fortinux +Francesc Campoy +Francis Chuang +Francisco Carriedo +Francisco Souza +Frank Groeneveld +Frank Herrmann +Frank Macreery +Frank Rosquin +Fred Lifton +Frederick F. Kautz IV +Frederik Loeffert +Frederik Nordahl Jul Sabroe +Freek Kalter +frosforever +fy2462 +Félix Baylac-Jacqué +Félix Cantournet +Gabe Rosenhouse +Gabor Nagy +Gabriel Monroy +GabrielNicolasAvellaneda +Galen Sampson +Gareth Rushgrove +Garrett Barboza +Gaurav +gautam, prasanna +GennadySpb +Geoffrey Bachelet +George MacRorie +George Xie +Georgi Hristozov +Gereon Frey +German DZ +Gert van Valkenhoef +Gianluca Borello +Gildas Cuisinier +gissehel +Giuseppe Mazzotta +Gleb Fotengauer-Malinovskiy +Gleb M Borisov +Glyn Normington +GoBella +Goffert van Gool +Gosuke Miyashita +Gou Rao +Govinda Fichtner +Grant Reaber +Graydon Hoare +Greg Fausak +Greg Thornton +grossws +grunny +gs11 +Guilhem Lettron +Guilherme Salgado +Guillaume Dufour +Guillaume J. Charmes +guoxiuyan +Gurjeet Singh +Guruprasad +gwx296173 +Günter Zöchbauer +Hans Kristian Flaatten +Hans Rødtang +Hao Shu Wei +Hao Zhang <21521210@zju.edu.cn> +Harald Albers +Harley Laue +Harold Cooper +Harry Zhang +He Simei +heartlock <21521209@zju.edu.cn> +Hector Castro +Henning Sprang +Hobofan +Hollie Teal +Hong Xu +hsinko <21551195@zju.edu.cn> +Hu Keping +Hu Tao +Huanzhong Zhang +Huayi Zhang +Hugo Duncan +Hugo Marisco <0x6875676f@gmail.com> +Hunter Blanks +huqun +Huu Nguyen +hyeongkyu.lee +hyp3rdino +Hyzhou <1187766782@qq.com> +Ian Babrou +Ian Bishop +Ian Bull +Ian Calvert +Ian Lee +Ian Main +Ian Truslove +Iavael +Icaro Seara +Igor Dolzhikov +Ilkka Laukkanen +Ilya Dmitrichenko +Ilya Gusev +ILYA Khlopotov +imre Fitos +inglesp +Ingo Gottwald +Isaac Dupree +Isabel Jimenez +Isao Jonas +Ivan Babrou +Ivan Fraixedes +Ivan Grcic +J Bruni +J. Nunn +Jack Danger Canty +Jacob Atzen +Jacob Edelman +Jake Champlin +Jake Moshenko +jakedt +James Allen +James Carey +James Carr +James DeFelice +James Harrison Fisher +James Kyburz +James Kyle +James Lal +James Mills +James Nugent +James Turnbull +Jamie Hannaford +Jamshid Afshar +Jan Keromnes +Jan Koprowski +Jan Pazdziora +Jan Toebes +Jan-Gerd Tenberge +Jan-Jaap Driessen +Jana Radhakrishnan +Jannick Fahlbusch +Januar Wayong +Jared Biel +Jared Hocutt +Jaroslaw Zabiello +jaseg +Jasmine Hegman +Jason Divock +Jason Giedymin +Jason Green +Jason Hall +Jason Heiss +Jason Livesay +Jason McVetta +Jason Plum +Jason Shepherd +Jason Smith +Jason Sommer +Jason Stangroome +jaxgeller +Jay +Jay +Jay Kamat +Jean-Baptiste Barth +Jean-Baptiste Dalido +Jean-Paul Calderone +Jean-Tiare Le Bigot +Jeff Anderson +Jeff Johnston +Jeff Lindsay +Jeff Mickey +Jeff Minard +Jeff Nickoloff +Jeff Silberman +Jeff Welch +Jeffrey Bolle +Jeffrey Morgan +Jeffrey van Gogh +Jenny Gebske +Jeremy Grosser +Jeremy Price +Jeremy Qian +Jeremy Unruh +Jeroen Jacobs +Jesse Dearing +Jesse Dubay +Jessica Frazelle +Jezeniel Zapanta +jgeiger +Jhon Honce +Ji.Zhilong +Jian Zhang +jianbosun +Jilles Oldenbeuving +Jim Alateras +Jim Perrin +Jimmy Cuadra +Jimmy Puckett +jimmyxian +Jinsoo Park +Jiri Popelka +Jiří Župka +jjy +jmzwcn +Joao Fernandes +Joe Beda +Joe Doliner +Joe Ferguson +Joe Gordon +Joe Shaw +Joe Van Dyk +Joel Friedly +Joel Handwell +Joel Hansson +Joel Wurtz +Joey Geiger +Joey Gibson +Joffrey F +Johan Euphrosine +Johan Rydberg +Johanan Lieberman +Johannes 'fish' Ziemke +John Costa +John Feminella +John Gardiner Myers +John Gossman +John Howard (VM) +John OBrien III +John Starks +John Tims +John Warwick +John Willis +johnharris85 +Jon Wedaman +Jonas Pfenniger +Jonathan A. Sternberg +Jonathan Boulle +Jonathan Camp +Jonathan Dowland +Jonathan Lebon +Jonathan Lomas +Jonathan McCrohan +Jonathan Mueller +Jonathan Pares +Jonathan Rudenberg +Jonathan Stoppani +Joost Cassee +Jordan +Jordan Arentsen +Jordan Sissel +Jose Diaz-Gonzalez +Joseph Anthony Pasquale Holsten +Joseph Hager +Joseph Kern +Josh +Josh Bodah +Josh Chorlton +Josh Hawn +Josh Horwitz +Josh Poimboeuf +Josiah Kiehl +José Tomás Albornoz +JP +jrabbit +Julian Taylor +Julien Barbier +Julien Bisconti +Julien Bordellier +Julien Dubois +Julien Pervillé +Julio Montes +Jun-Ru Chang +Jussi Nummelin +Justas Brazauskas +Justin Cormack +Justin Force +Justin Plock +Justin Simonelis +Justin Terry +Justyn Temme +Jyrki Puttonen +Jérôme Petazzoni +Jörg Thalheim +Kai Blin +Kai Qiang Wu(Kennan) +Kamil Domański +kamjar gerami +Kanstantsin Shautsou +Kara Alexandra +Karan Lyons +Kareem Khazem +kargakis +Karl Grzeszczak +Karol Duleba +Katie McLaughlin +Kato Kazuyoshi +Katrina Owen +Kawsar Saiyeed +kayrus +Ke Xu +Keith Hudgins +Keli Hu +Ken Cochrane +Ken Herner +Ken ICHIKAWA +Kenfe-Mickaël Laventure +Kenjiro Nakayama +Kent Johnson +Kevin "qwazerty" Houdebert +Kevin Burke +Kevin Clark +Kevin J. Lynagh +Kevin Jing Qiu +Kevin Menard +Kevin P. Kucharczyk +Kevin Richardson +Kevin Shi +Kevin Wallace +Kevin Yap +kevinmeredith +Keyvan Fatehi +kies +Kim BKC Carlbacker +Kim Eik +Kimbro Staken +Kir Kolyshkin +Kiran Gangadharan +Kirill Kolyshkin +Kirill SIbirev +knappe +Kohei Tsuruta +Koichi Shiraishi +Konrad Kleine +Konstantin L +Konstantin Pelykh +Krasimir Georgiev +Kris-Mikael Krister +Kristian Haugene +Kristina Zabunova +krrg +Kun Zhang +Kunal Kushwaha +Kyle Conroy +Kyle Linden +kyu +Lachlan Coote +Lai Jiangshan +Lajos Papp +Lakshan Perera +Lalatendu Mohanty +lalyos +Lance Chen +Lance Kinley +Lars Butler +Lars Kellogg-Stedman +Lars R. Damerow +Laszlo Meszaros +Laurent Erignoux +Laurie Voss +Leandro Siqueira +Lee Chao <932819864@qq.com> +Lee, Meng-Han +leeplay +Lei Jitang +Len Weincier +Lennie +Leszek Kowalski +Levi Blackstone +Levi Gross +Lewis Marshall +Lewis Peckover +Liam Macgillavry +Liana Lo +Liang Mingqiang +Liang-Chi Hsieh +liaoqingwei +limsy +Lin Lu +LingFaKe +Linus Heckemann +Liran Tal +Liron Levin +Liu Bo +Liu Hua +lixiaobing10051267 +LIZAO LI +Lloyd Dewolf +Lokesh Mandvekar +longliqiang88 <394564827@qq.com> +Lorenz Leutgeb +Lorenzo Fontana +Louis Opter +Luca Marturana +Luca Orlandi +Luca-Bogdan Grigorescu +Lucas Chan +Lucas Chi +Luciano Mores +Luis Martínez de Bartolomé Izquierdo +Lukas Waslowski +lukaspustina +Lukasz Zajaczkowski +lukemarsden +Lynda O'Leary +Lénaïc Huard +Ma Shimiao +Mabin +Madhav Puri +Madhu Venugopal +Mageee <21521230.zju.edu.cn> +Mahesh Tiyyagura +malnick +Malte Janduda +manchoz +Manfred Touron +Manfred Zabarauskas +Mansi Nahar +mansinahar +Manuel Meurer +Manuel Woelker +mapk0y +Marc Abramowitz +Marc Kuo +Marc Tamsky +Marcelo Salazar +Marco Hennings +Marcus Farkas +Marcus Linke +Marcus Ramberg +Marek Goldmann +Marian Marinov +Marianna Tessel +Mario Loriedo +Marius Gundersen +Marius Sturm +Marius Voila +Mark Allen +Mark McGranaghan +Mark McKinstry +Mark West +Marko Mikulicic +Marko Tibold +Markus Fix +Martijn Dwars +Martijn van Oosterhout +Martin Honermeyer +Martin Kelly +Martin Mosegaard Amdisen +Martin Redmond +Mary Anthony +Masahito Zembutsu +Mason Malone +Mateusz Sulima +Mathias Monnerville +Mathieu Le Marec - Pasquet +Matt Apperson +Matt Bachmann +Matt Bentley +Matt Haggard +Matt Hoyle +Matt McCormick +Matt Moore +Matt Richardson +Matt Robenolt +Matthew Heon +Matthew Mayer +Matthew Mueller +Matthew Riley +Matthias Klumpp +Matthias Kühnle +Matthias Rampke +Matthieu Hauglustaine +mattymo +mattyw +Mauricio Garavaglia +mauriyouth +Max Shytikov +Maxim Fedchyshyn +Maxim Ivanov +Maxim Kulkin +Maxim Treskin +Maxime Petazzoni +Meaglith Ma +meejah +Megan Kostick +Mehul Kar +Mei ChunTao +Mengdi Gao +Mert Yazıcıoğlu +mgniu +Micah Zoltu +Michael A. Smith +Michael Bridgen +Michael Brown +Michael Chiang +Michael Crosby +Michael Currie +Michael Friis +Michael Gorsuch +Michael Grauer +Michael Holzheu +Michael Hudson-Doyle +Michael Huettermann +Michael Käufl +Michael Neale +Michael Prokop +Michael Scharf +Michael Stapelberg +Michael Steinert +Michael Thies +Michael West +Michal Fojtik +Michal Gebauer +Michal Jemala +Michal Minar +Michal Wieczorek +Michaël Pailloncy +Michał Czeraszkiewicz +Michiel@unhosted +Mickaël FORTUNATO +Miguel Angel Fernández +Miguel Morales +Mihai Borobocea +Mihuleacc Sergiu +Mike Brown +Mike Chelen +Mike Danese +Mike Dillon +Mike Dougherty +Mike Gaffney +Mike Goelzer +Mike Leone +Mike MacCana +Mike Naberezny +Mike Snitzer +mikelinjie <294893458@qq.com> +Mikhail Sobolev +Miloslav Trmač +mingqing +Mingzhen Feng +Misty Stanley-Jones +Mitch Capper +mlarcher +Mohammad Banikazemi +Mohammed Aaqib Ansari +Mohit Soni +Morgan Bauer +Morgante Pell +Morgy93 +Morten Siebuhr +Morton Fox +Moysés Borges +mqliang +Mrunal Patel +msabansal +mschurenko +muge +Mustafa Akın +Muthukumar R +Máximo Cuadros +Médi-Rémi Hashim +Nahum Shalman +Nakul Pathak +Nalin Dahyabhai +Nan Monnand Deng +Naoki Orii +Natalie Parker +Natanael Copa +Nate Brennand +Nate Eagleson +Nate Jones +Nathan Hsieh +Nathan Kleyn +Nathan LeClaire +Nathan McCauley +Nathan Williams +Neal McBurnett +Neil Peterson +Nelson Chen +Neyazul Haque +Nghia Tran +Niall O'Higgins +Nicholas E. Rabenau +nick +Nick DeCoursin +Nick Irvine +Nick Parker +Nick Payne +Nick Stenning +Nick Stinemates +Nicola Kabar +Nicolas Borboën +Nicolas De loof +Nicolas Dudebout +Nicolas Goy +Nicolas Kaiser +Nicolás Hock Isaza +Nigel Poulton +NikolaMandic +nikolas +Nirmal Mehta +Nishant Totla +NIWA Hideyuki +noducks +Nolan Darilek +nponeccop +Nuutti Kotivuori +nzwsch +O.S. Tezer +objectified +OddBloke +odk- +Oguz Bilgic +Oh Jinkyun +Ohad Schneider +ohmystack +Ole Reifschneider +Oliver Neal +Olivier Gambier +Olle Jonsson +Oriol Francès +orkaa +Oskar Niburski +Otto Kekäläinen +oyld +ozlerhakan +paetling +pandrew +panticz +Paolo G. Giarrusso +Pascal Borreli +Pascal Hartig +Patrick Böänziger +Patrick Devine +Patrick Hemmer +Patrick Stapleton +pattichen +Paul +paul +Paul Annesley +Paul Bellamy +Paul Bowsher +Paul Furtado +Paul Hammond +Paul Jimenez +Paul Lietar +Paul Liljenberg +Paul Morie +Paul Nasrat +Paul Weaver +Paulo Ribeiro +Pavel Lobashov +Pavel Pospisil +Pavel Sutyrin +Pavel Tikhomirov +Pavlos Ratis +Pavol Vargovcik +Peeyush Gupta +Peggy Li +Pei Su +Penghan Wang +perhapszzy@sina.com +pestophagous +Peter Bourgon +Peter Braden +Peter Choi +Peter Dave Hello +Peter Edge +Peter Ericson +Peter Esbensen +Peter Malmgren +Peter Salvatore +Peter Volpe +Peter Waller +Petr Švihlík +Phil +Phil Estes +Phil Spitler +Philip Monroe +Philipp Wahala +Philipp Weissensteiner +Phillip Alexander +pidster +Piergiuliano Bossi +Pierre +Pierre Carrier +Pierre Dal-Pra +Pierre Wacrenier +Pierre-Alain RIVIERE +Piotr Bogdan +pixelistik +Porjo +Poul Kjeldager Sørensen +Pradeep Chhetri +Prasanna Gautam +Prayag Verma +Przemek Hejman +pysqz +qg <1373319223@qq.com> +qhuang +Qiang Huang +qq690388648 <690388648@qq.com> +Quentin Brossard +Quentin Perez +Quentin Tayssier +r0n22 +Rafal Jeczalik +Rafe Colton +Raghavendra K T +Raghuram Devarakonda +Rajat Pandit +Rajdeep Dua +Ralf Sippl +Ralle +Ralph Bean +Ramkumar Ramachandra +Ramon Brooker +Ramon van Alteren +Ray Tsang +ReadmeCritic +Recursive Madman +Regan McCooey +Remi Rampin +Renato Riccieri Santos Zannon +resouer +rgstephens +Rhys Hiltner +Rich Moyse +Rich Seymour +Richard +Richard Burnison +Richard Harvey +Richard Mathie +Richard Metzler +Richard Scothern +Richo Healey +Rick Bradley +Rick van de Loo +Rick Wieman +Rik Nijessen +Riku Voipio +Riley Guerin +Ritesh H Shukla +Riyaz Faizullabhoy +Rob Vesse +Robert Bachmann +Robert Bittle +Robert Obryk +Robert Stern +Robert Terhaar +Robert Wallis +Roberto G. Hashioka +Robin Naundorf +Robin Schneider +Robin Speekenbrink +robpc +Rodolfo Carvalho +Rodrigo Vaz +Roel Van Nyen +Roger Peppe +Rohit Jnagal +Rohit Kadam +Roland Huß +Roland Kammerer +Roland Moriz +Roma Sokolov +Roman Strashkin +Ron Smits +Ron Williams +root +root +root +root +root +Rory Hunter +Rory McCune +Ross Boucher +Rovanion Luckey +Rozhnov Alexandr +rsmoorthy +Rudolph Gottesheim +Rui Lopes +Runshen Zhu +Ryan Anderson +Ryan Aslett +Ryan Belgrave +Ryan Detzel +Ryan Fowler +Ryan McLaughlin +Ryan O'Donnell +Ryan Seto +Ryan Thomas +Ryan Trauntvein +Ryan Wallner +RyanDeng +Rémy Greinhofer +s. rannou +s00318865 +Sabin Basyal +Sachin Joshi +Sagar Hani +Sainath Grandhi +sakeven +Sally O'Malley +Sam Abed +Sam Alba +Sam Bailey +Sam J Sharpe +Sam Neirinck +Sam Reis +Sam Rijs +Sambuddha Basu +Sami Wagiaalla +Samuel Andaya +Samuel Dion-Girardeau +Samuel Karp +Samuel PHAN +Sankar சங்கர் +Sanket Saurav +Santhosh Manohar +sapphiredev +Satnam Singh +satoru +Satoshi Amemiya +Satoshi Tagomori +scaleoutsean +Scott Bessler +Scott Collier +Scott Johnston +Scott Stamp +Scott Walls +sdreyesg +Sean Christopherson +Sean Cronin +Sean OMeara +Sean P. Kane +Sebastiaan van Steenis +Sebastiaan van Stijn +Senthil Kumar Selvaraj +Senthil Kumaran +SeongJae Park +Seongyeol Lim +Serge Hallyn +Sergey Alekseev +Sergey Evstifeev +Serhat Gülçiçek +Sevki Hasirci +Shane Canon +Shane da Silva +shaunol +Shawn Landden +Shawn Siefkas +shawnhe +Shekhar Gulati +Sheng Yang +Shengbo Song +Shev Yan +Shih-Yuan Lee +Shijiang Wei +Shishir Mahajan +Shoubhik Bose +Shourya Sarcar +shuai-z +Shukui Yang +Shuwei Hao +Sian Lerk Lau +sidharthamani +Silas Sewell +Simei He +Simon Eskildsen +Simon Leinen +Simon Taranto +Sindhu S +Sjoerd Langkemper +skaasten +Solganik Alexander +Solomon Hykes +Song Gao +Soshi Katsuta +Soulou +Spencer Brown +Spencer Smith +Sridatta Thatipamala +Sridhar Ratnakumar +Srini Brahmaroutu +srinsriv +Steeve Morin +Stefan Berger +Stefan J. Wernli +Stefan Praszalowicz +Stefan Scherer +Stefan Staudenmeyer +Stefan Weil +Stephen Crosby +Stephen Day +Stephen Drake +Stephen Rust +Steve Durrheimer +Steve Francia +Steve Koch +Steven Burgess +Steven Erenst +Steven Iveson +Steven Merrill +Steven Richards +Steven Taylor +Subhajit Ghosh +Sujith Haridasan +Suryakumar Sudar +Sven Dowideit +Swapnil Daingade +Sylvain Baubeau +Sylvain Bellemare +Sébastien +Sébastien Luttringer +Sébastien Stormacq +Tadej Janež +TAGOMORI Satoshi +tang0th +Tangi COLIN +Tatsuki Sugiura +Tatsushi Inagaki +Taylor Jones +tbonza +Ted M. Young +Tehmasp Chaudhri +Tejesh Mehta +terryding77 <550147740@qq.com> +tgic +Thatcher Peskens +theadactyl +Thell 'Bo' Fowler +Thermionix +Thijs Terlouw +Thomas Bikeev +Thomas Frössman +Thomas Gazagnaire +Thomas Grainger +Thomas Hansen +Thomas Leonard +Thomas LEVEIL +Thomas Orozco +Thomas Riccardi +Thomas Schroeter +Thomas Sjögren +Thomas Swift +Thomas Tanaka +Thomas Texier +Tianon Gravi +Tianyi Wang +Tibor Vass +Tiffany Jernigan +Tiffany Low +Tim Bosse +Tim Dettrick +Tim Düsterhus +Tim Hockin +Tim Ruffles +Tim Smith +Tim Terhorst +Tim Wang +Tim Waugh +Tim Wraight +timfeirg +Timothy Hobbs +tjwebb123 +tobe +Tobias Bieniek +Tobias Bradtke +Tobias Gesellchen +Tobias Klauser +Tobias Munk +Tobias Schmidt +Tobias Schwab +Todd Crane +Todd Lunter +Todd Whiteman +Toli Kuznets +Tom Barlow +Tom Denham +Tom Fotherby +Tom Howe +Tom Hulihan +Tom Maaswinkel +Tom X. Tobin +Tomas Tomecek +Tomasz Kopczynski +Tomasz Lipinski +Tomasz Nurkiewicz +Tommaso Visconti +Tomáš Hrčka +Tonis Tiigi +Tonny Xu +Tony Daws +Tony Miller +toogley +Torstein Husebø +tpng +tracylihui <793912329@qq.com> +Travis Cline +Travis Thieman +Trent Ogren +Trevor +Trevor Pounds +trishnaguha +Tristan Carel +Troy Denton +Tyler Brock +Tzu-Jung Lee +Tõnis Tiigi +Ulysse Carion +unknown +vagrant +Vaidas Jablonskis +Veres Lajos +vgeta +Victor Algaze +Victor Coisne +Victor Costan +Victor I. Wood +Victor Lyuboslavsky +Victor Marmol +Victor Palma +Victor Vieux +Victoria Bialas +Vijaya Kumar K +Viktor Stanchev +Viktor Vojnovski +VinayRaghavanKS +Vincent Batts +Vincent Bernat +Vincent Bernat +Vincent Demeester +Vincent Giersch +Vincent Mayers +Vincent Woo +Vinod Kulkarni +Vishal Doshi +Vishnu Kannan +Vitor Monteiro +Vivek Agarwal +Vivek Dasgupta +Vivek Goyal +Vladimir Bulyga +Vladimir Kirillov +Vladimir Pouzanov +Vladimir Rutsky +Vladimir Varankin +VladimirAus +Vojtech Vitek (V-Teq) +waitingkuo +Walter Leibbrandt +Walter Stanish +WANG Chao +Wang Xing +Ward Vandewege +WarheadsSE +Wayne Chang +Wei-Ting Kuo +weiyan +Weiyang Zhu +Wen Cheng Ma +Wendel Fleming +Wenkai Yin +Wenxuan Zhao +Wenyu You <21551128@zju.edu.cn> +Wes Morgan +Will Dietz +Will Rouesnel +Will Weaver +willhf +William Delanoue +William Henry +William Hubbs +William Riancho +William Thurston +WiseTrem +wlan0 +Wolfgang Powisch +wonderflow +Wonjun Kim +xamyzhao +Xianlu Bird +XiaoBing Jiang +Xiaoxu Chen +xiekeyang +Xinzi Zhou +Xiuming Chen +xlgao-zju +xuzhaokui +Yahya +YAMADA Tsuyoshi +Yan Feng +Yang Bai +yangshukui +Yanqiang Miao +Yasunori Mahata +Yestin Sun +Yi EungJun +Yibai Zhang +Yihang Ho +Ying Li +Yohei Ueda +Yong Tang +Yongzhi Pan +yorkie +Youcef YEKHLEF +Yuan Sun +yuchangchun +yuchengxia +yuexiao-wang +YuPengZTE +Yurii Rashkovskii +yuzou +Zac Dover +Zach Borboa +Zachary Jaffee +Zain Memon +Zaiste! +Zane DeGraffenried +Zefan Li +Zen Lin(Zhinan Lin) +Zhang Kun +Zhang Wei +Zhang Wentao +Zhenan Ye <21551168@zju.edu.cn> +zhouhao +Zhu Guihua +Zhuoyun Wei +Zilin Du +zimbatm +Ziming Dong +ZJUshuaizhou <21551191@zju.edu.cn> +zmarouf +Zoltan Tombol +zqh +Zuhayr Elahi +Zunayed Ali +Álex González +Álvaro Lázaro +Átila Camurça Alves +尹吉峰 +搏通 diff --git a/vendor/github.com/docker/docker/LICENSE b/vendor/github.com/docker/docker/LICENSE new file mode 100644 index 00000000..8f3fee62 --- /dev/null +++ b/vendor/github.com/docker/docker/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2013-2016 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/docker/docker/NOTICE b/vendor/github.com/docker/docker/NOTICE new file mode 100644 index 00000000..8a37c1c7 --- /dev/null +++ b/vendor/github.com/docker/docker/NOTICE @@ -0,0 +1,19 @@ +Docker +Copyright 2012-2016 Docker, Inc. + +This product includes software developed at Docker, Inc. (https://www.docker.com). + +This product contains software (https://github.com/kr/pty) developed +by Keith Rarick, licensed under the MIT License. + +The following is courtesy of our legal counsel: + + +Use and transfer of Docker may be subject to certain restrictions by the +United States and other governments. +It is your responsibility to ensure that your use and/or transfer does not +violate applicable laws. + +For more information, please see https://www.bis.doc.gov + +See also https://www.apache.org/dev/crypto.html and/or seek legal counsel. diff --git a/vendor/github.com/docker/docker/api/types/auth.go b/vendor/github.com/docker/docker/api/types/auth.go new file mode 100644 index 00000000..056af6b8 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/auth.go @@ -0,0 +1,22 @@ +package types + +// AuthConfig contains authorization information for connecting to a Registry +type AuthConfig struct { + Username string `json:"username,omitempty"` + Password string `json:"password,omitempty"` + Auth string `json:"auth,omitempty"` + + // Email is an optional value associated with the username. + // This field is deprecated and will be removed in a later + // version of docker. + Email string `json:"email,omitempty"` + + ServerAddress string `json:"serveraddress,omitempty"` + + // IdentityToken is used to authenticate the user and get + // an access token for the registry. + IdentityToken string `json:"identitytoken,omitempty"` + + // RegistryToken is a bearer token to be sent to a registry + RegistryToken string `json:"registrytoken,omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/blkiodev/blkio.go b/vendor/github.com/docker/docker/api/types/blkiodev/blkio.go new file mode 100644 index 00000000..931ae10a --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/blkiodev/blkio.go @@ -0,0 +1,23 @@ +package blkiodev + +import "fmt" + +// WeightDevice is a structure that holds device:weight pair +type WeightDevice struct { + Path string + Weight uint16 +} + +func (w *WeightDevice) String() string { + return fmt.Sprintf("%s:%d", w.Path, w.Weight) +} + +// ThrottleDevice is a structure that holds device:rate_per_second pair +type ThrottleDevice struct { + Path string + Rate uint64 +} + +func (t *ThrottleDevice) String() string { + return fmt.Sprintf("%s:%d", t.Path, t.Rate) +} diff --git a/vendor/github.com/docker/docker/api/types/client.go b/vendor/github.com/docker/docker/api/types/client.go new file mode 100644 index 00000000..7900d64f --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/client.go @@ -0,0 +1,378 @@ +package types + +import ( + "bufio" + "io" + "net" + "os" + + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/filters" + "github.com/docker/go-units" +) + +// CheckpointCreateOptions holds parameters to create a checkpoint from a container +type CheckpointCreateOptions struct { + CheckpointID string + CheckpointDir string + Exit bool +} + +// CheckpointListOptions holds parameters to list checkpoints for a container +type CheckpointListOptions struct { + CheckpointDir string +} + +// CheckpointDeleteOptions holds parameters to delete a checkpoint from a container +type CheckpointDeleteOptions struct { + CheckpointID string + CheckpointDir string +} + +// ContainerAttachOptions holds parameters to attach to a container. +type ContainerAttachOptions struct { + Stream bool + Stdin bool + Stdout bool + Stderr bool + DetachKeys string + Logs bool +} + +// ContainerCommitOptions holds parameters to commit changes into a container. +type ContainerCommitOptions struct { + Reference string + Comment string + Author string + Changes []string + Pause bool + Config *container.Config +} + +// ContainerExecInspect holds information returned by exec inspect. +type ContainerExecInspect struct { + ExecID string + ContainerID string + Running bool + ExitCode int + Pid int +} + +// ContainerListOptions holds parameters to list containers with. +type ContainerListOptions struct { + Quiet bool + Size bool + All bool + Latest bool + Since string + Before string + Limit int + Filters filters.Args +} + +// ContainerLogsOptions holds parameters to filter logs with. +type ContainerLogsOptions struct { + ShowStdout bool + ShowStderr bool + Since string + Timestamps bool + Follow bool + Tail string + Details bool +} + +// ContainerRemoveOptions holds parameters to remove containers. +type ContainerRemoveOptions struct { + RemoveVolumes bool + RemoveLinks bool + Force bool +} + +// ContainerStartOptions holds parameters to start containers. +type ContainerStartOptions struct { + CheckpointID string + CheckpointDir string +} + +// CopyToContainerOptions holds information +// about files to copy into a container +type CopyToContainerOptions struct { + AllowOverwriteDirWithFile bool +} + +// EventsOptions holds parameters to filter events with. +type EventsOptions struct { + Since string + Until string + Filters filters.Args +} + +// NetworkListOptions holds parameters to filter the list of networks with. +type NetworkListOptions struct { + Filters filters.Args +} + +// HijackedResponse holds connection information for a hijacked request. +type HijackedResponse struct { + Conn net.Conn + Reader *bufio.Reader +} + +// Close closes the hijacked connection and reader. +func (h *HijackedResponse) Close() { + h.Conn.Close() +} + +// CloseWriter is an interface that implements structs +// that close input streams to prevent from writing. +type CloseWriter interface { + CloseWrite() error +} + +// CloseWrite closes a readWriter for writing. +func (h *HijackedResponse) CloseWrite() error { + if conn, ok := h.Conn.(CloseWriter); ok { + return conn.CloseWrite() + } + return nil +} + +// ImageBuildOptions holds the information +// necessary to build images. +type ImageBuildOptions struct { + Tags []string + SuppressOutput bool + RemoteContext string + NoCache bool + Remove bool + ForceRemove bool + PullParent bool + Isolation container.Isolation + CPUSetCPUs string + CPUSetMems string + CPUShares int64 + CPUQuota int64 + CPUPeriod int64 + Memory int64 + MemorySwap int64 + CgroupParent string + NetworkMode string + ShmSize int64 + Dockerfile string + Ulimits []*units.Ulimit + // See the parsing of buildArgs in api/server/router/build/build_routes.go + // for an explaination of why BuildArgs needs to use *string instead of + // just a string + BuildArgs map[string]*string + AuthConfigs map[string]AuthConfig + Context io.Reader + Labels map[string]string + // squash the resulting image's layers to the parent + // preserves the original image and creates a new one from the parent with all + // the changes applied to a single layer + Squash bool + // CacheFrom specifies images that are used for matching cache. Images + // specified here do not need to have a valid parent chain to match cache. + CacheFrom []string + SecurityOpt []string +} + +// ImageBuildResponse holds information +// returned by a server after building +// an image. +type ImageBuildResponse struct { + Body io.ReadCloser + OSType string +} + +// ImageCreateOptions holds information to create images. +type ImageCreateOptions struct { + RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry +} + +// ImageImportSource holds source information for ImageImport +type ImageImportSource struct { + Source io.Reader // Source is the data to send to the server to create this image from (mutually exclusive with SourceName) + SourceName string // SourceName is the name of the image to pull (mutually exclusive with Source) +} + +// ImageImportOptions holds information to import images from the client host. +type ImageImportOptions struct { + Tag string // Tag is the name to tag this image with. This attribute is deprecated. + Message string // Message is the message to tag the image with + Changes []string // Changes are the raw changes to apply to this image +} + +// ImageListOptions holds parameters to filter the list of images with. +type ImageListOptions struct { + All bool + Filters filters.Args +} + +// ImageLoadResponse returns information to the client about a load process. +type ImageLoadResponse struct { + // Body must be closed to avoid a resource leak + Body io.ReadCloser + JSON bool +} + +// ImagePullOptions holds information to pull images. +type ImagePullOptions struct { + All bool + RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry + PrivilegeFunc RequestPrivilegeFunc +} + +// RequestPrivilegeFunc is a function interface that +// clients can supply to retry operations after +// getting an authorization error. +// This function returns the registry authentication +// header value in base 64 format, or an error +// if the privilege request fails. +type RequestPrivilegeFunc func() (string, error) + +//ImagePushOptions holds information to push images. +type ImagePushOptions ImagePullOptions + +// ImageRemoveOptions holds parameters to remove images. +type ImageRemoveOptions struct { + Force bool + PruneChildren bool +} + +// ImageSearchOptions holds parameters to search images with. +type ImageSearchOptions struct { + RegistryAuth string + PrivilegeFunc RequestPrivilegeFunc + Filters filters.Args + Limit int +} + +// ResizeOptions holds parameters to resize a tty. +// It can be used to resize container ttys and +// exec process ttys too. +type ResizeOptions struct { + Height uint + Width uint +} + +// VersionResponse holds version information for the client and the server +type VersionResponse struct { + Client *Version + Server *Version +} + +// ServerOK returns true when the client could connect to the docker server +// and parse the information received. It returns false otherwise. +func (v VersionResponse) ServerOK() bool { + return v.Server != nil +} + +// NodeListOptions holds parameters to list nodes with. +type NodeListOptions struct { + Filters filters.Args +} + +// NodeRemoveOptions holds parameters to remove nodes with. +type NodeRemoveOptions struct { + Force bool +} + +// ServiceCreateOptions contains the options to use when creating a service. +type ServiceCreateOptions struct { + // EncodedRegistryAuth is the encoded registry authorization credentials to + // use when updating the service. + // + // This field follows the format of the X-Registry-Auth header. + EncodedRegistryAuth string +} + +// ServiceCreateResponse contains the information returned to a client +// on the creation of a new service. +type ServiceCreateResponse struct { + // ID is the ID of the created service. + ID string + // Warnings is a set of non-fatal warning messages to pass on to the user. + Warnings []string `json:",omitempty"` +} + +// Values for RegistryAuthFrom in ServiceUpdateOptions +const ( + RegistryAuthFromSpec = "spec" + RegistryAuthFromPreviousSpec = "previous-spec" +) + +// ServiceUpdateOptions contains the options to be used for updating services. +type ServiceUpdateOptions struct { + // EncodedRegistryAuth is the encoded registry authorization credentials to + // use when updating the service. + // + // This field follows the format of the X-Registry-Auth header. + EncodedRegistryAuth string + + // TODO(stevvooe): Consider moving the version parameter of ServiceUpdate + // into this field. While it does open API users up to racy writes, most + // users may not need that level of consistency in practice. + + // RegistryAuthFrom specifies where to find the registry authorization + // credentials if they are not given in EncodedRegistryAuth. Valid + // values are "spec" and "previous-spec". + RegistryAuthFrom string +} + +// ServiceListOptions holds parameters to list services with. +type ServiceListOptions struct { + Filters filters.Args +} + +// TaskListOptions holds parameters to list tasks with. +type TaskListOptions struct { + Filters filters.Args +} + +// PluginRemoveOptions holds parameters to remove plugins. +type PluginRemoveOptions struct { + Force bool +} + +// PluginEnableOptions holds parameters to enable plugins. +type PluginEnableOptions struct { + Timeout int +} + +// PluginDisableOptions holds parameters to disable plugins. +type PluginDisableOptions struct { + Force bool +} + +// PluginInstallOptions holds parameters to install a plugin. +type PluginInstallOptions struct { + Disabled bool + AcceptAllPermissions bool + RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry + RemoteRef string // RemoteRef is the plugin name on the registry + PrivilegeFunc RequestPrivilegeFunc + AcceptPermissionsFunc func(PluginPrivileges) (bool, error) + Args []string +} + +// SecretRequestOption is a type for requesting secrets +type SecretRequestOption struct { + Source string + Target string + UID string + GID string + Mode os.FileMode +} + +// SwarmUnlockKeyResponse contains the response for Engine API: +// GET /swarm/unlockkey +type SwarmUnlockKeyResponse struct { + // UnlockKey is the unlock key in ASCII-armored format. + UnlockKey string +} + +// PluginCreateOptions hold all options to plugin create. +type PluginCreateOptions struct { + RepoName string +} diff --git a/vendor/github.com/docker/docker/api/types/configs.go b/vendor/github.com/docker/docker/api/types/configs.go new file mode 100644 index 00000000..20c19f21 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/configs.go @@ -0,0 +1,69 @@ +package types + +import ( + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/network" +) + +// configs holds structs used for internal communication between the +// frontend (such as an http server) and the backend (such as the +// docker daemon). + +// ContainerCreateConfig is the parameter set to ContainerCreate() +type ContainerCreateConfig struct { + Name string + Config *container.Config + HostConfig *container.HostConfig + NetworkingConfig *network.NetworkingConfig + AdjustCPUShares bool +} + +// ContainerRmConfig holds arguments for the container remove +// operation. This struct is used to tell the backend what operations +// to perform. +type ContainerRmConfig struct { + ForceRemove, RemoveVolume, RemoveLink bool +} + +// ContainerCommitConfig contains build configs for commit operation, +// and is used when making a commit with the current state of the container. +type ContainerCommitConfig struct { + Pause bool + Repo string + Tag string + Author string + Comment string + // merge container config into commit config before commit + MergeConfigs bool + Config *container.Config +} + +// ExecConfig is a small subset of the Config struct that holds the configuration +// for the exec feature of docker. +type ExecConfig struct { + User string // User that will run the command + Privileged bool // Is the container in privileged mode + Tty bool // Attach standard streams to a tty. + AttachStdin bool // Attach the standard input, makes possible user interaction + AttachStderr bool // Attach the standard error + AttachStdout bool // Attach the standard output + Detach bool // Execute in detach mode + DetachKeys string // Escape keys for detach + Env []string // Environment variables + Cmd []string // Execution commands and args +} + +// PluginRmConfig holds arguments for plugin remove. +type PluginRmConfig struct { + ForceRemove bool +} + +// PluginEnableConfig holds arguments for plugin enable +type PluginEnableConfig struct { + Timeout int +} + +// PluginDisableConfig holds arguments for plugin disable. +type PluginDisableConfig struct { + ForceDisable bool +} diff --git a/vendor/github.com/docker/docker/api/types/container/config.go b/vendor/github.com/docker/docker/api/types/container/config.go new file mode 100644 index 00000000..fc050e5d --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/config.go @@ -0,0 +1,62 @@ +package container + +import ( + "time" + + "github.com/docker/docker/api/types/strslice" + "github.com/docker/go-connections/nat" +) + +// HealthConfig holds configuration settings for the HEALTHCHECK feature. +type HealthConfig struct { + // Test is the test to perform to check that the container is healthy. + // An empty slice means to inherit the default. + // The options are: + // {} : inherit healthcheck + // {"NONE"} : disable healthcheck + // {"CMD", args...} : exec arguments directly + // {"CMD-SHELL", command} : run command with system's default shell + Test []string `json:",omitempty"` + + // Zero means to inherit. Durations are expressed as integer nanoseconds. + Interval time.Duration `json:",omitempty"` // Interval is the time to wait between checks. + Timeout time.Duration `json:",omitempty"` // Timeout is the time to wait before considering the check to have hung. + + // Retries is the number of consecutive failures needed to consider a container as unhealthy. + // Zero means inherit. + Retries int `json:",omitempty"` +} + +// Config contains the configuration data about a container. +// It should hold only portable information about the container. +// Here, "portable" means "independent from the host we are running on". +// Non-portable information *should* appear in HostConfig. +// All fields added to this struct must be marked `omitempty` to keep getting +// predictable hashes from the old `v1Compatibility` configuration. +type Config struct { + Hostname string // Hostname + Domainname string // Domainname + User string // User that will run the command(s) inside the container, also support user:group + AttachStdin bool // Attach the standard input, makes possible user interaction + AttachStdout bool // Attach the standard output + AttachStderr bool // Attach the standard error + ExposedPorts nat.PortSet `json:",omitempty"` // List of exposed ports + Tty bool // Attach standard streams to a tty, including stdin if it is not closed. + OpenStdin bool // Open stdin + StdinOnce bool // If true, close stdin after the 1 attached client disconnects. + Env []string // List of environment variable to set in the container + Cmd strslice.StrSlice // Command to run when starting the container + Healthcheck *HealthConfig `json:",omitempty"` // Healthcheck describes how to check the container is healthy + ArgsEscaped bool `json:",omitempty"` // True if command is already escaped (Windows specific) + Image string // Name of the image as it was passed by the operator (e.g. could be symbolic) + Volumes map[string]struct{} // List of volumes (mounts) used for the container + WorkingDir string // Current directory (PWD) in the command will be launched + Entrypoint strslice.StrSlice // Entrypoint to run when starting the container + NetworkDisabled bool `json:",omitempty"` // Is network disabled + MacAddress string `json:",omitempty"` // Mac Address of the container + OnBuild []string // ONBUILD metadata that were defined on the image Dockerfile + Labels map[string]string // List of labels set to this container + StopSignal string `json:",omitempty"` // Signal to stop a container + StopTimeout *int `json:",omitempty"` // Timeout (in seconds) to stop a container + Shell strslice.StrSlice `json:",omitempty"` // Shell for shell-form of RUN, CMD, ENTRYPOINT +} diff --git a/vendor/github.com/docker/docker/api/types/container/container_create.go b/vendor/github.com/docker/docker/api/types/container/container_create.go new file mode 100644 index 00000000..d028e3b1 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/container_create.go @@ -0,0 +1,21 @@ +package container + +// ---------------------------------------------------------------------------- +// DO NOT EDIT THIS FILE +// This file was generated by `swagger generate operation` +// +// See hack/swagger-gen.sh +// ---------------------------------------------------------------------------- + +// ContainerCreateCreatedBody container create created body +// swagger:model ContainerCreateCreatedBody +type ContainerCreateCreatedBody struct { + + // The ID of the created container + // Required: true + ID string `json:"Id"` + + // Warnings encountered when creating the container + // Required: true + Warnings []string `json:"Warnings"` +} diff --git a/vendor/github.com/docker/docker/api/types/container/container_update.go b/vendor/github.com/docker/docker/api/types/container/container_update.go new file mode 100644 index 00000000..81ee12c6 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/container_update.go @@ -0,0 +1,17 @@ +package container + +// ---------------------------------------------------------------------------- +// DO NOT EDIT THIS FILE +// This file was generated by `swagger generate operation` +// +// See hack/swagger-gen.sh +// ---------------------------------------------------------------------------- + +// ContainerUpdateOKBody container update o k body +// swagger:model ContainerUpdateOKBody +type ContainerUpdateOKBody struct { + + // warnings + // Required: true + Warnings []string `json:"Warnings"` +} diff --git a/vendor/github.com/docker/docker/api/types/container/container_wait.go b/vendor/github.com/docker/docker/api/types/container/container_wait.go new file mode 100644 index 00000000..16cf3353 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/container_wait.go @@ -0,0 +1,17 @@ +package container + +// ---------------------------------------------------------------------------- +// DO NOT EDIT THIS FILE +// This file was generated by `swagger generate operation` +// +// See hack/swagger-gen.sh +// ---------------------------------------------------------------------------- + +// ContainerWaitOKBody container wait o k body +// swagger:model ContainerWaitOKBody +type ContainerWaitOKBody struct { + + // Exit code of the container + // Required: true + StatusCode int64 `json:"StatusCode"` +} diff --git a/vendor/github.com/docker/docker/api/types/container/host_config.go b/vendor/github.com/docker/docker/api/types/container/host_config.go new file mode 100644 index 00000000..0c82d625 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/host_config.go @@ -0,0 +1,333 @@ +package container + +import ( + "strings" + + "github.com/docker/docker/api/types/blkiodev" + "github.com/docker/docker/api/types/mount" + "github.com/docker/docker/api/types/strslice" + "github.com/docker/go-connections/nat" + "github.com/docker/go-units" +) + +// NetworkMode represents the container network stack. +type NetworkMode string + +// Isolation represents the isolation technology of a container. The supported +// values are platform specific +type Isolation string + +// IsDefault indicates the default isolation technology of a container. On Linux this +// is the native driver. On Windows, this is a Windows Server Container. +func (i Isolation) IsDefault() bool { + return strings.ToLower(string(i)) == "default" || string(i) == "" +} + +// IpcMode represents the container ipc stack. +type IpcMode string + +// IsPrivate indicates whether the container uses its private ipc stack. +func (n IpcMode) IsPrivate() bool { + return !(n.IsHost() || n.IsContainer()) +} + +// IsHost indicates whether the container uses the host's ipc stack. +func (n IpcMode) IsHost() bool { + return n == "host" +} + +// IsContainer indicates whether the container uses a container's ipc stack. +func (n IpcMode) IsContainer() bool { + parts := strings.SplitN(string(n), ":", 2) + return len(parts) > 1 && parts[0] == "container" +} + +// Valid indicates whether the ipc stack is valid. +func (n IpcMode) Valid() bool { + parts := strings.Split(string(n), ":") + switch mode := parts[0]; mode { + case "", "host": + case "container": + if len(parts) != 2 || parts[1] == "" { + return false + } + default: + return false + } + return true +} + +// Container returns the name of the container ipc stack is going to be used. +func (n IpcMode) Container() string { + parts := strings.SplitN(string(n), ":", 2) + if len(parts) > 1 { + return parts[1] + } + return "" +} + +// UsernsMode represents userns mode in the container. +type UsernsMode string + +// IsHost indicates whether the container uses the host's userns. +func (n UsernsMode) IsHost() bool { + return n == "host" +} + +// IsPrivate indicates whether the container uses the a private userns. +func (n UsernsMode) IsPrivate() bool { + return !(n.IsHost()) +} + +// Valid indicates whether the userns is valid. +func (n UsernsMode) Valid() bool { + parts := strings.Split(string(n), ":") + switch mode := parts[0]; mode { + case "", "host": + default: + return false + } + return true +} + +// CgroupSpec represents the cgroup to use for the container. +type CgroupSpec string + +// IsContainer indicates whether the container is using another container cgroup +func (c CgroupSpec) IsContainer() bool { + parts := strings.SplitN(string(c), ":", 2) + return len(parts) > 1 && parts[0] == "container" +} + +// Valid indicates whether the cgroup spec is valid. +func (c CgroupSpec) Valid() bool { + return c.IsContainer() || c == "" +} + +// Container returns the name of the container whose cgroup will be used. +func (c CgroupSpec) Container() string { + parts := strings.SplitN(string(c), ":", 2) + if len(parts) > 1 { + return parts[1] + } + return "" +} + +// UTSMode represents the UTS namespace of the container. +type UTSMode string + +// IsPrivate indicates whether the container uses its private UTS namespace. +func (n UTSMode) IsPrivate() bool { + return !(n.IsHost()) +} + +// IsHost indicates whether the container uses the host's UTS namespace. +func (n UTSMode) IsHost() bool { + return n == "host" +} + +// Valid indicates whether the UTS namespace is valid. +func (n UTSMode) Valid() bool { + parts := strings.Split(string(n), ":") + switch mode := parts[0]; mode { + case "", "host": + default: + return false + } + return true +} + +// PidMode represents the pid namespace of the container. +type PidMode string + +// IsPrivate indicates whether the container uses its own new pid namespace. +func (n PidMode) IsPrivate() bool { + return !(n.IsHost() || n.IsContainer()) +} + +// IsHost indicates whether the container uses the host's pid namespace. +func (n PidMode) IsHost() bool { + return n == "host" +} + +// IsContainer indicates whether the container uses a container's pid namespace. +func (n PidMode) IsContainer() bool { + parts := strings.SplitN(string(n), ":", 2) + return len(parts) > 1 && parts[0] == "container" +} + +// Valid indicates whether the pid namespace is valid. +func (n PidMode) Valid() bool { + parts := strings.Split(string(n), ":") + switch mode := parts[0]; mode { + case "", "host": + case "container": + if len(parts) != 2 || parts[1] == "" { + return false + } + default: + return false + } + return true +} + +// Container returns the name of the container whose pid namespace is going to be used. +func (n PidMode) Container() string { + parts := strings.SplitN(string(n), ":", 2) + if len(parts) > 1 { + return parts[1] + } + return "" +} + +// DeviceMapping represents the device mapping between the host and the container. +type DeviceMapping struct { + PathOnHost string + PathInContainer string + CgroupPermissions string +} + +// RestartPolicy represents the restart policies of the container. +type RestartPolicy struct { + Name string + MaximumRetryCount int +} + +// IsNone indicates whether the container has the "no" restart policy. +// This means the container will not automatically restart when exiting. +func (rp *RestartPolicy) IsNone() bool { + return rp.Name == "no" || rp.Name == "" +} + +// IsAlways indicates whether the container has the "always" restart policy. +// This means the container will automatically restart regardless of the exit status. +func (rp *RestartPolicy) IsAlways() bool { + return rp.Name == "always" +} + +// IsOnFailure indicates whether the container has the "on-failure" restart policy. +// This means the container will automatically restart of exiting with a non-zero exit status. +func (rp *RestartPolicy) IsOnFailure() bool { + return rp.Name == "on-failure" +} + +// IsUnlessStopped indicates whether the container has the +// "unless-stopped" restart policy. This means the container will +// automatically restart unless user has put it to stopped state. +func (rp *RestartPolicy) IsUnlessStopped() bool { + return rp.Name == "unless-stopped" +} + +// IsSame compares two RestartPolicy to see if they are the same +func (rp *RestartPolicy) IsSame(tp *RestartPolicy) bool { + return rp.Name == tp.Name && rp.MaximumRetryCount == tp.MaximumRetryCount +} + +// LogConfig represents the logging configuration of the container. +type LogConfig struct { + Type string + Config map[string]string +} + +// Resources contains container's resources (cgroups config, ulimits...) +type Resources struct { + // Applicable to all platforms + CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers) + Memory int64 // Memory limit (in bytes) + NanoCPUs int64 `json:"NanoCpus"` // CPU quota in units of 10-9 CPUs. + + // Applicable to UNIX platforms + CgroupParent string // Parent cgroup. + BlkioWeight uint16 // Block IO weight (relative weight vs. other containers) + BlkioWeightDevice []*blkiodev.WeightDevice + BlkioDeviceReadBps []*blkiodev.ThrottleDevice + BlkioDeviceWriteBps []*blkiodev.ThrottleDevice + BlkioDeviceReadIOps []*blkiodev.ThrottleDevice + BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice + CPUPeriod int64 `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period + CPUQuota int64 `json:"CpuQuota"` // CPU CFS (Completely Fair Scheduler) quota + CPURealtimePeriod int64 `json:"CpuRealtimePeriod"` // CPU real-time period + CPURealtimeRuntime int64 `json:"CpuRealtimeRuntime"` // CPU real-time runtime + CpusetCpus string // CpusetCpus 0-2, 0,1 + CpusetMems string // CpusetMems 0-2, 0,1 + Devices []DeviceMapping // List of devices to map inside the container + DiskQuota int64 // Disk limit (in bytes) + KernelMemory int64 // Kernel memory limit (in bytes) + MemoryReservation int64 // Memory soft limit (in bytes) + MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap + MemorySwappiness *int64 // Tuning container memory swappiness behaviour + OomKillDisable *bool // Whether to disable OOM Killer or not + PidsLimit int64 // Setting pids limit for a container + Ulimits []*units.Ulimit // List of ulimits to be set in the container + + // Applicable to Windows + CPUCount int64 `json:"CpuCount"` // CPU count + CPUPercent int64 `json:"CpuPercent"` // CPU percent + IOMaximumIOps uint64 // Maximum IOps for the container system drive + IOMaximumBandwidth uint64 // Maximum IO in bytes per second for the container system drive +} + +// UpdateConfig holds the mutable attributes of a Container. +// Those attributes can be updated at runtime. +type UpdateConfig struct { + // Contains container's resources (cgroups, ulimits) + Resources + RestartPolicy RestartPolicy +} + +// HostConfig the non-portable Config structure of a container. +// Here, "non-portable" means "dependent of the host we are running on". +// Portable information *should* appear in Config. +type HostConfig struct { + // Applicable to all platforms + Binds []string // List of volume bindings for this container + ContainerIDFile string // File (path) where the containerId is written + LogConfig LogConfig // Configuration of the logs for this container + NetworkMode NetworkMode // Network mode to use for the container + PortBindings nat.PortMap // Port mapping between the exposed port (container) and the host + RestartPolicy RestartPolicy // Restart policy to be used for the container + AutoRemove bool // Automatically remove container when it exits + VolumeDriver string // Name of the volume driver used to mount volumes + VolumesFrom []string // List of volumes to take from other container + + // Applicable to UNIX platforms + CapAdd strslice.StrSlice // List of kernel capabilities to add to the container + CapDrop strslice.StrSlice // List of kernel capabilities to remove from the container + DNS []string `json:"Dns"` // List of DNS server to lookup + DNSOptions []string `json:"DnsOptions"` // List of DNSOption to look for + DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for + ExtraHosts []string // List of extra hosts + GroupAdd []string // List of additional groups that the container process will run as + IpcMode IpcMode // IPC namespace to use for the container + Cgroup CgroupSpec // Cgroup to use for the container + Links []string // List of links (in the name:alias form) + OomScoreAdj int // Container preference for OOM-killing + PidMode PidMode // PID namespace to use for the container + Privileged bool // Is the container in privileged mode + PublishAllPorts bool // Should docker publish all exposed port for the container + ReadonlyRootfs bool // Is the container root filesystem in read-only + SecurityOpt []string // List of string values to customize labels for MLS systems, such as SELinux. + StorageOpt map[string]string `json:",omitempty"` // Storage driver options per container. + Tmpfs map[string]string `json:",omitempty"` // List of tmpfs (mounts) used for the container + UTSMode UTSMode // UTS namespace to use for the container + UsernsMode UsernsMode // The user namespace to use for the container + ShmSize int64 // Total shm memory usage + Sysctls map[string]string `json:",omitempty"` // List of Namespaced sysctls used for the container + Runtime string `json:",omitempty"` // Runtime to use with this container + + // Applicable to Windows + ConsoleSize [2]uint // Initial console size (height,width) + Isolation Isolation // Isolation technology of the container (eg default, hyperv) + + // Contains container's resources (cgroups, ulimits) + Resources + + // Mounts specs used by the container + Mounts []mount.Mount `json:",omitempty"` + + // Run a custom init inside the container, if null, use the daemon's configured settings + Init *bool `json:",omitempty"` + + // Custom init path + InitPath string `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go b/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go new file mode 100644 index 00000000..9fb79bed --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go @@ -0,0 +1,81 @@ +// +build !windows + +package container + +import "strings" + +// IsValid indicates if an isolation technology is valid +func (i Isolation) IsValid() bool { + return i.IsDefault() +} + +// IsPrivate indicates whether container uses its private network stack. +func (n NetworkMode) IsPrivate() bool { + return !(n.IsHost() || n.IsContainer()) +} + +// IsDefault indicates whether container uses the default network stack. +func (n NetworkMode) IsDefault() bool { + return n == "default" +} + +// NetworkName returns the name of the network stack. +func (n NetworkMode) NetworkName() string { + if n.IsBridge() { + return "bridge" + } else if n.IsHost() { + return "host" + } else if n.IsContainer() { + return "container" + } else if n.IsNone() { + return "none" + } else if n.IsDefault() { + return "default" + } else if n.IsUserDefined() { + return n.UserDefined() + } + return "" +} + +// IsBridge indicates whether container uses the bridge network stack +func (n NetworkMode) IsBridge() bool { + return n == "bridge" +} + +// IsHost indicates whether container uses the host network stack. +func (n NetworkMode) IsHost() bool { + return n == "host" +} + +// IsContainer indicates whether container uses a container network stack. +func (n NetworkMode) IsContainer() bool { + parts := strings.SplitN(string(n), ":", 2) + return len(parts) > 1 && parts[0] == "container" +} + +// IsNone indicates whether container isn't using a network stack. +func (n NetworkMode) IsNone() bool { + return n == "none" +} + +// ConnectedContainer is the id of the container which network this container is connected to. +func (n NetworkMode) ConnectedContainer() string { + parts := strings.SplitN(string(n), ":", 2) + if len(parts) > 1 { + return parts[1] + } + return "" +} + +// IsUserDefined indicates user-created network +func (n NetworkMode) IsUserDefined() bool { + return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer() +} + +//UserDefined indicates user-created network +func (n NetworkMode) UserDefined() string { + if n.IsUserDefined() { + return string(n) + } + return "" +} diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go b/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go new file mode 100644 index 00000000..0ee332ba --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go @@ -0,0 +1,87 @@ +package container + +import ( + "strings" +) + +// IsDefault indicates whether container uses the default network stack. +func (n NetworkMode) IsDefault() bool { + return n == "default" +} + +// IsNone indicates whether container isn't using a network stack. +func (n NetworkMode) IsNone() bool { + return n == "none" +} + +// IsContainer indicates whether container uses a container network stack. +// Returns false as windows doesn't support this mode +func (n NetworkMode) IsContainer() bool { + return false +} + +// IsBridge indicates whether container uses the bridge network stack +// in windows it is given the name NAT +func (n NetworkMode) IsBridge() bool { + return n == "nat" +} + +// IsHost indicates whether container uses the host network stack. +// returns false as this is not supported by windows +func (n NetworkMode) IsHost() bool { + return false +} + +// IsPrivate indicates whether container uses its private network stack. +func (n NetworkMode) IsPrivate() bool { + return !(n.IsHost() || n.IsContainer()) +} + +// ConnectedContainer is the id of the container which network this container is connected to. +// Returns blank string on windows +func (n NetworkMode) ConnectedContainer() string { + return "" +} + +// IsUserDefined indicates user-created network +func (n NetworkMode) IsUserDefined() bool { + return !n.IsDefault() && !n.IsNone() && !n.IsBridge() +} + +// IsHyperV indicates the use of a Hyper-V partition for isolation +func (i Isolation) IsHyperV() bool { + return strings.ToLower(string(i)) == "hyperv" +} + +// IsProcess indicates the use of process isolation +func (i Isolation) IsProcess() bool { + return strings.ToLower(string(i)) == "process" +} + +// IsValid indicates if an isolation technology is valid +func (i Isolation) IsValid() bool { + return i.IsDefault() || i.IsHyperV() || i.IsProcess() +} + +// NetworkName returns the name of the network stack. +func (n NetworkMode) NetworkName() string { + if n.IsDefault() { + return "default" + } else if n.IsBridge() { + return "nat" + } else if n.IsNone() { + return "none" + } else if n.IsUserDefined() { + return n.UserDefined() + } + + return "" +} + +//UserDefined indicates user-created network +func (n NetworkMode) UserDefined() string { + if n.IsUserDefined() { + return string(n) + } + return "" +} diff --git a/vendor/github.com/docker/docker/api/types/error_response.go b/vendor/github.com/docker/docker/api/types/error_response.go new file mode 100644 index 00000000..dc942d9d --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/error_response.go @@ -0,0 +1,13 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// ErrorResponse Represents an error. +// swagger:model ErrorResponse +type ErrorResponse struct { + + // The error message. + // Required: true + Message string `json:"message"` +} diff --git a/vendor/github.com/docker/docker/api/types/events/events.go b/vendor/github.com/docker/docker/api/types/events/events.go new file mode 100644 index 00000000..7129a65a --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/events/events.go @@ -0,0 +1,42 @@ +package events + +const ( + // ContainerEventType is the event type that containers generate + ContainerEventType = "container" + // DaemonEventType is the event type that daemon generate + DaemonEventType = "daemon" + // ImageEventType is the event type that images generate + ImageEventType = "image" + // NetworkEventType is the event type that networks generate + NetworkEventType = "network" + // PluginEventType is the event type that plugins generate + PluginEventType = "plugin" + // VolumeEventType is the event type that volumes generate + VolumeEventType = "volume" +) + +// Actor describes something that generates events, +// like a container, or a network, or a volume. +// It has a defined name and a set or attributes. +// The container attributes are its labels, other actors +// can generate these attributes from other properties. +type Actor struct { + ID string + Attributes map[string]string +} + +// Message represents the information an event contains +type Message struct { + // Deprecated information from JSONMessage. + // With data only in container events. + Status string `json:"status,omitempty"` + ID string `json:"id,omitempty"` + From string `json:"from,omitempty"` + + Type string + Action string + Actor Actor + + Time int64 `json:"time,omitempty"` + TimeNano int64 `json:"timeNano,omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/filters/parse.go b/vendor/github.com/docker/docker/api/types/filters/parse.go new file mode 100644 index 00000000..e01a41de --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/filters/parse.go @@ -0,0 +1,310 @@ +// Package filters provides helper function to parse and handle command line +// filter, used for example in docker ps or docker images commands. +package filters + +import ( + "encoding/json" + "errors" + "fmt" + "regexp" + "strings" + + "github.com/docker/docker/api/types/versions" +) + +// Args stores filter arguments as map key:{map key: bool}. +// It contains an aggregation of the map of arguments (which are in the form +// of -f 'key=value') based on the key, and stores values for the same key +// in a map with string keys and boolean values. +// e.g given -f 'label=label1=1' -f 'label=label2=2' -f 'image.name=ubuntu' +// the args will be {"image.name":{"ubuntu":true},"label":{"label1=1":true,"label2=2":true}} +type Args struct { + fields map[string]map[string]bool +} + +// NewArgs initializes a new Args struct. +func NewArgs() Args { + return Args{fields: map[string]map[string]bool{}} +} + +// ParseFlag parses the argument to the filter flag. Like +// +// `docker ps -f 'created=today' -f 'image.name=ubuntu*'` +// +// If prev map is provided, then it is appended to, and returned. By default a new +// map is created. +func ParseFlag(arg string, prev Args) (Args, error) { + filters := prev + if len(arg) == 0 { + return filters, nil + } + + if !strings.Contains(arg, "=") { + return filters, ErrBadFormat + } + + f := strings.SplitN(arg, "=", 2) + + name := strings.ToLower(strings.TrimSpace(f[0])) + value := strings.TrimSpace(f[1]) + + filters.Add(name, value) + + return filters, nil +} + +// ErrBadFormat is an error returned in case of bad format for a filter. +var ErrBadFormat = errors.New("bad format of filter (expected name=value)") + +// ToParam packs the Args into a string for easy transport from client to server. +func ToParam(a Args) (string, error) { + // this way we don't URL encode {}, just empty space + if a.Len() == 0 { + return "", nil + } + + buf, err := json.Marshal(a.fields) + if err != nil { + return "", err + } + return string(buf), nil +} + +// ToParamWithVersion packs the Args into a string for easy transport from client to server. +// The generated string will depend on the specified version (corresponding to the API version). +func ToParamWithVersion(version string, a Args) (string, error) { + // this way we don't URL encode {}, just empty space + if a.Len() == 0 { + return "", nil + } + + // for daemons older than v1.10, filter must be of the form map[string][]string + buf := []byte{} + err := errors.New("") + if version != "" && versions.LessThan(version, "1.22") { + buf, err = json.Marshal(convertArgsToSlice(a.fields)) + } else { + buf, err = json.Marshal(a.fields) + } + if err != nil { + return "", err + } + return string(buf), nil +} + +// FromParam unpacks the filter Args. +func FromParam(p string) (Args, error) { + if len(p) == 0 { + return NewArgs(), nil + } + + r := strings.NewReader(p) + d := json.NewDecoder(r) + + m := map[string]map[string]bool{} + if err := d.Decode(&m); err != nil { + r.Seek(0, 0) + + // Allow parsing old arguments in slice format. + // Because other libraries might be sending them in this format. + deprecated := map[string][]string{} + if deprecatedErr := d.Decode(&deprecated); deprecatedErr == nil { + m = deprecatedArgs(deprecated) + } else { + return NewArgs(), err + } + } + return Args{m}, nil +} + +// Get returns the list of values associates with a field. +// It returns a slice of strings to keep backwards compatibility with old code. +func (filters Args) Get(field string) []string { + values := filters.fields[field] + if values == nil { + return make([]string, 0) + } + slice := make([]string, 0, len(values)) + for key := range values { + slice = append(slice, key) + } + return slice +} + +// Add adds a new value to a filter field. +func (filters Args) Add(name, value string) { + if _, ok := filters.fields[name]; ok { + filters.fields[name][value] = true + } else { + filters.fields[name] = map[string]bool{value: true} + } +} + +// Del removes a value from a filter field. +func (filters Args) Del(name, value string) { + if _, ok := filters.fields[name]; ok { + delete(filters.fields[name], value) + if len(filters.fields[name]) == 0 { + delete(filters.fields, name) + } + } +} + +// Len returns the number of fields in the arguments. +func (filters Args) Len() int { + return len(filters.fields) +} + +// MatchKVList returns true if the values for the specified field matches the ones +// from the sources. +// e.g. given Args are {'label': {'label1=1','label2=1'}, 'image.name', {'ubuntu'}}, +// field is 'label' and sources are {'label1': '1', 'label2': '2'} +// it returns true. +func (filters Args) MatchKVList(field string, sources map[string]string) bool { + fieldValues := filters.fields[field] + + //do not filter if there is no filter set or cannot determine filter + if len(fieldValues) == 0 { + return true + } + + if len(sources) == 0 { + return false + } + + for name2match := range fieldValues { + testKV := strings.SplitN(name2match, "=", 2) + + v, ok := sources[testKV[0]] + if !ok { + return false + } + if len(testKV) == 2 && testKV[1] != v { + return false + } + } + + return true +} + +// Match returns true if the values for the specified field matches the source string +// e.g. given Args are {'label': {'label1=1','label2=1'}, 'image.name', {'ubuntu'}}, +// field is 'image.name' and source is 'ubuntu' +// it returns true. +func (filters Args) Match(field, source string) bool { + if filters.ExactMatch(field, source) { + return true + } + + fieldValues := filters.fields[field] + for name2match := range fieldValues { + match, err := regexp.MatchString(name2match, source) + if err != nil { + continue + } + if match { + return true + } + } + return false +} + +// ExactMatch returns true if the source matches exactly one of the filters. +func (filters Args) ExactMatch(field, source string) bool { + fieldValues, ok := filters.fields[field] + //do not filter if there is no filter set or cannot determine filter + if !ok || len(fieldValues) == 0 { + return true + } + + // try to match full name value to avoid O(N) regular expression matching + return fieldValues[source] +} + +// UniqueExactMatch returns true if there is only one filter and the source matches exactly this one. +func (filters Args) UniqueExactMatch(field, source string) bool { + fieldValues := filters.fields[field] + //do not filter if there is no filter set or cannot determine filter + if len(fieldValues) == 0 { + return true + } + if len(filters.fields[field]) != 1 { + return false + } + + // try to match full name value to avoid O(N) regular expression matching + return fieldValues[source] +} + +// FuzzyMatch returns true if the source matches exactly one of the filters, +// or the source has one of the filters as a prefix. +func (filters Args) FuzzyMatch(field, source string) bool { + if filters.ExactMatch(field, source) { + return true + } + + fieldValues := filters.fields[field] + for prefix := range fieldValues { + if strings.HasPrefix(source, prefix) { + return true + } + } + return false +} + +// Include returns true if the name of the field to filter is in the filters. +func (filters Args) Include(field string) bool { + _, ok := filters.fields[field] + return ok +} + +// Validate ensures that all the fields in the filter are valid. +// It returns an error as soon as it finds an invalid field. +func (filters Args) Validate(accepted map[string]bool) error { + for name := range filters.fields { + if !accepted[name] { + return fmt.Errorf("Invalid filter '%s'", name) + } + } + return nil +} + +// WalkValues iterates over the list of filtered values for a field. +// It stops the iteration if it finds an error and it returns that error. +func (filters Args) WalkValues(field string, op func(value string) error) error { + if _, ok := filters.fields[field]; !ok { + return nil + } + for v := range filters.fields[field] { + if err := op(v); err != nil { + return err + } + } + return nil +} + +func deprecatedArgs(d map[string][]string) map[string]map[string]bool { + m := map[string]map[string]bool{} + for k, v := range d { + values := map[string]bool{} + for _, vv := range v { + values[vv] = true + } + m[k] = values + } + return m +} + +func convertArgsToSlice(f map[string]map[string]bool) map[string][]string { + m := map[string][]string{} + for k, v := range f { + values := []string{} + for kk := range v { + if v[kk] { + values = append(values, kk) + } + } + m[k] = values + } + return m +} diff --git a/vendor/github.com/docker/docker/api/types/id_response.go b/vendor/github.com/docker/docker/api/types/id_response.go new file mode 100644 index 00000000..7592d2f8 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/id_response.go @@ -0,0 +1,13 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// IDResponse Response to an API call that returns just an Id +// swagger:model IdResponse +type IDResponse struct { + + // The id of the newly created object. + // Required: true + ID string `json:"Id"` +} diff --git a/vendor/github.com/docker/docker/api/types/image_summary.go b/vendor/github.com/docker/docker/api/types/image_summary.go new file mode 100644 index 00000000..e145b3dc --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/image_summary.go @@ -0,0 +1,49 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// ImageSummary image summary +// swagger:model ImageSummary +type ImageSummary struct { + + // containers + // Required: true + Containers int64 `json:"Containers"` + + // created + // Required: true + Created int64 `json:"Created"` + + // Id + // Required: true + ID string `json:"Id"` + + // labels + // Required: true + Labels map[string]string `json:"Labels"` + + // parent Id + // Required: true + ParentID string `json:"ParentId"` + + // repo digests + // Required: true + RepoDigests []string `json:"RepoDigests"` + + // repo tags + // Required: true + RepoTags []string `json:"RepoTags"` + + // shared size + // Required: true + SharedSize int64 `json:"SharedSize"` + + // size + // Required: true + Size int64 `json:"Size"` + + // virtual size + // Required: true + VirtualSize int64 `json:"VirtualSize"` +} diff --git a/vendor/github.com/docker/docker/api/types/mount/mount.go b/vendor/github.com/docker/docker/api/types/mount/mount.go new file mode 100644 index 00000000..31f2365b --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/mount/mount.go @@ -0,0 +1,113 @@ +package mount + +import ( + "os" +) + +// Type represents the type of a mount. +type Type string + +// Type constants +const ( + // TypeBind is the type for mounting host dir + TypeBind Type = "bind" + // TypeVolume is the type for remote storage volumes + TypeVolume Type = "volume" + // TypeTmpfs is the type for mounting tmpfs + TypeTmpfs Type = "tmpfs" +) + +// Mount represents a mount (volume). +type Mount struct { + Type Type `json:",omitempty"` + // Source specifies the name of the mount. Depending on mount type, this + // may be a volume name or a host path, or even ignored. + // Source is not supported for tmpfs (must be an empty value) + Source string `json:",omitempty"` + Target string `json:",omitempty"` + ReadOnly bool `json:",omitempty"` + + BindOptions *BindOptions `json:",omitempty"` + VolumeOptions *VolumeOptions `json:",omitempty"` + TmpfsOptions *TmpfsOptions `json:",omitempty"` +} + +// Propagation represents the propagation of a mount. +type Propagation string + +const ( + // PropagationRPrivate RPRIVATE + PropagationRPrivate Propagation = "rprivate" + // PropagationPrivate PRIVATE + PropagationPrivate Propagation = "private" + // PropagationRShared RSHARED + PropagationRShared Propagation = "rshared" + // PropagationShared SHARED + PropagationShared Propagation = "shared" + // PropagationRSlave RSLAVE + PropagationRSlave Propagation = "rslave" + // PropagationSlave SLAVE + PropagationSlave Propagation = "slave" +) + +// Propagations is the list of all valid mount propagations +var Propagations = []Propagation{ + PropagationRPrivate, + PropagationPrivate, + PropagationRShared, + PropagationShared, + PropagationRSlave, + PropagationSlave, +} + +// BindOptions defines options specific to mounts of type "bind". +type BindOptions struct { + Propagation Propagation `json:",omitempty"` +} + +// VolumeOptions represents the options for a mount of type volume. +type VolumeOptions struct { + NoCopy bool `json:",omitempty"` + Labels map[string]string `json:",omitempty"` + DriverConfig *Driver `json:",omitempty"` +} + +// Driver represents a volume driver. +type Driver struct { + Name string `json:",omitempty"` + Options map[string]string `json:",omitempty"` +} + +// TmpfsOptions defines options specific to mounts of type "tmpfs". +type TmpfsOptions struct { + // Size sets the size of the tmpfs, in bytes. + // + // This will be converted to an operating system specific value + // depending on the host. For example, on linux, it will be convered to + // use a 'k', 'm' or 'g' syntax. BSD, though not widely supported with + // docker, uses a straight byte value. + // + // Percentages are not supported. + SizeBytes int64 `json:",omitempty"` + // Mode of the tmpfs upon creation + Mode os.FileMode `json:",omitempty"` + + // TODO(stevvooe): There are several more tmpfs flags, specified in the + // daemon, that are accepted. Only the most basic are added for now. + // + // From docker/docker/pkg/mount/flags.go: + // + // var validFlags = map[string]bool{ + // "": true, + // "size": true, X + // "mode": true, X + // "uid": true, + // "gid": true, + // "nr_inodes": true, + // "nr_blocks": true, + // "mpol": true, + // } + // + // Some of these may be straightforward to add, but others, such as + // uid/gid have implications in a clustered system. +} diff --git a/vendor/github.com/docker/docker/api/types/network/network.go b/vendor/github.com/docker/docker/api/types/network/network.go new file mode 100644 index 00000000..832b3edb --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/network/network.go @@ -0,0 +1,59 @@ +package network + +// Address represents an IP address +type Address struct { + Addr string + PrefixLen int +} + +// IPAM represents IP Address Management +type IPAM struct { + Driver string + Options map[string]string //Per network IPAM driver options + Config []IPAMConfig +} + +// IPAMConfig represents IPAM configurations +type IPAMConfig struct { + Subnet string `json:",omitempty"` + IPRange string `json:",omitempty"` + Gateway string `json:",omitempty"` + AuxAddress map[string]string `json:"AuxiliaryAddresses,omitempty"` +} + +// EndpointIPAMConfig represents IPAM configurations for the endpoint +type EndpointIPAMConfig struct { + IPv4Address string `json:",omitempty"` + IPv6Address string `json:",omitempty"` + LinkLocalIPs []string `json:",omitempty"` +} + +// PeerInfo represents one peer of a overlay network +type PeerInfo struct { + Name string + IP string +} + +// EndpointSettings stores the network endpoint details +type EndpointSettings struct { + // Configurations + IPAMConfig *EndpointIPAMConfig + Links []string + Aliases []string + // Operational data + NetworkID string + EndpointID string + Gateway string + IPAddress string + IPPrefixLen int + IPv6Gateway string + GlobalIPv6Address string + GlobalIPv6PrefixLen int + MacAddress string +} + +// NetworkingConfig represents the container's networking configuration for each of its interfaces +// Carries the networking configs specified in the `docker run` and `docker network connect` commands +type NetworkingConfig struct { + EndpointsConfig map[string]*EndpointSettings // Endpoint configs for each connecting network +} diff --git a/vendor/github.com/docker/docker/api/types/plugin.go b/vendor/github.com/docker/docker/api/types/plugin.go new file mode 100644 index 00000000..6cc7a23b --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/plugin.go @@ -0,0 +1,189 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// Plugin A plugin for the Engine API +// swagger:model Plugin +type Plugin struct { + + // config + // Required: true + Config PluginConfig `json:"Config"` + + // True when the plugin is running. False when the plugin is not running, only installed. + // Required: true + Enabled bool `json:"Enabled"` + + // Id + ID string `json:"Id,omitempty"` + + // name + // Required: true + Name string `json:"Name"` + + // plugin remote reference used to push/pull the plugin + PluginReference string `json:"PluginReference,omitempty"` + + // settings + // Required: true + Settings PluginSettings `json:"Settings"` +} + +// PluginConfig The config of a plugin. +// swagger:model PluginConfig +type PluginConfig struct { + + // args + // Required: true + Args PluginConfigArgs `json:"Args"` + + // description + // Required: true + Description string `json:"Description"` + + // documentation + // Required: true + Documentation string `json:"Documentation"` + + // entrypoint + // Required: true + Entrypoint []string `json:"Entrypoint"` + + // env + // Required: true + Env []PluginEnv `json:"Env"` + + // interface + // Required: true + Interface PluginConfigInterface `json:"Interface"` + + // linux + // Required: true + Linux PluginConfigLinux `json:"Linux"` + + // mounts + // Required: true + Mounts []PluginMount `json:"Mounts"` + + // network + // Required: true + Network PluginConfigNetwork `json:"Network"` + + // propagated mount + // Required: true + PropagatedMount string `json:"PropagatedMount"` + + // user + User PluginConfigUser `json:"User,omitempty"` + + // work dir + // Required: true + WorkDir string `json:"WorkDir"` + + // rootfs + Rootfs *PluginConfigRootfs `json:"rootfs,omitempty"` +} + +// PluginConfigArgs plugin config args +// swagger:model PluginConfigArgs +type PluginConfigArgs struct { + + // description + // Required: true + Description string `json:"Description"` + + // name + // Required: true + Name string `json:"Name"` + + // settable + // Required: true + Settable []string `json:"Settable"` + + // value + // Required: true + Value []string `json:"Value"` +} + +// PluginConfigInterface The interface between Docker and the plugin +// swagger:model PluginConfigInterface +type PluginConfigInterface struct { + + // socket + // Required: true + Socket string `json:"Socket"` + + // types + // Required: true + Types []PluginInterfaceType `json:"Types"` +} + +// PluginConfigLinux plugin config linux +// swagger:model PluginConfigLinux +type PluginConfigLinux struct { + + // allow all devices + // Required: true + AllowAllDevices bool `json:"AllowAllDevices"` + + // capabilities + // Required: true + Capabilities []string `json:"Capabilities"` + + // devices + // Required: true + Devices []PluginDevice `json:"Devices"` +} + +// PluginConfigNetwork plugin config network +// swagger:model PluginConfigNetwork +type PluginConfigNetwork struct { + + // type + // Required: true + Type string `json:"Type"` +} + +// PluginConfigRootfs plugin config rootfs +// swagger:model PluginConfigRootfs +type PluginConfigRootfs struct { + + // diff ids + DiffIds []string `json:"diff_ids"` + + // type + Type string `json:"type,omitempty"` +} + +// PluginConfigUser plugin config user +// swagger:model PluginConfigUser +type PluginConfigUser struct { + + // g ID + GID uint32 `json:"GID,omitempty"` + + // UID + UID uint32 `json:"UID,omitempty"` +} + +// PluginSettings Settings that can be modified by users. +// swagger:model PluginSettings +type PluginSettings struct { + + // args + // Required: true + Args []string `json:"Args"` + + // devices + // Required: true + Devices []PluginDevice `json:"Devices"` + + // env + // Required: true + Env []string `json:"Env"` + + // mounts + // Required: true + Mounts []PluginMount `json:"Mounts"` +} diff --git a/vendor/github.com/docker/docker/api/types/plugin_device.go b/vendor/github.com/docker/docker/api/types/plugin_device.go new file mode 100644 index 00000000..56990106 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/plugin_device.go @@ -0,0 +1,25 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// PluginDevice plugin device +// swagger:model PluginDevice +type PluginDevice struct { + + // description + // Required: true + Description string `json:"Description"` + + // name + // Required: true + Name string `json:"Name"` + + // path + // Required: true + Path *string `json:"Path"` + + // settable + // Required: true + Settable []string `json:"Settable"` +} diff --git a/vendor/github.com/docker/docker/api/types/plugin_env.go b/vendor/github.com/docker/docker/api/types/plugin_env.go new file mode 100644 index 00000000..32962dc2 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/plugin_env.go @@ -0,0 +1,25 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// PluginEnv plugin env +// swagger:model PluginEnv +type PluginEnv struct { + + // description + // Required: true + Description string `json:"Description"` + + // name + // Required: true + Name string `json:"Name"` + + // settable + // Required: true + Settable []string `json:"Settable"` + + // value + // Required: true + Value *string `json:"Value"` +} diff --git a/vendor/github.com/docker/docker/api/types/plugin_interface_type.go b/vendor/github.com/docker/docker/api/types/plugin_interface_type.go new file mode 100644 index 00000000..c82f204e --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/plugin_interface_type.go @@ -0,0 +1,21 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// PluginInterfaceType plugin interface type +// swagger:model PluginInterfaceType +type PluginInterfaceType struct { + + // capability + // Required: true + Capability string `json:"Capability"` + + // prefix + // Required: true + Prefix string `json:"Prefix"` + + // version + // Required: true + Version string `json:"Version"` +} diff --git a/vendor/github.com/docker/docker/api/types/plugin_mount.go b/vendor/github.com/docker/docker/api/types/plugin_mount.go new file mode 100644 index 00000000..5c031cf8 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/plugin_mount.go @@ -0,0 +1,37 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// PluginMount plugin mount +// swagger:model PluginMount +type PluginMount struct { + + // description + // Required: true + Description string `json:"Description"` + + // destination + // Required: true + Destination string `json:"Destination"` + + // name + // Required: true + Name string `json:"Name"` + + // options + // Required: true + Options []string `json:"Options"` + + // settable + // Required: true + Settable []string `json:"Settable"` + + // source + // Required: true + Source *string `json:"Source"` + + // type + // Required: true + Type string `json:"Type"` +} diff --git a/vendor/github.com/docker/docker/api/types/plugin_responses.go b/vendor/github.com/docker/docker/api/types/plugin_responses.go new file mode 100644 index 00000000..d6f75531 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/plugin_responses.go @@ -0,0 +1,64 @@ +package types + +import ( + "encoding/json" + "fmt" +) + +// PluginsListResponse contains the response for the Engine API +type PluginsListResponse []*Plugin + +const ( + authzDriver = "AuthzDriver" + graphDriver = "GraphDriver" + ipamDriver = "IpamDriver" + networkDriver = "NetworkDriver" + volumeDriver = "VolumeDriver" +) + +// UnmarshalJSON implements json.Unmarshaler for PluginInterfaceType +func (t *PluginInterfaceType) UnmarshalJSON(p []byte) error { + versionIndex := len(p) + prefixIndex := 0 + if len(p) < 2 || p[0] != '"' || p[len(p)-1] != '"' { + return fmt.Errorf("%q is not a plugin interface type", p) + } + p = p[1 : len(p)-1] +loop: + for i, b := range p { + switch b { + case '.': + prefixIndex = i + case '/': + versionIndex = i + break loop + } + } + t.Prefix = string(p[:prefixIndex]) + t.Capability = string(p[prefixIndex+1 : versionIndex]) + if versionIndex < len(p) { + t.Version = string(p[versionIndex+1:]) + } + return nil +} + +// MarshalJSON implements json.Marshaler for PluginInterfaceType +func (t *PluginInterfaceType) MarshalJSON() ([]byte, error) { + return json.Marshal(t.String()) +} + +// String implements fmt.Stringer for PluginInterfaceType +func (t PluginInterfaceType) String() string { + return fmt.Sprintf("%s.%s/%s", t.Prefix, t.Capability, t.Version) +} + +// PluginPrivilege describes a permission the user has to accept +// upon installing a plugin. +type PluginPrivilege struct { + Name string + Description string + Value []string +} + +// PluginPrivileges is a list of PluginPrivilege +type PluginPrivileges []PluginPrivilege diff --git a/vendor/github.com/docker/docker/api/types/port.go b/vendor/github.com/docker/docker/api/types/port.go new file mode 100644 index 00000000..ad52d46d --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/port.go @@ -0,0 +1,23 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// Port An open port on a container +// swagger:model Port +type Port struct { + + // IP + IP string `json:"IP,omitempty"` + + // Port on the container + // Required: true + PrivatePort uint16 `json:"PrivatePort"` + + // Port exposed on the host + PublicPort uint16 `json:"PublicPort,omitempty"` + + // type + // Required: true + Type string `json:"Type"` +} diff --git a/vendor/github.com/docker/docker/api/types/reference/image_reference.go b/vendor/github.com/docker/docker/api/types/reference/image_reference.go new file mode 100644 index 00000000..be9cf8eb --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/reference/image_reference.go @@ -0,0 +1,34 @@ +package reference + +import ( + distreference "github.com/docker/distribution/reference" +) + +// Parse parses the given references and returns the repository and +// tag (if present) from it. If there is an error during parsing, it will +// return an error. +func Parse(ref string) (string, string, error) { + distributionRef, err := distreference.ParseNamed(ref) + if err != nil { + return "", "", err + } + + tag := GetTagFromNamedRef(distributionRef) + return distributionRef.Name(), tag, nil +} + +// GetTagFromNamedRef returns a tag from the specified reference. +// This function is necessary as long as the docker "server" api makes the distinction between repository +// and tags. +func GetTagFromNamedRef(ref distreference.Named) string { + var tag string + switch x := ref.(type) { + case distreference.Digested: + tag = x.Digest().String() + case distreference.NamedTagged: + tag = x.Tag() + default: + tag = "latest" + } + return tag +} diff --git a/vendor/github.com/docker/docker/api/types/registry/authenticate.go b/vendor/github.com/docker/docker/api/types/registry/authenticate.go new file mode 100644 index 00000000..5e37d19b --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/registry/authenticate.go @@ -0,0 +1,21 @@ +package registry + +// ---------------------------------------------------------------------------- +// DO NOT EDIT THIS FILE +// This file was generated by `swagger generate operation` +// +// See hack/swagger-gen.sh +// ---------------------------------------------------------------------------- + +// AuthenticateOKBody authenticate o k body +// swagger:model AuthenticateOKBody +type AuthenticateOKBody struct { + + // An opaque token used to authenticate a user after a successful login + // Required: true + IdentityToken string `json:"IdentityToken"` + + // The status of the authentication + // Required: true + Status string `json:"Status"` +} diff --git a/vendor/github.com/docker/docker/api/types/registry/registry.go b/vendor/github.com/docker/docker/api/types/registry/registry.go new file mode 100644 index 00000000..28fafab9 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/registry/registry.go @@ -0,0 +1,104 @@ +package registry + +import ( + "encoding/json" + "net" +) + +// ServiceConfig stores daemon registry services configuration. +type ServiceConfig struct { + InsecureRegistryCIDRs []*NetIPNet `json:"InsecureRegistryCIDRs"` + IndexConfigs map[string]*IndexInfo `json:"IndexConfigs"` + Mirrors []string +} + +// NetIPNet is the net.IPNet type, which can be marshalled and +// unmarshalled to JSON +type NetIPNet net.IPNet + +// String returns the CIDR notation of ipnet +func (ipnet *NetIPNet) String() string { + return (*net.IPNet)(ipnet).String() +} + +// MarshalJSON returns the JSON representation of the IPNet +func (ipnet *NetIPNet) MarshalJSON() ([]byte, error) { + return json.Marshal((*net.IPNet)(ipnet).String()) +} + +// UnmarshalJSON sets the IPNet from a byte array of JSON +func (ipnet *NetIPNet) UnmarshalJSON(b []byte) (err error) { + var ipnetStr string + if err = json.Unmarshal(b, &ipnetStr); err == nil { + var cidr *net.IPNet + if _, cidr, err = net.ParseCIDR(ipnetStr); err == nil { + *ipnet = NetIPNet(*cidr) + } + } + return +} + +// IndexInfo contains information about a registry +// +// RepositoryInfo Examples: +// { +// "Index" : { +// "Name" : "docker.io", +// "Mirrors" : ["https://registry-2.docker.io/v1/", "https://registry-3.docker.io/v1/"], +// "Secure" : true, +// "Official" : true, +// }, +// "RemoteName" : "library/debian", +// "LocalName" : "debian", +// "CanonicalName" : "docker.io/debian" +// "Official" : true, +// } +// +// { +// "Index" : { +// "Name" : "127.0.0.1:5000", +// "Mirrors" : [], +// "Secure" : false, +// "Official" : false, +// }, +// "RemoteName" : "user/repo", +// "LocalName" : "127.0.0.1:5000/user/repo", +// "CanonicalName" : "127.0.0.1:5000/user/repo", +// "Official" : false, +// } +type IndexInfo struct { + // Name is the name of the registry, such as "docker.io" + Name string + // Mirrors is a list of mirrors, expressed as URIs + Mirrors []string + // Secure is set to false if the registry is part of the list of + // insecure registries. Insecure registries accept HTTP and/or accept + // HTTPS with certificates from unknown CAs. + Secure bool + // Official indicates whether this is an official registry + Official bool +} + +// SearchResult describes a search result returned from a registry +type SearchResult struct { + // StarCount indicates the number of stars this repository has + StarCount int `json:"star_count"` + // IsOfficial is true if the result is from an official repository. + IsOfficial bool `json:"is_official"` + // Name is the name of the repository + Name string `json:"name"` + // IsAutomated indicates whether the result is automated + IsAutomated bool `json:"is_automated"` + // Description is a textual description of the repository + Description string `json:"description"` +} + +// SearchResults lists a collection search results returned from a registry +type SearchResults struct { + // Query contains the query string that generated the search results + Query string `json:"query"` + // NumResults indicates the number of results the query returned + NumResults int `json:"num_results"` + // Results is a slice containing the actual results for the search + Results []SearchResult `json:"results"` +} diff --git a/vendor/github.com/docker/docker/api/types/seccomp.go b/vendor/github.com/docker/docker/api/types/seccomp.go new file mode 100644 index 00000000..4f02ef36 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/seccomp.go @@ -0,0 +1,93 @@ +package types + +// Seccomp represents the config for a seccomp profile for syscall restriction. +type Seccomp struct { + DefaultAction Action `json:"defaultAction"` + // Architectures is kept to maintain backward compatibility with the old + // seccomp profile. + Architectures []Arch `json:"architectures,omitempty"` + ArchMap []Architecture `json:"archMap,omitempty"` + Syscalls []*Syscall `json:"syscalls"` +} + +// Architecture is used to represent an specific architecture +// and its sub-architectures +type Architecture struct { + Arch Arch `json:"architecture"` + SubArches []Arch `json:"subArchitectures"` +} + +// Arch used for architectures +type Arch string + +// Additional architectures permitted to be used for system calls +// By default only the native architecture of the kernel is permitted +const ( + ArchX86 Arch = "SCMP_ARCH_X86" + ArchX86_64 Arch = "SCMP_ARCH_X86_64" + ArchX32 Arch = "SCMP_ARCH_X32" + ArchARM Arch = "SCMP_ARCH_ARM" + ArchAARCH64 Arch = "SCMP_ARCH_AARCH64" + ArchMIPS Arch = "SCMP_ARCH_MIPS" + ArchMIPS64 Arch = "SCMP_ARCH_MIPS64" + ArchMIPS64N32 Arch = "SCMP_ARCH_MIPS64N32" + ArchMIPSEL Arch = "SCMP_ARCH_MIPSEL" + ArchMIPSEL64 Arch = "SCMP_ARCH_MIPSEL64" + ArchMIPSEL64N32 Arch = "SCMP_ARCH_MIPSEL64N32" + ArchPPC Arch = "SCMP_ARCH_PPC" + ArchPPC64 Arch = "SCMP_ARCH_PPC64" + ArchPPC64LE Arch = "SCMP_ARCH_PPC64LE" + ArchS390 Arch = "SCMP_ARCH_S390" + ArchS390X Arch = "SCMP_ARCH_S390X" +) + +// Action taken upon Seccomp rule match +type Action string + +// Define actions for Seccomp rules +const ( + ActKill Action = "SCMP_ACT_KILL" + ActTrap Action = "SCMP_ACT_TRAP" + ActErrno Action = "SCMP_ACT_ERRNO" + ActTrace Action = "SCMP_ACT_TRACE" + ActAllow Action = "SCMP_ACT_ALLOW" +) + +// Operator used to match syscall arguments in Seccomp +type Operator string + +// Define operators for syscall arguments in Seccomp +const ( + OpNotEqual Operator = "SCMP_CMP_NE" + OpLessThan Operator = "SCMP_CMP_LT" + OpLessEqual Operator = "SCMP_CMP_LE" + OpEqualTo Operator = "SCMP_CMP_EQ" + OpGreaterEqual Operator = "SCMP_CMP_GE" + OpGreaterThan Operator = "SCMP_CMP_GT" + OpMaskedEqual Operator = "SCMP_CMP_MASKED_EQ" +) + +// Arg used for matching specific syscall arguments in Seccomp +type Arg struct { + Index uint `json:"index"` + Value uint64 `json:"value"` + ValueTwo uint64 `json:"valueTwo"` + Op Operator `json:"op"` +} + +// Filter is used to conditionally apply Seccomp rules +type Filter struct { + Caps []string `json:"caps,omitempty"` + Arches []string `json:"arches,omitempty"` +} + +// Syscall is used to match a group of syscalls in Seccomp +type Syscall struct { + Name string `json:"name,omitempty"` + Names []string `json:"names,omitempty"` + Action Action `json:"action"` + Args []*Arg `json:"args"` + Comment string `json:"comment"` + Includes Filter `json:"includes"` + Excludes Filter `json:"excludes"` +} diff --git a/vendor/github.com/docker/docker/api/types/service_update_response.go b/vendor/github.com/docker/docker/api/types/service_update_response.go new file mode 100644 index 00000000..74ea64b1 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/service_update_response.go @@ -0,0 +1,12 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// ServiceUpdateResponse service update response +// swagger:model ServiceUpdateResponse +type ServiceUpdateResponse struct { + + // Optional warning messages + Warnings []string `json:"Warnings"` +} diff --git a/vendor/github.com/docker/docker/api/types/stats.go b/vendor/github.com/docker/docker/api/types/stats.go new file mode 100644 index 00000000..9bf1928b --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/stats.go @@ -0,0 +1,178 @@ +// Package types is used for API stability in the types and response to the +// consumers of the API stats endpoint. +package types + +import "time" + +// ThrottlingData stores CPU throttling stats of one running container. +// Not used on Windows. +type ThrottlingData struct { + // Number of periods with throttling active + Periods uint64 `json:"periods"` + // Number of periods when the container hits its throttling limit. + ThrottledPeriods uint64 `json:"throttled_periods"` + // Aggregate time the container was throttled for in nanoseconds. + ThrottledTime uint64 `json:"throttled_time"` +} + +// CPUUsage stores All CPU stats aggregated since container inception. +type CPUUsage struct { + // Total CPU time consumed. + // Units: nanoseconds (Linux) + // Units: 100's of nanoseconds (Windows) + TotalUsage uint64 `json:"total_usage"` + + // Total CPU time consumed per core (Linux). Not used on Windows. + // Units: nanoseconds. + PercpuUsage []uint64 `json:"percpu_usage,omitempty"` + + // Time spent by tasks of the cgroup in kernel mode (Linux). + // Time spent by all container processes in kernel mode (Windows). + // Units: nanoseconds (Linux). + // Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers. + UsageInKernelmode uint64 `json:"usage_in_kernelmode"` + + // Time spent by tasks of the cgroup in user mode (Linux). + // Time spent by all container processes in user mode (Windows). + // Units: nanoseconds (Linux). + // Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers + UsageInUsermode uint64 `json:"usage_in_usermode"` +} + +// CPUStats aggregates and wraps all CPU related info of container +type CPUStats struct { + // CPU Usage. Linux and Windows. + CPUUsage CPUUsage `json:"cpu_usage"` + + // System Usage. Linux only. + SystemUsage uint64 `json:"system_cpu_usage,omitempty"` + + // Throttling Data. Linux only. + ThrottlingData ThrottlingData `json:"throttling_data,omitempty"` +} + +// MemoryStats aggregates all memory stats since container inception on Linux. +// Windows returns stats for commit and private working set only. +type MemoryStats struct { + // Linux Memory Stats + + // current res_counter usage for memory + Usage uint64 `json:"usage,omitempty"` + // maximum usage ever recorded. + MaxUsage uint64 `json:"max_usage,omitempty"` + // TODO(vishh): Export these as stronger types. + // all the stats exported via memory.stat. + Stats map[string]uint64 `json:"stats,omitempty"` + // number of times memory usage hits limits. + Failcnt uint64 `json:"failcnt,omitempty"` + Limit uint64 `json:"limit,omitempty"` + + // Windows Memory Stats + // See https://technet.microsoft.com/en-us/magazine/ff382715.aspx + + // committed bytes + Commit uint64 `json:"commitbytes,omitempty"` + // peak committed bytes + CommitPeak uint64 `json:"commitpeakbytes,omitempty"` + // private working set + PrivateWorkingSet uint64 `json:"privateworkingset,omitempty"` +} + +// BlkioStatEntry is one small entity to store a piece of Blkio stats +// Not used on Windows. +type BlkioStatEntry struct { + Major uint64 `json:"major"` + Minor uint64 `json:"minor"` + Op string `json:"op"` + Value uint64 `json:"value"` +} + +// BlkioStats stores All IO service stats for data read and write. +// This is a Linux specific structure as the differences between expressing +// block I/O on Windows and Linux are sufficiently significant to make +// little sense attempting to morph into a combined structure. +type BlkioStats struct { + // number of bytes transferred to and from the block device + IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"` + IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive"` + IoQueuedRecursive []BlkioStatEntry `json:"io_queue_recursive"` + IoServiceTimeRecursive []BlkioStatEntry `json:"io_service_time_recursive"` + IoWaitTimeRecursive []BlkioStatEntry `json:"io_wait_time_recursive"` + IoMergedRecursive []BlkioStatEntry `json:"io_merged_recursive"` + IoTimeRecursive []BlkioStatEntry `json:"io_time_recursive"` + SectorsRecursive []BlkioStatEntry `json:"sectors_recursive"` +} + +// StorageStats is the disk I/O stats for read/write on Windows. +type StorageStats struct { + ReadCountNormalized uint64 `json:"read_count_normalized,omitempty"` + ReadSizeBytes uint64 `json:"read_size_bytes,omitempty"` + WriteCountNormalized uint64 `json:"write_count_normalized,omitempty"` + WriteSizeBytes uint64 `json:"write_size_bytes,omitempty"` +} + +// NetworkStats aggregates the network stats of one container +type NetworkStats struct { + // Bytes received. Windows and Linux. + RxBytes uint64 `json:"rx_bytes"` + // Packets received. Windows and Linux. + RxPackets uint64 `json:"rx_packets"` + // Received errors. Not used on Windows. Note that we dont `omitempty` this + // field as it is expected in the >=v1.21 API stats structure. + RxErrors uint64 `json:"rx_errors"` + // Incoming packets dropped. Windows and Linux. + RxDropped uint64 `json:"rx_dropped"` + // Bytes sent. Windows and Linux. + TxBytes uint64 `json:"tx_bytes"` + // Packets sent. Windows and Linux. + TxPackets uint64 `json:"tx_packets"` + // Sent errors. Not used on Windows. Note that we dont `omitempty` this + // field as it is expected in the >=v1.21 API stats structure. + TxErrors uint64 `json:"tx_errors"` + // Outgoing packets dropped. Windows and Linux. + TxDropped uint64 `json:"tx_dropped"` + // Endpoint ID. Not used on Linux. + EndpointID string `json:"endpoint_id,omitempty"` + // Instance ID. Not used on Linux. + InstanceID string `json:"instance_id,omitempty"` +} + +// PidsStats contains the stats of a container's pids +type PidsStats struct { + // Current is the number of pids in the cgroup + Current uint64 `json:"current,omitempty"` + // Limit is the hard limit on the number of pids in the cgroup. + // A "Limit" of 0 means that there is no limit. + Limit uint64 `json:"limit,omitempty"` +} + +// Stats is Ultimate struct aggregating all types of stats of one container +type Stats struct { + // Common stats + Read time.Time `json:"read"` + PreRead time.Time `json:"preread"` + + // Linux specific stats, not populated on Windows. + PidsStats PidsStats `json:"pids_stats,omitempty"` + BlkioStats BlkioStats `json:"blkio_stats,omitempty"` + + // Windows specific stats, not populated on Linux. + NumProcs uint32 `json:"num_procs"` + StorageStats StorageStats `json:"storage_stats,omitempty"` + + // Shared stats + CPUStats CPUStats `json:"cpu_stats,omitempty"` + PreCPUStats CPUStats `json:"precpu_stats,omitempty"` // "Pre"="Previous" + MemoryStats MemoryStats `json:"memory_stats,omitempty"` +} + +// StatsJSON is newly used Networks +type StatsJSON struct { + Stats + + Name string `json:"name,omitempty"` + ID string `json:"id,omitempty"` + + // Networks request version >=1.21 + Networks map[string]NetworkStats `json:"networks,omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/strslice/strslice.go b/vendor/github.com/docker/docker/api/types/strslice/strslice.go new file mode 100644 index 00000000..bad493fb --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/strslice/strslice.go @@ -0,0 +1,30 @@ +package strslice + +import "encoding/json" + +// StrSlice represents a string or an array of strings. +// We need to override the json decoder to accept both options. +type StrSlice []string + +// UnmarshalJSON decodes the byte slice whether it's a string or an array of +// strings. This method is needed to implement json.Unmarshaler. +func (e *StrSlice) UnmarshalJSON(b []byte) error { + if len(b) == 0 { + // With no input, we preserve the existing value by returning nil and + // leaving the target alone. This allows defining default values for + // the type. + return nil + } + + p := make([]string, 0, 1) + if err := json.Unmarshal(b, &p); err != nil { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + p = append(p, s) + } + + *e = p + return nil +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/common.go b/vendor/github.com/docker/docker/api/types/swarm/common.go new file mode 100644 index 00000000..64a648ba --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/swarm/common.go @@ -0,0 +1,27 @@ +package swarm + +import "time" + +// Version represents the internal object version. +type Version struct { + Index uint64 `json:",omitempty"` +} + +// Meta is a base object inherited by most of the other once. +type Meta struct { + Version Version `json:",omitempty"` + CreatedAt time.Time `json:",omitempty"` + UpdatedAt time.Time `json:",omitempty"` +} + +// Annotations represents how to describe an object. +type Annotations struct { + Name string `json:",omitempty"` + Labels map[string]string `json:",omitempty"` +} + +// Driver represents a driver (network, logging). +type Driver struct { + Name string `json:",omitempty"` + Options map[string]string `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/container.go b/vendor/github.com/docker/docker/api/types/swarm/container.go new file mode 100644 index 00000000..4ab476cc --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/swarm/container.go @@ -0,0 +1,46 @@ +package swarm + +import ( + "time" + + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/mount" +) + +// DNSConfig specifies DNS related configurations in resolver configuration file (resolv.conf) +// Detailed documentation is available in: +// http://man7.org/linux/man-pages/man5/resolv.conf.5.html +// `nameserver`, `search`, `options` have been supported. +// TODO: `domain` is not supported yet. +type DNSConfig struct { + // Nameservers specifies the IP addresses of the name servers + Nameservers []string `json:",omitempty"` + // Search specifies the search list for host-name lookup + Search []string `json:",omitempty"` + // Options allows certain internal resolver variables to be modified + Options []string `json:",omitempty"` +} + +// ContainerSpec represents the spec of a container. +type ContainerSpec struct { + Image string `json:",omitempty"` + Labels map[string]string `json:",omitempty"` + Command []string `json:",omitempty"` + Args []string `json:",omitempty"` + Hostname string `json:",omitempty"` + Env []string `json:",omitempty"` + Dir string `json:",omitempty"` + User string `json:",omitempty"` + Groups []string `json:",omitempty"` + TTY bool `json:",omitempty"` + OpenStdin bool `json:",omitempty"` + Mounts []mount.Mount `json:",omitempty"` + StopGracePeriod *time.Duration `json:",omitempty"` + Healthcheck *container.HealthConfig `json:",omitempty"` + // The format of extra hosts on swarmkit is specified in: + // http://man7.org/linux/man-pages/man5/hosts.5.html + // IP_address canonical_hostname [aliases...] + Hosts []string `json:",omitempty"` + DNSConfig *DNSConfig `json:",omitempty"` + Secrets []*SecretReference `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/network.go b/vendor/github.com/docker/docker/api/types/swarm/network.go new file mode 100644 index 00000000..5a5e11bd --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/swarm/network.go @@ -0,0 +1,111 @@ +package swarm + +// Endpoint represents an endpoint. +type Endpoint struct { + Spec EndpointSpec `json:",omitempty"` + Ports []PortConfig `json:",omitempty"` + VirtualIPs []EndpointVirtualIP `json:",omitempty"` +} + +// EndpointSpec represents the spec of an endpoint. +type EndpointSpec struct { + Mode ResolutionMode `json:",omitempty"` + Ports []PortConfig `json:",omitempty"` +} + +// ResolutionMode represents a resolution mode. +type ResolutionMode string + +const ( + // ResolutionModeVIP VIP + ResolutionModeVIP ResolutionMode = "vip" + // ResolutionModeDNSRR DNSRR + ResolutionModeDNSRR ResolutionMode = "dnsrr" +) + +// PortConfig represents the config of a port. +type PortConfig struct { + Name string `json:",omitempty"` + Protocol PortConfigProtocol `json:",omitempty"` + // TargetPort is the port inside the container + TargetPort uint32 `json:",omitempty"` + // PublishedPort is the port on the swarm hosts + PublishedPort uint32 `json:",omitempty"` + // PublishMode is the mode in which port is published + PublishMode PortConfigPublishMode `json:",omitempty"` +} + +// PortConfigPublishMode represents the mode in which the port is to +// be published. +type PortConfigPublishMode string + +const ( + // PortConfigPublishModeIngress is used for ports published + // for ingress load balancing using routing mesh. + PortConfigPublishModeIngress PortConfigPublishMode = "ingress" + // PortConfigPublishModeHost is used for ports published + // for direct host level access on the host where the task is running. + PortConfigPublishModeHost PortConfigPublishMode = "host" +) + +// PortConfigProtocol represents the protocol of a port. +type PortConfigProtocol string + +const ( + // TODO(stevvooe): These should be used generally, not just for PortConfig. + + // PortConfigProtocolTCP TCP + PortConfigProtocolTCP PortConfigProtocol = "tcp" + // PortConfigProtocolUDP UDP + PortConfigProtocolUDP PortConfigProtocol = "udp" +) + +// EndpointVirtualIP represents the virtual ip of a port. +type EndpointVirtualIP struct { + NetworkID string `json:",omitempty"` + Addr string `json:",omitempty"` +} + +// Network represents a network. +type Network struct { + ID string + Meta + Spec NetworkSpec `json:",omitempty"` + DriverState Driver `json:",omitempty"` + IPAMOptions *IPAMOptions `json:",omitempty"` +} + +// NetworkSpec represents the spec of a network. +type NetworkSpec struct { + Annotations + DriverConfiguration *Driver `json:",omitempty"` + IPv6Enabled bool `json:",omitempty"` + Internal bool `json:",omitempty"` + Attachable bool `json:",omitempty"` + IPAMOptions *IPAMOptions `json:",omitempty"` +} + +// NetworkAttachmentConfig represents the configuration of a network attachment. +type NetworkAttachmentConfig struct { + Target string `json:",omitempty"` + Aliases []string `json:",omitempty"` +} + +// NetworkAttachment represents a network attachment. +type NetworkAttachment struct { + Network Network `json:",omitempty"` + Addresses []string `json:",omitempty"` +} + +// IPAMOptions represents ipam options. +type IPAMOptions struct { + Driver Driver `json:",omitempty"` + Configs []IPAMConfig `json:",omitempty"` +} + +// IPAMConfig represents ipam configuration. +type IPAMConfig struct { + Subnet string `json:",omitempty"` + Range string `json:",omitempty"` + Gateway string `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/node.go b/vendor/github.com/docker/docker/api/types/swarm/node.go new file mode 100644 index 00000000..379e17a7 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/swarm/node.go @@ -0,0 +1,114 @@ +package swarm + +// Node represents a node. +type Node struct { + ID string + Meta + // Spec defines the desired state of the node as specified by the user. + // The system will honor this and will *never* modify it. + Spec NodeSpec `json:",omitempty"` + // Description encapsulates the properties of the Node as reported by the + // agent. + Description NodeDescription `json:",omitempty"` + // Status provides the current status of the node, as seen by the manager. + Status NodeStatus `json:",omitempty"` + // ManagerStatus provides the current status of the node's manager + // component, if the node is a manager. + ManagerStatus *ManagerStatus `json:",omitempty"` +} + +// NodeSpec represents the spec of a node. +type NodeSpec struct { + Annotations + Role NodeRole `json:",omitempty"` + Availability NodeAvailability `json:",omitempty"` +} + +// NodeRole represents the role of a node. +type NodeRole string + +const ( + // NodeRoleWorker WORKER + NodeRoleWorker NodeRole = "worker" + // NodeRoleManager MANAGER + NodeRoleManager NodeRole = "manager" +) + +// NodeAvailability represents the availability of a node. +type NodeAvailability string + +const ( + // NodeAvailabilityActive ACTIVE + NodeAvailabilityActive NodeAvailability = "active" + // NodeAvailabilityPause PAUSE + NodeAvailabilityPause NodeAvailability = "pause" + // NodeAvailabilityDrain DRAIN + NodeAvailabilityDrain NodeAvailability = "drain" +) + +// NodeDescription represents the description of a node. +type NodeDescription struct { + Hostname string `json:",omitempty"` + Platform Platform `json:",omitempty"` + Resources Resources `json:",omitempty"` + Engine EngineDescription `json:",omitempty"` +} + +// Platform represents the platform (Arch/OS). +type Platform struct { + Architecture string `json:",omitempty"` + OS string `json:",omitempty"` +} + +// EngineDescription represents the description of an engine. +type EngineDescription struct { + EngineVersion string `json:",omitempty"` + Labels map[string]string `json:",omitempty"` + Plugins []PluginDescription `json:",omitempty"` +} + +// PluginDescription represents the description of an engine plugin. +type PluginDescription struct { + Type string `json:",omitempty"` + Name string `json:",omitempty"` +} + +// NodeStatus represents the status of a node. +type NodeStatus struct { + State NodeState `json:",omitempty"` + Message string `json:",omitempty"` + Addr string `json:",omitempty"` +} + +// Reachability represents the reachability of a node. +type Reachability string + +const ( + // ReachabilityUnknown UNKNOWN + ReachabilityUnknown Reachability = "unknown" + // ReachabilityUnreachable UNREACHABLE + ReachabilityUnreachable Reachability = "unreachable" + // ReachabilityReachable REACHABLE + ReachabilityReachable Reachability = "reachable" +) + +// ManagerStatus represents the status of a manager. +type ManagerStatus struct { + Leader bool `json:",omitempty"` + Reachability Reachability `json:",omitempty"` + Addr string `json:",omitempty"` +} + +// NodeState represents the state of a node. +type NodeState string + +const ( + // NodeStateUnknown UNKNOWN + NodeStateUnknown NodeState = "unknown" + // NodeStateDown DOWN + NodeStateDown NodeState = "down" + // NodeStateReady READY + NodeStateReady NodeState = "ready" + // NodeStateDisconnected DISCONNECTED + NodeStateDisconnected NodeState = "disconnected" +) diff --git a/vendor/github.com/docker/docker/api/types/swarm/secret.go b/vendor/github.com/docker/docker/api/types/swarm/secret.go new file mode 100644 index 00000000..fdb23888 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/swarm/secret.go @@ -0,0 +1,31 @@ +package swarm + +import "os" + +// Secret represents a secret. +type Secret struct { + ID string + Meta + Spec SecretSpec +} + +// SecretSpec represents a secret specification from a secret in swarm +type SecretSpec struct { + Annotations + Data []byte `json:",omitempty"` +} + +// SecretReferenceFileTarget is a file target in a secret reference +type SecretReferenceFileTarget struct { + Name string + UID string + GID string + Mode os.FileMode +} + +// SecretReference is a reference to a secret in swarm +type SecretReference struct { + File *SecretReferenceFileTarget + SecretID string + SecretName string +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/service.go b/vendor/github.com/docker/docker/api/types/swarm/service.go new file mode 100644 index 00000000..2cf2642c --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/swarm/service.go @@ -0,0 +1,105 @@ +package swarm + +import "time" + +// Service represents a service. +type Service struct { + ID string + Meta + Spec ServiceSpec `json:",omitempty"` + PreviousSpec *ServiceSpec `json:",omitempty"` + Endpoint Endpoint `json:",omitempty"` + UpdateStatus UpdateStatus `json:",omitempty"` +} + +// ServiceSpec represents the spec of a service. +type ServiceSpec struct { + Annotations + + // TaskTemplate defines how the service should construct new tasks when + // orchestrating this service. + TaskTemplate TaskSpec `json:",omitempty"` + Mode ServiceMode `json:",omitempty"` + UpdateConfig *UpdateConfig `json:",omitempty"` + + // Networks field in ServiceSpec is deprecated. The + // same field in TaskSpec should be used instead. + // This field will be removed in a future release. + Networks []NetworkAttachmentConfig `json:",omitempty"` + EndpointSpec *EndpointSpec `json:",omitempty"` +} + +// ServiceMode represents the mode of a service. +type ServiceMode struct { + Replicated *ReplicatedService `json:",omitempty"` + Global *GlobalService `json:",omitempty"` +} + +// UpdateState is the state of a service update. +type UpdateState string + +const ( + // UpdateStateUpdating is the updating state. + UpdateStateUpdating UpdateState = "updating" + // UpdateStatePaused is the paused state. + UpdateStatePaused UpdateState = "paused" + // UpdateStateCompleted is the completed state. + UpdateStateCompleted UpdateState = "completed" +) + +// UpdateStatus reports the status of a service update. +type UpdateStatus struct { + State UpdateState `json:",omitempty"` + StartedAt time.Time `json:",omitempty"` + CompletedAt time.Time `json:",omitempty"` + Message string `json:",omitempty"` +} + +// ReplicatedService is a kind of ServiceMode. +type ReplicatedService struct { + Replicas *uint64 `json:",omitempty"` +} + +// GlobalService is a kind of ServiceMode. +type GlobalService struct{} + +const ( + // UpdateFailureActionPause PAUSE + UpdateFailureActionPause = "pause" + // UpdateFailureActionContinue CONTINUE + UpdateFailureActionContinue = "continue" +) + +// UpdateConfig represents the update configuration. +type UpdateConfig struct { + // Maximum number of tasks to be updated in one iteration. + // 0 means unlimited parallelism. + Parallelism uint64 + + // Amount of time between updates. + Delay time.Duration `json:",omitempty"` + + // FailureAction is the action to take when an update failures. + FailureAction string `json:",omitempty"` + + // Monitor indicates how long to monitor a task for failure after it is + // created. If the task fails by ending up in one of the states + // REJECTED, COMPLETED, or FAILED, within Monitor from its creation, + // this counts as a failure. If it fails after Monitor, it does not + // count as a failure. If Monitor is unspecified, a default value will + // be used. + Monitor time.Duration `json:",omitempty"` + + // MaxFailureRatio is the fraction of tasks that may fail during + // an update before the failure action is invoked. Any task created by + // the current update which ends up in one of the states REJECTED, + // COMPLETED or FAILED within Monitor from its creation counts as a + // failure. The number of failures is divided by the number of tasks + // being updated, and if this fraction is greater than + // MaxFailureRatio, the failure action is invoked. + // + // If the failure action is CONTINUE, there is no effect. + // If the failure action is PAUSE, no more tasks will be updated until + // another update is started. + MaxFailureRatio float32 +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/swarm.go b/vendor/github.com/docker/docker/api/types/swarm/swarm.go new file mode 100644 index 00000000..0b422196 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/swarm/swarm.go @@ -0,0 +1,197 @@ +package swarm + +import "time" + +// ClusterInfo represents info about the cluster for outputing in "info" +// it contains the same information as "Swarm", but without the JoinTokens +type ClusterInfo struct { + ID string + Meta + Spec Spec +} + +// Swarm represents a swarm. +type Swarm struct { + ClusterInfo + JoinTokens JoinTokens +} + +// JoinTokens contains the tokens workers and managers need to join the swarm. +type JoinTokens struct { + // Worker is the join token workers may use to join the swarm. + Worker string + // Manager is the join token managers may use to join the swarm. + Manager string +} + +// Spec represents the spec of a swarm. +type Spec struct { + Annotations + + Orchestration OrchestrationConfig `json:",omitempty"` + Raft RaftConfig `json:",omitempty"` + Dispatcher DispatcherConfig `json:",omitempty"` + CAConfig CAConfig `json:",omitempty"` + TaskDefaults TaskDefaults `json:",omitempty"` + EncryptionConfig EncryptionConfig `json:",omitempty"` +} + +// OrchestrationConfig represents orchestration configuration. +type OrchestrationConfig struct { + // TaskHistoryRetentionLimit is the number of historic tasks to keep per instance or + // node. If negative, never remove completed or failed tasks. + TaskHistoryRetentionLimit *int64 `json:",omitempty"` +} + +// TaskDefaults parameterizes cluster-level task creation with default values. +type TaskDefaults struct { + // LogDriver selects the log driver to use for tasks created in the + // orchestrator if unspecified by a service. + // + // Updating this value will only have an affect on new tasks. Old tasks + // will continue use their previously configured log driver until + // recreated. + LogDriver *Driver `json:",omitempty"` +} + +// EncryptionConfig controls at-rest encryption of data and keys. +type EncryptionConfig struct { + // AutoLockManagers specifies whether or not managers TLS keys and raft data + // should be encrypted at rest in such a way that they must be unlocked + // before the manager node starts up again. + AutoLockManagers bool +} + +// RaftConfig represents raft configuration. +type RaftConfig struct { + // SnapshotInterval is the number of log entries between snapshots. + SnapshotInterval uint64 `json:",omitempty"` + + // KeepOldSnapshots is the number of snapshots to keep beyond the + // current snapshot. + KeepOldSnapshots *uint64 `json:",omitempty"` + + // LogEntriesForSlowFollowers is the number of log entries to keep + // around to sync up slow followers after a snapshot is created. + LogEntriesForSlowFollowers uint64 `json:",omitempty"` + + // ElectionTick is the number of ticks that a follower will wait for a message + // from the leader before becoming a candidate and starting an election. + // ElectionTick must be greater than HeartbeatTick. + // + // A tick currently defaults to one second, so these translate directly to + // seconds currently, but this is NOT guaranteed. + ElectionTick int + + // HeartbeatTick is the number of ticks between heartbeats. Every + // HeartbeatTick ticks, the leader will send a heartbeat to the + // followers. + // + // A tick currently defaults to one second, so these translate directly to + // seconds currently, but this is NOT guaranteed. + HeartbeatTick int +} + +// DispatcherConfig represents dispatcher configuration. +type DispatcherConfig struct { + // HeartbeatPeriod defines how often agent should send heartbeats to + // dispatcher. + HeartbeatPeriod time.Duration `json:",omitempty"` +} + +// CAConfig represents CA configuration. +type CAConfig struct { + // NodeCertExpiry is the duration certificates should be issued for + NodeCertExpiry time.Duration `json:",omitempty"` + + // ExternalCAs is a list of CAs to which a manager node will make + // certificate signing requests for node certificates. + ExternalCAs []*ExternalCA `json:",omitempty"` +} + +// ExternalCAProtocol represents type of external CA. +type ExternalCAProtocol string + +// ExternalCAProtocolCFSSL CFSSL +const ExternalCAProtocolCFSSL ExternalCAProtocol = "cfssl" + +// ExternalCA defines external CA to be used by the cluster. +type ExternalCA struct { + // Protocol is the protocol used by this external CA. + Protocol ExternalCAProtocol + + // URL is the URL where the external CA can be reached. + URL string + + // Options is a set of additional key/value pairs whose interpretation + // depends on the specified CA type. + Options map[string]string `json:",omitempty"` +} + +// InitRequest is the request used to init a swarm. +type InitRequest struct { + ListenAddr string + AdvertiseAddr string + ForceNewCluster bool + Spec Spec + AutoLockManagers bool +} + +// JoinRequest is the request used to join a swarm. +type JoinRequest struct { + ListenAddr string + AdvertiseAddr string + RemoteAddrs []string + JoinToken string // accept by secret +} + +// UnlockRequest is the request used to unlock a swarm. +type UnlockRequest struct { + // UnlockKey is the unlock key in ASCII-armored format. + UnlockKey string +} + +// LocalNodeState represents the state of the local node. +type LocalNodeState string + +const ( + // LocalNodeStateInactive INACTIVE + LocalNodeStateInactive LocalNodeState = "inactive" + // LocalNodeStatePending PENDING + LocalNodeStatePending LocalNodeState = "pending" + // LocalNodeStateActive ACTIVE + LocalNodeStateActive LocalNodeState = "active" + // LocalNodeStateError ERROR + LocalNodeStateError LocalNodeState = "error" + // LocalNodeStateLocked LOCKED + LocalNodeStateLocked LocalNodeState = "locked" +) + +// Info represents generic information about swarm. +type Info struct { + NodeID string + NodeAddr string + + LocalNodeState LocalNodeState + ControlAvailable bool + Error string + + RemoteManagers []Peer + Nodes int + Managers int + + Cluster ClusterInfo +} + +// Peer represents a peer. +type Peer struct { + NodeID string + Addr string +} + +// UpdateFlags contains flags for SwarmUpdate. +type UpdateFlags struct { + RotateWorkerToken bool + RotateManagerToken bool + RotateManagerUnlockKey bool +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/task.go b/vendor/github.com/docker/docker/api/types/swarm/task.go new file mode 100644 index 00000000..ace12cc8 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/swarm/task.go @@ -0,0 +1,128 @@ +package swarm + +import "time" + +// TaskState represents the state of a task. +type TaskState string + +const ( + // TaskStateNew NEW + TaskStateNew TaskState = "new" + // TaskStateAllocated ALLOCATED + TaskStateAllocated TaskState = "allocated" + // TaskStatePending PENDING + TaskStatePending TaskState = "pending" + // TaskStateAssigned ASSIGNED + TaskStateAssigned TaskState = "assigned" + // TaskStateAccepted ACCEPTED + TaskStateAccepted TaskState = "accepted" + // TaskStatePreparing PREPARING + TaskStatePreparing TaskState = "preparing" + // TaskStateReady READY + TaskStateReady TaskState = "ready" + // TaskStateStarting STARTING + TaskStateStarting TaskState = "starting" + // TaskStateRunning RUNNING + TaskStateRunning TaskState = "running" + // TaskStateComplete COMPLETE + TaskStateComplete TaskState = "complete" + // TaskStateShutdown SHUTDOWN + TaskStateShutdown TaskState = "shutdown" + // TaskStateFailed FAILED + TaskStateFailed TaskState = "failed" + // TaskStateRejected REJECTED + TaskStateRejected TaskState = "rejected" +) + +// Task represents a task. +type Task struct { + ID string + Meta + Annotations + + Spec TaskSpec `json:",omitempty"` + ServiceID string `json:",omitempty"` + Slot int `json:",omitempty"` + NodeID string `json:",omitempty"` + Status TaskStatus `json:",omitempty"` + DesiredState TaskState `json:",omitempty"` + NetworksAttachments []NetworkAttachment `json:",omitempty"` +} + +// TaskSpec represents the spec of a task. +type TaskSpec struct { + ContainerSpec ContainerSpec `json:",omitempty"` + Resources *ResourceRequirements `json:",omitempty"` + RestartPolicy *RestartPolicy `json:",omitempty"` + Placement *Placement `json:",omitempty"` + Networks []NetworkAttachmentConfig `json:",omitempty"` + + // LogDriver specifies the LogDriver to use for tasks created from this + // spec. If not present, the one on cluster default on swarm.Spec will be + // used, finally falling back to the engine default if not specified. + LogDriver *Driver `json:",omitempty"` + + // ForceUpdate is a counter that triggers an update even if no relevant + // parameters have been changed. + ForceUpdate uint64 +} + +// Resources represents resources (CPU/Memory). +type Resources struct { + NanoCPUs int64 `json:",omitempty"` + MemoryBytes int64 `json:",omitempty"` +} + +// ResourceRequirements represents resources requirements. +type ResourceRequirements struct { + Limits *Resources `json:",omitempty"` + Reservations *Resources `json:",omitempty"` +} + +// Placement represents orchestration parameters. +type Placement struct { + Constraints []string `json:",omitempty"` +} + +// RestartPolicy represents the restart policy. +type RestartPolicy struct { + Condition RestartPolicyCondition `json:",omitempty"` + Delay *time.Duration `json:",omitempty"` + MaxAttempts *uint64 `json:",omitempty"` + Window *time.Duration `json:",omitempty"` +} + +// RestartPolicyCondition represents when to restart. +type RestartPolicyCondition string + +const ( + // RestartPolicyConditionNone NONE + RestartPolicyConditionNone RestartPolicyCondition = "none" + // RestartPolicyConditionOnFailure ON_FAILURE + RestartPolicyConditionOnFailure RestartPolicyCondition = "on-failure" + // RestartPolicyConditionAny ANY + RestartPolicyConditionAny RestartPolicyCondition = "any" +) + +// TaskStatus represents the status of a task. +type TaskStatus struct { + Timestamp time.Time `json:",omitempty"` + State TaskState `json:",omitempty"` + Message string `json:",omitempty"` + Err string `json:",omitempty"` + ContainerStatus ContainerStatus `json:",omitempty"` + PortStatus PortStatus `json:",omitempty"` +} + +// ContainerStatus represents the status of a container. +type ContainerStatus struct { + ContainerID string `json:",omitempty"` + PID int `json:",omitempty"` + ExitCode int `json:",omitempty"` +} + +// PortStatus represents the port status of a task's host ports whose +// service has published host ports +type PortStatus struct { + Ports []PortConfig `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/time/duration_convert.go b/vendor/github.com/docker/docker/api/types/time/duration_convert.go new file mode 100644 index 00000000..63e1eec1 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/time/duration_convert.go @@ -0,0 +1,12 @@ +package time + +import ( + "strconv" + "time" +) + +// DurationToSecondsString converts the specified duration to the number +// seconds it represents, formatted as a string. +func DurationToSecondsString(duration time.Duration) string { + return strconv.FormatFloat(duration.Seconds(), 'f', 0, 64) +} diff --git a/vendor/github.com/docker/docker/api/types/time/timestamp.go b/vendor/github.com/docker/docker/api/types/time/timestamp.go new file mode 100644 index 00000000..d3695ba7 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/time/timestamp.go @@ -0,0 +1,124 @@ +package time + +import ( + "fmt" + "math" + "strconv" + "strings" + "time" +) + +// These are additional predefined layouts for use in Time.Format and Time.Parse +// with --since and --until parameters for `docker logs` and `docker events` +const ( + rFC3339Local = "2006-01-02T15:04:05" // RFC3339 with local timezone + rFC3339NanoLocal = "2006-01-02T15:04:05.999999999" // RFC3339Nano with local timezone + dateWithZone = "2006-01-02Z07:00" // RFC3339 with time at 00:00:00 + dateLocal = "2006-01-02" // RFC3339 with local timezone and time at 00:00:00 +) + +// GetTimestamp tries to parse given string as golang duration, +// then RFC3339 time and finally as a Unix timestamp. If +// any of these were successful, it returns a Unix timestamp +// as string otherwise returns the given value back. +// In case of duration input, the returned timestamp is computed +// as the given reference time minus the amount of the duration. +func GetTimestamp(value string, reference time.Time) (string, error) { + if d, err := time.ParseDuration(value); value != "0" && err == nil { + return strconv.FormatInt(reference.Add(-d).Unix(), 10), nil + } + + var format string + var parseInLocation bool + + // if the string has a Z or a + or three dashes use parse otherwise use parseinlocation + parseInLocation = !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3) + + if strings.Contains(value, ".") { + if parseInLocation { + format = rFC3339NanoLocal + } else { + format = time.RFC3339Nano + } + } else if strings.Contains(value, "T") { + // we want the number of colons in the T portion of the timestamp + tcolons := strings.Count(value, ":") + // if parseInLocation is off and we have a +/- zone offset (not Z) then + // there will be an extra colon in the input for the tz offset subtract that + // colon from the tcolons count + if !parseInLocation && !strings.ContainsAny(value, "zZ") && tcolons > 0 { + tcolons-- + } + if parseInLocation { + switch tcolons { + case 0: + format = "2006-01-02T15" + case 1: + format = "2006-01-02T15:04" + default: + format = rFC3339Local + } + } else { + switch tcolons { + case 0: + format = "2006-01-02T15Z07:00" + case 1: + format = "2006-01-02T15:04Z07:00" + default: + format = time.RFC3339 + } + } + } else if parseInLocation { + format = dateLocal + } else { + format = dateWithZone + } + + var t time.Time + var err error + + if parseInLocation { + t, err = time.ParseInLocation(format, value, time.FixedZone(reference.Zone())) + } else { + t, err = time.Parse(format, value) + } + + if err != nil { + // if there is a `-` then its an RFC3339 like timestamp otherwise assume unixtimestamp + if strings.Contains(value, "-") { + return "", err // was probably an RFC3339 like timestamp but the parser failed with an error + } + return value, nil // unixtimestamp in and out case (meaning: the value passed at the command line is already in the right format for passing to the server) + } + + return fmt.Sprintf("%d.%09d", t.Unix(), int64(t.Nanosecond())), nil +} + +// ParseTimestamps returns seconds and nanoseconds from a timestamp that has the +// format "%d.%09d", time.Unix(), int64(time.Nanosecond())) +// if the incoming nanosecond portion is longer or shorter than 9 digits it is +// converted to nanoseconds. The expectation is that the seconds and +// seconds will be used to create a time variable. For example: +// seconds, nanoseconds, err := ParseTimestamp("1136073600.000000001",0) +// if err == nil since := time.Unix(seconds, nanoseconds) +// returns seconds as def(aultSeconds) if value == "" +func ParseTimestamps(value string, def int64) (int64, int64, error) { + if value == "" { + return def, 0, nil + } + sa := strings.SplitN(value, ".", 2) + s, err := strconv.ParseInt(sa[0], 10, 64) + if err != nil { + return s, 0, err + } + if len(sa) != 2 { + return s, 0, nil + } + n, err := strconv.ParseInt(sa[1], 10, 64) + if err != nil { + return s, n, err + } + // should already be in nanoseconds but just in case convert n to nanoseonds + n = int64(float64(n) * math.Pow(float64(10), float64(9-len(sa[1])))) + return s, n, nil +} diff --git a/vendor/github.com/docker/docker/api/types/types.go b/vendor/github.com/docker/docker/api/types/types.go new file mode 100644 index 00000000..a82c3e88 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/types.go @@ -0,0 +1,549 @@ +package types + +import ( + "errors" + "fmt" + "io" + "os" + "strings" + "time" + + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/mount" + "github.com/docker/docker/api/types/network" + "github.com/docker/docker/api/types/registry" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/go-connections/nat" +) + +// ContainerChange contains response of Engine API: +// GET "/containers/{name:.*}/changes" +type ContainerChange struct { + Kind int + Path string +} + +// ImageHistory contains response of Engine API: +// GET "/images/{name:.*}/history" +type ImageHistory struct { + ID string `json:"Id"` + Created int64 + CreatedBy string + Tags []string + Size int64 + Comment string +} + +// ImageDelete contains response of Engine API: +// DELETE "/images/{name:.*}" +type ImageDelete struct { + Untagged string `json:",omitempty"` + Deleted string `json:",omitempty"` +} + +// GraphDriverData returns Image's graph driver config info +// when calling inspect command +type GraphDriverData struct { + Name string + Data map[string]string +} + +// RootFS returns Image's RootFS description including the layer IDs. +type RootFS struct { + Type string + Layers []string `json:",omitempty"` + BaseLayer string `json:",omitempty"` +} + +// ImageInspect contains response of Engine API: +// GET "/images/{name:.*}/json" +type ImageInspect struct { + ID string `json:"Id"` + RepoTags []string + RepoDigests []string + Parent string + Comment string + Created string + Container string + ContainerConfig *container.Config + DockerVersion string + Author string + Config *container.Config + Architecture string + Os string + OsVersion string `json:",omitempty"` + Size int64 + VirtualSize int64 + GraphDriver GraphDriverData + RootFS RootFS +} + +// Container contains response of Engine API: +// GET "/containers/json" +type Container struct { + ID string `json:"Id"` + Names []string + Image string + ImageID string + Command string + Created int64 + Ports []Port + SizeRw int64 `json:",omitempty"` + SizeRootFs int64 `json:",omitempty"` + Labels map[string]string + State string + Status string + HostConfig struct { + NetworkMode string `json:",omitempty"` + } + NetworkSettings *SummaryNetworkSettings + Mounts []MountPoint +} + +// CopyConfig contains request body of Engine API: +// POST "/containers/"+containerID+"/copy" +type CopyConfig struct { + Resource string +} + +// ContainerPathStat is used to encode the header from +// GET "/containers/{name:.*}/archive" +// "Name" is the file or directory name. +type ContainerPathStat struct { + Name string `json:"name"` + Size int64 `json:"size"` + Mode os.FileMode `json:"mode"` + Mtime time.Time `json:"mtime"` + LinkTarget string `json:"linkTarget"` +} + +// ContainerStats contains response of Engine API: +// GET "/stats" +type ContainerStats struct { + Body io.ReadCloser `json:"body"` + OSType string `json:"ostype"` +} + +// ContainerProcessList contains response of Engine API: +// GET "/containers/{name:.*}/top" +type ContainerProcessList struct { + Processes [][]string + Titles []string +} + +// Ping contains response of Engine API: +// GET "/_ping" +type Ping struct { + APIVersion string + Experimental bool +} + +// Version contains response of Engine API: +// GET "/version" +type Version struct { + Version string + APIVersion string `json:"ApiVersion"` + MinAPIVersion string `json:"MinAPIVersion,omitempty"` + GitCommit string + GoVersion string + Os string + Arch string + KernelVersion string `json:",omitempty"` + Experimental bool `json:",omitempty"` + BuildTime string `json:",omitempty"` +} + +// Commit records a external tool actual commit id version along the +// one expect by dockerd as set at build time +type Commit struct { + ID string + Expected string +} + +// Info contains response of Engine API: +// GET "/info" +type Info struct { + ID string + Containers int + ContainersRunning int + ContainersPaused int + ContainersStopped int + Images int + Driver string + DriverStatus [][2]string + SystemStatus [][2]string + Plugins PluginsInfo + MemoryLimit bool + SwapLimit bool + KernelMemory bool + CPUCfsPeriod bool `json:"CpuCfsPeriod"` + CPUCfsQuota bool `json:"CpuCfsQuota"` + CPUShares bool + CPUSet bool + IPv4Forwarding bool + BridgeNfIptables bool + BridgeNfIP6tables bool `json:"BridgeNfIp6tables"` + Debug bool + NFd int + OomKillDisable bool + NGoroutines int + SystemTime string + LoggingDriver string + CgroupDriver string + NEventsListener int + KernelVersion string + OperatingSystem string + OSType string + Architecture string + IndexServerAddress string + RegistryConfig *registry.ServiceConfig + NCPU int + MemTotal int64 + DockerRootDir string + HTTPProxy string `json:"HttpProxy"` + HTTPSProxy string `json:"HttpsProxy"` + NoProxy string + Name string + Labels []string + ExperimentalBuild bool + ServerVersion string + ClusterStore string + ClusterAdvertise string + Runtimes map[string]Runtime + DefaultRuntime string + Swarm swarm.Info + // LiveRestoreEnabled determines whether containers should be kept + // running when the daemon is shutdown or upon daemon start if + // running containers are detected + LiveRestoreEnabled bool + Isolation container.Isolation + InitBinary string + ContainerdCommit Commit + RuncCommit Commit + InitCommit Commit + SecurityOptions []string +} + +// KeyValue holds a key/value pair +type KeyValue struct { + Key, Value string +} + +// SecurityOpt contains the name and options of a security option +type SecurityOpt struct { + Name string + Options []KeyValue +} + +// DecodeSecurityOptions decodes a security options string slice to a type safe +// SecurityOpt +func DecodeSecurityOptions(opts []string) ([]SecurityOpt, error) { + so := []SecurityOpt{} + for _, opt := range opts { + // support output from a < 1.13 docker daemon + if !strings.Contains(opt, "=") { + so = append(so, SecurityOpt{Name: opt}) + continue + } + secopt := SecurityOpt{} + split := strings.Split(opt, ",") + for _, s := range split { + kv := strings.SplitN(s, "=", 2) + if len(kv) != 2 { + return nil, fmt.Errorf("invalid security option %q", s) + } + if kv[0] == "" || kv[1] == "" { + return nil, errors.New("invalid empty security option") + } + if kv[0] == "name" { + secopt.Name = kv[1] + continue + } + secopt.Options = append(secopt.Options, KeyValue{Key: kv[0], Value: kv[1]}) + } + so = append(so, secopt) + } + return so, nil +} + +// PluginsInfo is a temp struct holding Plugins name +// registered with docker daemon. It is used by Info struct +type PluginsInfo struct { + // List of Volume plugins registered + Volume []string + // List of Network plugins registered + Network []string + // List of Authorization plugins registered + Authorization []string +} + +// ExecStartCheck is a temp struct used by execStart +// Config fields is part of ExecConfig in runconfig package +type ExecStartCheck struct { + // ExecStart will first check if it's detached + Detach bool + // Check if there's a tty + Tty bool +} + +// HealthcheckResult stores information about a single run of a healthcheck probe +type HealthcheckResult struct { + Start time.Time // Start is the time this check started + End time.Time // End is the time this check ended + ExitCode int // ExitCode meanings: 0=healthy, 1=unhealthy, 2=reserved (considered unhealthy), else=error running probe + Output string // Output from last check +} + +// Health states +const ( + NoHealthcheck = "none" // Indicates there is no healthcheck + Starting = "starting" // Starting indicates that the container is not yet ready + Healthy = "healthy" // Healthy indicates that the container is running correctly + Unhealthy = "unhealthy" // Unhealthy indicates that the container has a problem +) + +// Health stores information about the container's healthcheck results +type Health struct { + Status string // Status is one of Starting, Healthy or Unhealthy + FailingStreak int // FailingStreak is the number of consecutive failures + Log []*HealthcheckResult // Log contains the last few results (oldest first) +} + +// ContainerState stores container's running state +// it's part of ContainerJSONBase and will return by "inspect" command +type ContainerState struct { + Status string + Running bool + Paused bool + Restarting bool + OOMKilled bool + Dead bool + Pid int + ExitCode int + Error string + StartedAt string + FinishedAt string + Health *Health `json:",omitempty"` +} + +// ContainerNode stores information about the node that a container +// is running on. It's only available in Docker Swarm +type ContainerNode struct { + ID string + IPAddress string `json:"IP"` + Addr string + Name string + Cpus int + Memory int64 + Labels map[string]string +} + +// ContainerJSONBase contains response of Engine API: +// GET "/containers/{name:.*}/json" +type ContainerJSONBase struct { + ID string `json:"Id"` + Created string + Path string + Args []string + State *ContainerState + Image string + ResolvConfPath string + HostnamePath string + HostsPath string + LogPath string + Node *ContainerNode `json:",omitempty"` + Name string + RestartCount int + Driver string + MountLabel string + ProcessLabel string + AppArmorProfile string + ExecIDs []string + HostConfig *container.HostConfig + GraphDriver GraphDriverData + SizeRw *int64 `json:",omitempty"` + SizeRootFs *int64 `json:",omitempty"` +} + +// ContainerJSON is newly used struct along with MountPoint +type ContainerJSON struct { + *ContainerJSONBase + Mounts []MountPoint + Config *container.Config + NetworkSettings *NetworkSettings +} + +// NetworkSettings exposes the network settings in the api +type NetworkSettings struct { + NetworkSettingsBase + DefaultNetworkSettings + Networks map[string]*network.EndpointSettings +} + +// SummaryNetworkSettings provides a summary of container's networks +// in /containers/json +type SummaryNetworkSettings struct { + Networks map[string]*network.EndpointSettings +} + +// NetworkSettingsBase holds basic information about networks +type NetworkSettingsBase struct { + Bridge string // Bridge is the Bridge name the network uses(e.g. `docker0`) + SandboxID string // SandboxID uniquely represents a container's network stack + HairpinMode bool // HairpinMode specifies if hairpin NAT should be enabled on the virtual interface + LinkLocalIPv6Address string // LinkLocalIPv6Address is an IPv6 unicast address using the link-local prefix + LinkLocalIPv6PrefixLen int // LinkLocalIPv6PrefixLen is the prefix length of an IPv6 unicast address + Ports nat.PortMap // Ports is a collection of PortBinding indexed by Port + SandboxKey string // SandboxKey identifies the sandbox + SecondaryIPAddresses []network.Address + SecondaryIPv6Addresses []network.Address +} + +// DefaultNetworkSettings holds network information +// during the 2 release deprecation period. +// It will be removed in Docker 1.11. +type DefaultNetworkSettings struct { + EndpointID string // EndpointID uniquely represents a service endpoint in a Sandbox + Gateway string // Gateway holds the gateway address for the network + GlobalIPv6Address string // GlobalIPv6Address holds network's global IPv6 address + GlobalIPv6PrefixLen int // GlobalIPv6PrefixLen represents mask length of network's global IPv6 address + IPAddress string // IPAddress holds the IPv4 address for the network + IPPrefixLen int // IPPrefixLen represents mask length of network's IPv4 address + IPv6Gateway string // IPv6Gateway holds gateway address specific for IPv6 + MacAddress string // MacAddress holds the MAC address for the network +} + +// MountPoint represents a mount point configuration inside the container. +// This is used for reporting the mountpoints in use by a container. +type MountPoint struct { + Type mount.Type `json:",omitempty"` + Name string `json:",omitempty"` + Source string + Destination string + Driver string `json:",omitempty"` + Mode string + RW bool + Propagation mount.Propagation +} + +// NetworkResource is the body of the "get network" http response message +type NetworkResource struct { + Name string // Name is the requested name of the network + ID string `json:"Id"` // ID uniquely identifies a network on a single machine + Created time.Time // Created is the time the network created + Scope string // Scope describes the level at which the network exists (e.g. `global` for cluster-wide or `local` for machine level) + Driver string // Driver is the Driver name used to create the network (e.g. `bridge`, `overlay`) + EnableIPv6 bool // EnableIPv6 represents whether to enable IPv6 + IPAM network.IPAM // IPAM is the network's IP Address Management + Internal bool // Internal represents if the network is used internal only + Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode. + Containers map[string]EndpointResource // Containers contains endpoints belonging to the network + Options map[string]string // Options holds the network specific options to use for when creating the network + Labels map[string]string // Labels holds metadata specific to the network being created + Peers []network.PeerInfo `json:",omitempty"` // List of peer nodes for an overlay network +} + +// EndpointResource contains network resources allocated and used for a container in a network +type EndpointResource struct { + Name string + EndpointID string + MacAddress string + IPv4Address string + IPv6Address string +} + +// NetworkCreate is the expected body of the "create network" http request message +type NetworkCreate struct { + CheckDuplicate bool + Driver string + EnableIPv6 bool + IPAM *network.IPAM + Internal bool + Attachable bool + Options map[string]string + Labels map[string]string +} + +// NetworkCreateRequest is the request message sent to the server for network create call. +type NetworkCreateRequest struct { + NetworkCreate + Name string +} + +// NetworkCreateResponse is the response message sent by the server for network create call +type NetworkCreateResponse struct { + ID string `json:"Id"` + Warning string +} + +// NetworkConnect represents the data to be used to connect a container to the network +type NetworkConnect struct { + Container string + EndpointConfig *network.EndpointSettings `json:",omitempty"` +} + +// NetworkDisconnect represents the data to be used to disconnect a container from the network +type NetworkDisconnect struct { + Container string + Force bool +} + +// Checkpoint represents the details of a checkpoint +type Checkpoint struct { + Name string // Name is the name of the checkpoint +} + +// Runtime describes an OCI runtime +type Runtime struct { + Path string `json:"path"` + Args []string `json:"runtimeArgs,omitempty"` +} + +// DiskUsage contains response of Engine API: +// GET "/system/df" +type DiskUsage struct { + LayersSize int64 + Images []*ImageSummary + Containers []*Container + Volumes []*Volume +} + +// ContainersPruneReport contains the response for Engine API: +// POST "/containers/prune" +type ContainersPruneReport struct { + ContainersDeleted []string + SpaceReclaimed uint64 +} + +// VolumesPruneReport contains the response for Engine API: +// POST "/volumes/prune" +type VolumesPruneReport struct { + VolumesDeleted []string + SpaceReclaimed uint64 +} + +// ImagesPruneReport contains the response for Engine API: +// POST "/images/prune" +type ImagesPruneReport struct { + ImagesDeleted []ImageDelete + SpaceReclaimed uint64 +} + +// NetworksPruneReport contains the response for Engine API: +// POST "/networks/prune" +type NetworksPruneReport struct { + NetworksDeleted []string +} + +// SecretCreateResponse contains the information returned to a client +// on the creation of a new secret. +type SecretCreateResponse struct { + // ID is the id of the created secret. + ID string +} + +// SecretListOptions holds parameters to list secrets +type SecretListOptions struct { + Filters filters.Args +} diff --git a/vendor/github.com/docker/docker/api/types/versions/README.md b/vendor/github.com/docker/docker/api/types/versions/README.md new file mode 100644 index 00000000..cdac50a5 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/versions/README.md @@ -0,0 +1,14 @@ +## Legacy API type versions + +This package includes types for legacy API versions. The stable version of the API types live in `api/types/*.go`. + +Consider moving a type here when you need to keep backwards compatibility in the API. This legacy types are organized by the latest API version they appear in. For instance, types in the `v1p19` package are valid for API versions below or equal `1.19`. Types in the `v1p20` package are valid for the API version `1.20`, since the versions below that will use the legacy types in `v1p19`. + +### Package name conventions + +The package name convention is to use `v` as a prefix for the version number and `p`(patch) as a separator. We use this nomenclature due to a few restrictions in the Go package name convention: + +1. We cannot use `.` because it's interpreted by the language, think of `v1.20.CallFunction`. +2. We cannot use `_` because golint complains about it. The code is actually valid, but it looks probably more weird: `v1_20.CallFunction`. + +For instance, if you want to modify a type that was available in the version `1.21` of the API but it will have different fields in the version `1.22`, you want to create a new package under `api/types/versions/v1p21`. diff --git a/vendor/github.com/docker/docker/api/types/versions/compare.go b/vendor/github.com/docker/docker/api/types/versions/compare.go new file mode 100644 index 00000000..611d4fed --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/versions/compare.go @@ -0,0 +1,62 @@ +package versions + +import ( + "strconv" + "strings" +) + +// compare compares two version strings +// returns -1 if v1 < v2, 1 if v1 > v2, 0 otherwise. +func compare(v1, v2 string) int { + var ( + currTab = strings.Split(v1, ".") + otherTab = strings.Split(v2, ".") + ) + + max := len(currTab) + if len(otherTab) > max { + max = len(otherTab) + } + for i := 0; i < max; i++ { + var currInt, otherInt int + + if len(currTab) > i { + currInt, _ = strconv.Atoi(currTab[i]) + } + if len(otherTab) > i { + otherInt, _ = strconv.Atoi(otherTab[i]) + } + if currInt > otherInt { + return 1 + } + if otherInt > currInt { + return -1 + } + } + return 0 +} + +// LessThan checks if a version is less than another +func LessThan(v, other string) bool { + return compare(v, other) == -1 +} + +// LessThanOrEqualTo checks if a version is less than or equal to another +func LessThanOrEqualTo(v, other string) bool { + return compare(v, other) <= 0 +} + +// GreaterThan checks if a version is greater than another +func GreaterThan(v, other string) bool { + return compare(v, other) == 1 +} + +// GreaterThanOrEqualTo checks if a version is greater than or equal to another +func GreaterThanOrEqualTo(v, other string) bool { + return compare(v, other) >= 0 +} + +// Equal checks if a version is equal to another +func Equal(v, other string) bool { + return compare(v, other) == 0 +} diff --git a/vendor/github.com/docker/docker/api/types/volume.go b/vendor/github.com/docker/docker/api/types/volume.go new file mode 100644 index 00000000..da4f8ebd --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/volume.go @@ -0,0 +1,58 @@ +package types + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// Volume volume +// swagger:model Volume +type Volume struct { + + // Name of the volume driver used by the volume. + // Required: true + Driver string `json:"Driver"` + + // User-defined key/value metadata. + // Required: true + Labels map[string]string `json:"Labels"` + + // Mount path of the volume on the host. + // Required: true + Mountpoint string `json:"Mountpoint"` + + // Name of the volume. + // Required: true + Name string `json:"Name"` + + // The driver specific options used when creating the volume. + // Required: true + Options map[string]string `json:"Options"` + + // The level at which the volume exists. Either `global` for cluster-wide, or `local` for machine level. + // Required: true + Scope string `json:"Scope"` + + // Low-level details about the volume, provided by the volume driver. + // Details are returned as a map with key/value pairs: + // `{"key":"value","key2":"value2"}`. + // + // The `Status` field is optional, and is omitted if the volume driver + // does not support this feature. + // + Status map[string]interface{} `json:"Status,omitempty"` + + // usage data + UsageData *VolumeUsageData `json:"UsageData,omitempty"` +} + +// VolumeUsageData volume usage data +// swagger:model VolumeUsageData +type VolumeUsageData struct { + + // The number of containers referencing this volume. + // Required: true + RefCount int64 `json:"RefCount"` + + // The disk space used by the volume (local driver only) + // Required: true + Size int64 `json:"Size"` +} diff --git a/vendor/github.com/docker/docker/api/types/volume/volumes_create.go b/vendor/github.com/docker/docker/api/types/volume/volumes_create.go new file mode 100644 index 00000000..679c1600 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/volume/volumes_create.go @@ -0,0 +1,29 @@ +package volume + +// ---------------------------------------------------------------------------- +// DO NOT EDIT THIS FILE +// This file was generated by `swagger generate operation` +// +// See hack/swagger-gen.sh +// ---------------------------------------------------------------------------- + +// VolumesCreateBody volumes create body +// swagger:model VolumesCreateBody +type VolumesCreateBody struct { + + // Name of the volume driver to use. + // Required: true + Driver string `json:"Driver"` + + // A mapping of driver options and values. These options are passed directly to the driver and are driver specific. + // Required: true + DriverOpts map[string]string `json:"DriverOpts"` + + // User-defined key/value metadata. + // Required: true + Labels map[string]string `json:"Labels"` + + // The new volume's name. If not specified, Docker generates a name. + // Required: true + Name string `json:"Name"` +} diff --git a/vendor/github.com/docker/docker/api/types/volume/volumes_list.go b/vendor/github.com/docker/docker/api/types/volume/volumes_list.go new file mode 100644 index 00000000..7770bcb8 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/volume/volumes_list.go @@ -0,0 +1,23 @@ +package volume + +// ---------------------------------------------------------------------------- +// DO NOT EDIT THIS FILE +// This file was generated by `swagger generate operation` +// +// See hack/swagger-gen.sh +// ---------------------------------------------------------------------------- + +import "github.com/docker/docker/api/types" + +// VolumesListOKBody volumes list o k body +// swagger:model VolumesListOKBody +type VolumesListOKBody struct { + + // List of volumes + // Required: true + Volumes []*types.Volume `json:"Volumes"` + + // Warnings that occurred when fetching the list of volumes + // Required: true + Warnings []string `json:"Warnings"` +} diff --git a/vendor/github.com/docker/docker/client/README.md b/vendor/github.com/docker/docker/client/README.md new file mode 100644 index 00000000..059dfb3c --- /dev/null +++ b/vendor/github.com/docker/docker/client/README.md @@ -0,0 +1,35 @@ +# Go client for the Docker Engine API + +The `docker` command uses this package to communicate with the daemon. It can also be used by your own Go applications to do anything the command-line interface does – running containers, pulling images, managing swarms, etc. + +For example, to list running containers (the equivalent of `docker ps`): + +```go +package main + +import ( + "context" + "fmt" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/client" +) + +func main() { + cli, err := client.NewEnvClient() + if err != nil { + panic(err) + } + + containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) + if err != nil { + panic(err) + } + + for _, container := range containers { + fmt.Printf("%s %s\n", container.ID[:10], container.Image) + } +} +``` + +[Full documentation is available on GoDoc.](https://godoc.org/github.com/docker/docker/client) diff --git a/vendor/github.com/docker/docker/client/checkpoint_create.go b/vendor/github.com/docker/docker/client/checkpoint_create.go new file mode 100644 index 00000000..0effe498 --- /dev/null +++ b/vendor/github.com/docker/docker/client/checkpoint_create.go @@ -0,0 +1,13 @@ +package client + +import ( + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// CheckpointCreate creates a checkpoint from the given container with the given name +func (cli *Client) CheckpointCreate(ctx context.Context, container string, options types.CheckpointCreateOptions) error { + resp, err := cli.post(ctx, "/containers/"+container+"/checkpoints", nil, options, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/checkpoint_delete.go b/vendor/github.com/docker/docker/client/checkpoint_delete.go new file mode 100644 index 00000000..e6e75588 --- /dev/null +++ b/vendor/github.com/docker/docker/client/checkpoint_delete.go @@ -0,0 +1,20 @@ +package client + +import ( + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// CheckpointDelete deletes the checkpoint with the given name from the given container +func (cli *Client) CheckpointDelete(ctx context.Context, containerID string, options types.CheckpointDeleteOptions) error { + query := url.Values{} + if options.CheckpointDir != "" { + query.Set("dir", options.CheckpointDir) + } + + resp, err := cli.delete(ctx, "/containers/"+containerID+"/checkpoints/"+options.CheckpointID, query, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/checkpoint_list.go b/vendor/github.com/docker/docker/client/checkpoint_list.go new file mode 100644 index 00000000..8eb720a6 --- /dev/null +++ b/vendor/github.com/docker/docker/client/checkpoint_list.go @@ -0,0 +1,28 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// CheckpointList returns the volumes configured in the docker host. +func (cli *Client) CheckpointList(ctx context.Context, container string, options types.CheckpointListOptions) ([]types.Checkpoint, error) { + var checkpoints []types.Checkpoint + + query := url.Values{} + if options.CheckpointDir != "" { + query.Set("dir", options.CheckpointDir) + } + + resp, err := cli.get(ctx, "/containers/"+container+"/checkpoints", query, nil) + if err != nil { + return checkpoints, err + } + + err = json.NewDecoder(resp.body).Decode(&checkpoints) + ensureReaderClosed(resp) + return checkpoints, err +} diff --git a/vendor/github.com/docker/docker/client/client.go b/vendor/github.com/docker/docker/client/client.go new file mode 100644 index 00000000..a9bdab6b --- /dev/null +++ b/vendor/github.com/docker/docker/client/client.go @@ -0,0 +1,246 @@ +/* +Package client is a Go client for the Docker Engine API. + +The "docker" command uses this package to communicate with the daemon. It can also +be used by your own Go applications to do anything the command-line interface does +– running containers, pulling images, managing swarms, etc. + +For more information about the Engine API, see the documentation: +https://docs.docker.com/engine/reference/api/ + +Usage + +You use the library by creating a client object and calling methods on it. The +client can be created either from environment variables with NewEnvClient, or +configured manually with NewClient. + +For example, to list running containers (the equivalent of "docker ps"): + + package main + + import ( + "context" + "fmt" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/client" + ) + + func main() { + cli, err := client.NewEnvClient() + if err != nil { + panic(err) + } + + containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) + if err != nil { + panic(err) + } + + for _, container := range containers { + fmt.Printf("%s %s\n", container.ID[:10], container.Image) + } + } + +*/ +package client + +import ( + "fmt" + "net/http" + "net/url" + "os" + "path/filepath" + "strings" + + "github.com/docker/go-connections/sockets" + "github.com/docker/go-connections/tlsconfig" +) + +// DefaultVersion is the version of the current stable API +const DefaultVersion string = "1.25" + +// Client is the API client that performs all operations +// against a docker server. +type Client struct { + // scheme sets the scheme for the client + scheme string + // host holds the server address to connect to + host string + // proto holds the client protocol i.e. unix. + proto string + // addr holds the client address. + addr string + // basePath holds the path to prepend to the requests. + basePath string + // client used to send and receive http requests. + client *http.Client + // version of the server to talk to. + version string + // custom http headers configured by users. + customHTTPHeaders map[string]string + // manualOverride is set to true when the version was set by users. + manualOverride bool +} + +// NewEnvClient initializes a new API client based on environment variables. +// Use DOCKER_HOST to set the url to the docker server. +// Use DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest. +// Use DOCKER_CERT_PATH to load the tls certificates from. +// Use DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default. +func NewEnvClient() (*Client, error) { + var client *http.Client + if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" { + options := tlsconfig.Options{ + CAFile: filepath.Join(dockerCertPath, "ca.pem"), + CertFile: filepath.Join(dockerCertPath, "cert.pem"), + KeyFile: filepath.Join(dockerCertPath, "key.pem"), + InsecureSkipVerify: os.Getenv("DOCKER_TLS_VERIFY") == "", + } + tlsc, err := tlsconfig.Client(options) + if err != nil { + return nil, err + } + + client = &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: tlsc, + }, + } + } + + host := os.Getenv("DOCKER_HOST") + if host == "" { + host = DefaultDockerHost + } + version := os.Getenv("DOCKER_API_VERSION") + if version == "" { + version = DefaultVersion + } + + cli, err := NewClient(host, version, client, nil) + if err != nil { + return cli, err + } + if os.Getenv("DOCKER_API_VERSION") != "" { + cli.manualOverride = true + } + return cli, nil +} + +// NewClient initializes a new API client for the given host and API version. +// It uses the given http client as transport. +// It also initializes the custom http headers to add to each request. +// +// It won't send any version information if the version number is empty. It is +// highly recommended that you set a version or your client may break if the +// server is upgraded. +func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) { + proto, addr, basePath, err := ParseHost(host) + if err != nil { + return nil, err + } + + if client != nil { + if _, ok := client.Transport.(*http.Transport); !ok { + return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", client.Transport) + } + } else { + transport := new(http.Transport) + sockets.ConfigureTransport(transport, proto, addr) + client = &http.Client{ + Transport: transport, + } + } + + scheme := "http" + tlsConfig := resolveTLSConfig(client.Transport) + if tlsConfig != nil { + // TODO(stevvooe): This isn't really the right way to write clients in Go. + // `NewClient` should probably only take an `*http.Client` and work from there. + // Unfortunately, the model of having a host-ish/url-thingy as the connection + // string has us confusing protocol and transport layers. We continue doing + // this to avoid breaking existing clients but this should be addressed. + scheme = "https" + } + + return &Client{ + scheme: scheme, + host: host, + proto: proto, + addr: addr, + basePath: basePath, + client: client, + version: version, + customHTTPHeaders: httpHeaders, + }, nil +} + +// Close ensures that transport.Client is closed +// especially needed while using NewClient with *http.Client = nil +// for example +// client.NewClient("unix:///var/run/docker.sock", nil, "v1.18", map[string]string{"User-Agent": "engine-api-cli-1.0"}) +func (cli *Client) Close() error { + + if t, ok := cli.client.Transport.(*http.Transport); ok { + t.CloseIdleConnections() + } + + return nil +} + +// getAPIPath returns the versioned request path to call the api. +// It appends the query parameters to the path if they are not empty. +func (cli *Client) getAPIPath(p string, query url.Values) string { + var apiPath string + if cli.version != "" { + v := strings.TrimPrefix(cli.version, "v") + apiPath = fmt.Sprintf("%s/v%s%s", cli.basePath, v, p) + } else { + apiPath = fmt.Sprintf("%s%s", cli.basePath, p) + } + + u := &url.URL{ + Path: apiPath, + } + if len(query) > 0 { + u.RawQuery = query.Encode() + } + return u.String() +} + +// ClientVersion returns the version string associated with this +// instance of the Client. Note that this value can be changed +// via the DOCKER_API_VERSION env var. +func (cli *Client) ClientVersion() string { + return cli.version +} + +// UpdateClientVersion updates the version string associated with this +// instance of the Client. +func (cli *Client) UpdateClientVersion(v string) { + if !cli.manualOverride { + cli.version = v + } + +} + +// ParseHost verifies that the given host strings is valid. +func ParseHost(host string) (string, string, string, error) { + protoAddrParts := strings.SplitN(host, "://", 2) + if len(protoAddrParts) == 1 { + return "", "", "", fmt.Errorf("unable to parse docker host `%s`", host) + } + + var basePath string + proto, addr := protoAddrParts[0], protoAddrParts[1] + if proto == "tcp" { + parsed, err := url.Parse("tcp://" + addr) + if err != nil { + return "", "", "", err + } + addr = parsed.Host + basePath = parsed.Path + } + return proto, addr, basePath, nil +} diff --git a/vendor/github.com/docker/docker/client/client_unix.go b/vendor/github.com/docker/docker/client/client_unix.go new file mode 100644 index 00000000..89de892c --- /dev/null +++ b/vendor/github.com/docker/docker/client/client_unix.go @@ -0,0 +1,6 @@ +// +build linux freebsd solaris openbsd darwin + +package client + +// DefaultDockerHost defines os specific default if DOCKER_HOST is unset +const DefaultDockerHost = "unix:///var/run/docker.sock" diff --git a/vendor/github.com/docker/docker/client/client_windows.go b/vendor/github.com/docker/docker/client/client_windows.go new file mode 100644 index 00000000..07c0c7a7 --- /dev/null +++ b/vendor/github.com/docker/docker/client/client_windows.go @@ -0,0 +1,4 @@ +package client + +// DefaultDockerHost defines os specific default if DOCKER_HOST is unset +const DefaultDockerHost = "npipe:////./pipe/docker_engine" diff --git a/vendor/github.com/docker/docker/client/container_attach.go b/vendor/github.com/docker/docker/client/container_attach.go new file mode 100644 index 00000000..eea46821 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_attach.go @@ -0,0 +1,37 @@ +package client + +import ( + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ContainerAttach attaches a connection to a container in the server. +// It returns a types.HijackedConnection with the hijacked connection +// and the a reader to get output. It's up to the called to close +// the hijacked connection by calling types.HijackedResponse.Close. +func (cli *Client) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) { + query := url.Values{} + if options.Stream { + query.Set("stream", "1") + } + if options.Stdin { + query.Set("stdin", "1") + } + if options.Stdout { + query.Set("stdout", "1") + } + if options.Stderr { + query.Set("stderr", "1") + } + if options.DetachKeys != "" { + query.Set("detachKeys", options.DetachKeys) + } + if options.Logs { + query.Set("logs", "1") + } + + headers := map[string][]string{"Content-Type": {"text/plain"}} + return cli.postHijacked(ctx, "/containers/"+container+"/attach", query, nil, headers) +} diff --git a/vendor/github.com/docker/docker/client/container_commit.go b/vendor/github.com/docker/docker/client/container_commit.go new file mode 100644 index 00000000..c766d62e --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_commit.go @@ -0,0 +1,53 @@ +package client + +import ( + "encoding/json" + "errors" + "net/url" + + distreference "github.com/docker/distribution/reference" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/reference" + "golang.org/x/net/context" +) + +// ContainerCommit applies changes into a container and creates a new tagged image. +func (cli *Client) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) { + var repository, tag string + if options.Reference != "" { + distributionRef, err := distreference.ParseNamed(options.Reference) + if err != nil { + return types.IDResponse{}, err + } + + if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical { + return types.IDResponse{}, errors.New("refusing to create a tag with a digest reference") + } + + tag = reference.GetTagFromNamedRef(distributionRef) + repository = distributionRef.Name() + } + + query := url.Values{} + query.Set("container", container) + query.Set("repo", repository) + query.Set("tag", tag) + query.Set("comment", options.Comment) + query.Set("author", options.Author) + for _, change := range options.Changes { + query.Add("changes", change) + } + if options.Pause != true { + query.Set("pause", "0") + } + + var response types.IDResponse + resp, err := cli.post(ctx, "/commit", query, options.Config, nil) + if err != nil { + return response, err + } + + err = json.NewDecoder(resp.body).Decode(&response) + ensureReaderClosed(resp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/container_copy.go b/vendor/github.com/docker/docker/client/container_copy.go new file mode 100644 index 00000000..8380eeab --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_copy.go @@ -0,0 +1,97 @@ +package client + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "path/filepath" + "strings" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/types" +) + +// ContainerStatPath returns Stat information about a path inside the container filesystem. +func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path string) (types.ContainerPathStat, error) { + query := url.Values{} + query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API. + + urlStr := fmt.Sprintf("/containers/%s/archive", containerID) + response, err := cli.head(ctx, urlStr, query, nil) + if err != nil { + return types.ContainerPathStat{}, err + } + defer ensureReaderClosed(response) + return getContainerPathStatFromHeader(response.header) +} + +// CopyToContainer copies content into the container filesystem. +func (cli *Client) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error { + query := url.Values{} + query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API. + // Do not allow for an existing directory to be overwritten by a non-directory and vice versa. + if !options.AllowOverwriteDirWithFile { + query.Set("noOverwriteDirNonDir", "true") + } + + apiPath := fmt.Sprintf("/containers/%s/archive", container) + + response, err := cli.putRaw(ctx, apiPath, query, content, nil) + if err != nil { + return err + } + defer ensureReaderClosed(response) + + if response.statusCode != http.StatusOK { + return fmt.Errorf("unexpected status code from daemon: %d", response.statusCode) + } + + return nil +} + +// CopyFromContainer gets the content from the container and returns it as a Reader +// to manipulate it in the host. It's up to the caller to close the reader. +func (cli *Client) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) { + query := make(url.Values, 1) + query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API. + + apiPath := fmt.Sprintf("/containers/%s/archive", container) + response, err := cli.get(ctx, apiPath, query, nil) + if err != nil { + return nil, types.ContainerPathStat{}, err + } + + if response.statusCode != http.StatusOK { + return nil, types.ContainerPathStat{}, fmt.Errorf("unexpected status code from daemon: %d", response.statusCode) + } + + // In order to get the copy behavior right, we need to know information + // about both the source and the destination. The response headers include + // stat info about the source that we can use in deciding exactly how to + // copy it locally. Along with the stat info about the local destination, + // we have everything we need to handle the multiple possibilities there + // can be when copying a file/dir from one location to another file/dir. + stat, err := getContainerPathStatFromHeader(response.header) + if err != nil { + return nil, stat, fmt.Errorf("unable to get resource stat from response: %s", err) + } + return response.body, stat, err +} + +func getContainerPathStatFromHeader(header http.Header) (types.ContainerPathStat, error) { + var stat types.ContainerPathStat + + encodedStat := header.Get("X-Docker-Container-Path-Stat") + statDecoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(encodedStat)) + + err := json.NewDecoder(statDecoder).Decode(&stat) + if err != nil { + err = fmt.Errorf("unable to decode container path stat header: %s", err) + } + + return stat, err +} diff --git a/vendor/github.com/docker/docker/client/container_create.go b/vendor/github.com/docker/docker/client/container_create.go new file mode 100644 index 00000000..9f627aaf --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_create.go @@ -0,0 +1,50 @@ +package client + +import ( + "encoding/json" + "net/url" + "strings" + + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/network" + "golang.org/x/net/context" +) + +type configWrapper struct { + *container.Config + HostConfig *container.HostConfig + NetworkingConfig *network.NetworkingConfig +} + +// ContainerCreate creates a new container based in the given configuration. +// It can be associated with a name, but it's not mandatory. +func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error) { + var response container.ContainerCreateCreatedBody + + if err := cli.NewVersionError("1.25", "stop timeout"); config != nil && config.StopTimeout != nil && err != nil { + return response, err + } + + query := url.Values{} + if containerName != "" { + query.Set("name", containerName) + } + + body := configWrapper{ + Config: config, + HostConfig: hostConfig, + NetworkingConfig: networkingConfig, + } + + serverResp, err := cli.post(ctx, "/containers/create", query, body, nil) + if err != nil { + if serverResp.statusCode == 404 && strings.Contains(err.Error(), "No such image") { + return response, imageNotFoundError{config.Image} + } + return response, err + } + + err = json.NewDecoder(serverResp.body).Decode(&response) + ensureReaderClosed(serverResp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/container_diff.go b/vendor/github.com/docker/docker/client/container_diff.go new file mode 100644 index 00000000..1e3e554f --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_diff.go @@ -0,0 +1,23 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ContainerDiff shows differences in a container filesystem since it was started. +func (cli *Client) ContainerDiff(ctx context.Context, containerID string) ([]types.ContainerChange, error) { + var changes []types.ContainerChange + + serverResp, err := cli.get(ctx, "/containers/"+containerID+"/changes", url.Values{}, nil) + if err != nil { + return changes, err + } + + err = json.NewDecoder(serverResp.body).Decode(&changes) + ensureReaderClosed(serverResp) + return changes, err +} diff --git a/vendor/github.com/docker/docker/client/container_exec.go b/vendor/github.com/docker/docker/client/container_exec.go new file mode 100644 index 00000000..0665c54f --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_exec.go @@ -0,0 +1,54 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ContainerExecCreate creates a new exec configuration to run an exec process. +func (cli *Client) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) { + var response types.IDResponse + + if err := cli.NewVersionError("1.25", "env"); len(config.Env) != 0 && err != nil { + return response, err + } + + resp, err := cli.post(ctx, "/containers/"+container+"/exec", nil, config, nil) + if err != nil { + return response, err + } + err = json.NewDecoder(resp.body).Decode(&response) + ensureReaderClosed(resp) + return response, err +} + +// ContainerExecStart starts an exec process already created in the docker host. +func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error { + resp, err := cli.post(ctx, "/exec/"+execID+"/start", nil, config, nil) + ensureReaderClosed(resp) + return err +} + +// ContainerExecAttach attaches a connection to an exec process in the server. +// It returns a types.HijackedConnection with the hijacked connection +// and the a reader to get output. It's up to the called to close +// the hijacked connection by calling types.HijackedResponse.Close. +func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) { + headers := map[string][]string{"Content-Type": {"application/json"}} + return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers) +} + +// ContainerExecInspect returns information about a specific exec process on the docker host. +func (cli *Client) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) { + var response types.ContainerExecInspect + resp, err := cli.get(ctx, "/exec/"+execID+"/json", nil, nil) + if err != nil { + return response, err + } + + err = json.NewDecoder(resp.body).Decode(&response) + ensureReaderClosed(resp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/container_export.go b/vendor/github.com/docker/docker/client/container_export.go new file mode 100644 index 00000000..52194f3d --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_export.go @@ -0,0 +1,20 @@ +package client + +import ( + "io" + "net/url" + + "golang.org/x/net/context" +) + +// ContainerExport retrieves the raw contents of a container +// and returns them as an io.ReadCloser. It's up to the caller +// to close the stream. +func (cli *Client) ContainerExport(ctx context.Context, containerID string) (io.ReadCloser, error) { + serverResp, err := cli.get(ctx, "/containers/"+containerID+"/export", url.Values{}, nil) + if err != nil { + return nil, err + } + + return serverResp.body, nil +} diff --git a/vendor/github.com/docker/docker/client/container_inspect.go b/vendor/github.com/docker/docker/client/container_inspect.go new file mode 100644 index 00000000..17f18097 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_inspect.go @@ -0,0 +1,54 @@ +package client + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ContainerInspect returns the container information. +func (cli *Client) ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error) { + serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", nil, nil) + if err != nil { + if serverResp.statusCode == http.StatusNotFound { + return types.ContainerJSON{}, containerNotFoundError{containerID} + } + return types.ContainerJSON{}, err + } + + var response types.ContainerJSON + err = json.NewDecoder(serverResp.body).Decode(&response) + ensureReaderClosed(serverResp) + return response, err +} + +// ContainerInspectWithRaw returns the container information and its raw representation. +func (cli *Client) ContainerInspectWithRaw(ctx context.Context, containerID string, getSize bool) (types.ContainerJSON, []byte, error) { + query := url.Values{} + if getSize { + query.Set("size", "1") + } + serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", query, nil) + if err != nil { + if serverResp.statusCode == http.StatusNotFound { + return types.ContainerJSON{}, nil, containerNotFoundError{containerID} + } + return types.ContainerJSON{}, nil, err + } + defer ensureReaderClosed(serverResp) + + body, err := ioutil.ReadAll(serverResp.body) + if err != nil { + return types.ContainerJSON{}, nil, err + } + + var response types.ContainerJSON + rdr := bytes.NewReader(body) + err = json.NewDecoder(rdr).Decode(&response) + return response, body, err +} diff --git a/vendor/github.com/docker/docker/client/container_kill.go b/vendor/github.com/docker/docker/client/container_kill.go new file mode 100644 index 00000000..29f80c73 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_kill.go @@ -0,0 +1,17 @@ +package client + +import ( + "net/url" + + "golang.org/x/net/context" +) + +// ContainerKill terminates the container process but does not remove the container from the docker host. +func (cli *Client) ContainerKill(ctx context.Context, containerID, signal string) error { + query := url.Values{} + query.Set("signal", signal) + + resp, err := cli.post(ctx, "/containers/"+containerID+"/kill", query, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/container_list.go b/vendor/github.com/docker/docker/client/container_list.go new file mode 100644 index 00000000..43989121 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_list.go @@ -0,0 +1,56 @@ +package client + +import ( + "encoding/json" + "net/url" + "strconv" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "golang.org/x/net/context" +) + +// ContainerList returns the list of containers in the docker host. +func (cli *Client) ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) { + query := url.Values{} + + if options.All { + query.Set("all", "1") + } + + if options.Limit != -1 { + query.Set("limit", strconv.Itoa(options.Limit)) + } + + if options.Since != "" { + query.Set("since", options.Since) + } + + if options.Before != "" { + query.Set("before", options.Before) + } + + if options.Size { + query.Set("size", "1") + } + + if options.Filters.Len() > 0 { + filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters) + + if err != nil { + return nil, err + } + + query.Set("filters", filterJSON) + } + + resp, err := cli.get(ctx, "/containers/json", query, nil) + if err != nil { + return nil, err + } + + var containers []types.Container + err = json.NewDecoder(resp.body).Decode(&containers) + ensureReaderClosed(resp) + return containers, err +} diff --git a/vendor/github.com/docker/docker/client/container_logs.go b/vendor/github.com/docker/docker/client/container_logs.go new file mode 100644 index 00000000..69056b63 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_logs.go @@ -0,0 +1,52 @@ +package client + +import ( + "io" + "net/url" + "time" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/types" + timetypes "github.com/docker/docker/api/types/time" +) + +// ContainerLogs returns the logs generated by a container in an io.ReadCloser. +// It's up to the caller to close the stream. +func (cli *Client) ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) { + query := url.Values{} + if options.ShowStdout { + query.Set("stdout", "1") + } + + if options.ShowStderr { + query.Set("stderr", "1") + } + + if options.Since != "" { + ts, err := timetypes.GetTimestamp(options.Since, time.Now()) + if err != nil { + return nil, err + } + query.Set("since", ts) + } + + if options.Timestamps { + query.Set("timestamps", "1") + } + + if options.Details { + query.Set("details", "1") + } + + if options.Follow { + query.Set("follow", "1") + } + query.Set("tail", options.Tail) + + resp, err := cli.get(ctx, "/containers/"+container+"/logs", query, nil) + if err != nil { + return nil, err + } + return resp.body, nil +} diff --git a/vendor/github.com/docker/docker/client/container_pause.go b/vendor/github.com/docker/docker/client/container_pause.go new file mode 100644 index 00000000..412067a7 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_pause.go @@ -0,0 +1,10 @@ +package client + +import "golang.org/x/net/context" + +// ContainerPause pauses the main process of a given container without terminating it. +func (cli *Client) ContainerPause(ctx context.Context, containerID string) error { + resp, err := cli.post(ctx, "/containers/"+containerID+"/pause", nil, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/container_prune.go b/vendor/github.com/docker/docker/client/container_prune.go new file mode 100644 index 00000000..b5821708 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_prune.go @@ -0,0 +1,36 @@ +package client + +import ( + "encoding/json" + "fmt" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "golang.org/x/net/context" +) + +// ContainersPrune requests the daemon to delete unused data +func (cli *Client) ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error) { + var report types.ContainersPruneReport + + if err := cli.NewVersionError("1.25", "container prune"); err != nil { + return report, err + } + + query, err := getFiltersQuery(pruneFilters) + if err != nil { + return report, err + } + + serverResp, err := cli.post(ctx, "/containers/prune", query, nil, nil) + if err != nil { + return report, err + } + defer ensureReaderClosed(serverResp) + + if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil { + return report, fmt.Errorf("Error retrieving disk usage: %v", err) + } + + return report, nil +} diff --git a/vendor/github.com/docker/docker/client/container_remove.go b/vendor/github.com/docker/docker/client/container_remove.go new file mode 100644 index 00000000..3a79590c --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_remove.go @@ -0,0 +1,27 @@ +package client + +import ( + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ContainerRemove kills and removes a container from the docker host. +func (cli *Client) ContainerRemove(ctx context.Context, containerID string, options types.ContainerRemoveOptions) error { + query := url.Values{} + if options.RemoveVolumes { + query.Set("v", "1") + } + if options.RemoveLinks { + query.Set("link", "1") + } + + if options.Force { + query.Set("force", "1") + } + + resp, err := cli.delete(ctx, "/containers/"+containerID, query, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/container_rename.go b/vendor/github.com/docker/docker/client/container_rename.go new file mode 100644 index 00000000..0e718da7 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_rename.go @@ -0,0 +1,16 @@ +package client + +import ( + "net/url" + + "golang.org/x/net/context" +) + +// ContainerRename changes the name of a given container. +func (cli *Client) ContainerRename(ctx context.Context, containerID, newContainerName string) error { + query := url.Values{} + query.Set("name", newContainerName) + resp, err := cli.post(ctx, "/containers/"+containerID+"/rename", query, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/container_resize.go b/vendor/github.com/docker/docker/client/container_resize.go new file mode 100644 index 00000000..66c3cc19 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_resize.go @@ -0,0 +1,29 @@ +package client + +import ( + "net/url" + "strconv" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ContainerResize changes the size of the tty for a container. +func (cli *Client) ContainerResize(ctx context.Context, containerID string, options types.ResizeOptions) error { + return cli.resize(ctx, "/containers/"+containerID, options.Height, options.Width) +} + +// ContainerExecResize changes the size of the tty for an exec process running inside a container. +func (cli *Client) ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error { + return cli.resize(ctx, "/exec/"+execID, options.Height, options.Width) +} + +func (cli *Client) resize(ctx context.Context, basePath string, height, width uint) error { + query := url.Values{} + query.Set("h", strconv.Itoa(int(height))) + query.Set("w", strconv.Itoa(int(width))) + + resp, err := cli.post(ctx, basePath+"/resize", query, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/container_restart.go b/vendor/github.com/docker/docker/client/container_restart.go new file mode 100644 index 00000000..74d7455f --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_restart.go @@ -0,0 +1,22 @@ +package client + +import ( + "net/url" + "time" + + timetypes "github.com/docker/docker/api/types/time" + "golang.org/x/net/context" +) + +// ContainerRestart stops and starts a container again. +// It makes the daemon to wait for the container to be up again for +// a specific amount of time, given the timeout. +func (cli *Client) ContainerRestart(ctx context.Context, containerID string, timeout *time.Duration) error { + query := url.Values{} + if timeout != nil { + query.Set("t", timetypes.DurationToSecondsString(*timeout)) + } + resp, err := cli.post(ctx, "/containers/"+containerID+"/restart", query, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/container_start.go b/vendor/github.com/docker/docker/client/container_start.go new file mode 100644 index 00000000..b1f08de4 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_start.go @@ -0,0 +1,24 @@ +package client + +import ( + "net/url" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/types" +) + +// ContainerStart sends a request to the docker daemon to start a container. +func (cli *Client) ContainerStart(ctx context.Context, containerID string, options types.ContainerStartOptions) error { + query := url.Values{} + if len(options.CheckpointID) != 0 { + query.Set("checkpoint", options.CheckpointID) + } + if len(options.CheckpointDir) != 0 { + query.Set("checkpoint-dir", options.CheckpointDir) + } + + resp, err := cli.post(ctx, "/containers/"+containerID+"/start", query, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/container_stats.go b/vendor/github.com/docker/docker/client/container_stats.go new file mode 100644 index 00000000..4758c66e --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_stats.go @@ -0,0 +1,26 @@ +package client + +import ( + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ContainerStats returns near realtime stats for a given container. +// It's up to the caller to close the io.ReadCloser returned. +func (cli *Client) ContainerStats(ctx context.Context, containerID string, stream bool) (types.ContainerStats, error) { + query := url.Values{} + query.Set("stream", "0") + if stream { + query.Set("stream", "1") + } + + resp, err := cli.get(ctx, "/containers/"+containerID+"/stats", query, nil) + if err != nil { + return types.ContainerStats{}, err + } + + osType := getDockerOS(resp.header.Get("Server")) + return types.ContainerStats{Body: resp.body, OSType: osType}, err +} diff --git a/vendor/github.com/docker/docker/client/container_stop.go b/vendor/github.com/docker/docker/client/container_stop.go new file mode 100644 index 00000000..b5418ae8 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_stop.go @@ -0,0 +1,21 @@ +package client + +import ( + "net/url" + "time" + + timetypes "github.com/docker/docker/api/types/time" + "golang.org/x/net/context" +) + +// ContainerStop stops a container without terminating the process. +// The process is blocked until the container stops or the timeout expires. +func (cli *Client) ContainerStop(ctx context.Context, containerID string, timeout *time.Duration) error { + query := url.Values{} + if timeout != nil { + query.Set("t", timetypes.DurationToSecondsString(*timeout)) + } + resp, err := cli.post(ctx, "/containers/"+containerID+"/stop", query, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/container_top.go b/vendor/github.com/docker/docker/client/container_top.go new file mode 100644 index 00000000..4e7270ea --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_top.go @@ -0,0 +1,28 @@ +package client + +import ( + "encoding/json" + "net/url" + "strings" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ContainerTop shows process information from within a container. +func (cli *Client) ContainerTop(ctx context.Context, containerID string, arguments []string) (types.ContainerProcessList, error) { + var response types.ContainerProcessList + query := url.Values{} + if len(arguments) > 0 { + query.Set("ps_args", strings.Join(arguments, " ")) + } + + resp, err := cli.get(ctx, "/containers/"+containerID+"/top", query, nil) + if err != nil { + return response, err + } + + err = json.NewDecoder(resp.body).Decode(&response) + ensureReaderClosed(resp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/container_unpause.go b/vendor/github.com/docker/docker/client/container_unpause.go new file mode 100644 index 00000000..5c762112 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_unpause.go @@ -0,0 +1,10 @@ +package client + +import "golang.org/x/net/context" + +// ContainerUnpause resumes the process execution within a container +func (cli *Client) ContainerUnpause(ctx context.Context, containerID string) error { + resp, err := cli.post(ctx, "/containers/"+containerID+"/unpause", nil, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/container_update.go b/vendor/github.com/docker/docker/client/container_update.go new file mode 100644 index 00000000..5082f22d --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_update.go @@ -0,0 +1,22 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types/container" + "golang.org/x/net/context" +) + +// ContainerUpdate updates resources of a container +func (cli *Client) ContainerUpdate(ctx context.Context, containerID string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) { + var response container.ContainerUpdateOKBody + serverResp, err := cli.post(ctx, "/containers/"+containerID+"/update", nil, updateConfig, nil) + if err != nil { + return response, err + } + + err = json.NewDecoder(serverResp.body).Decode(&response) + + ensureReaderClosed(serverResp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/container_wait.go b/vendor/github.com/docker/docker/client/container_wait.go new file mode 100644 index 00000000..93212c70 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_wait.go @@ -0,0 +1,26 @@ +package client + +import ( + "encoding/json" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/types/container" +) + +// ContainerWait pauses execution until a container exits. +// It returns the API status code as response of its readiness. +func (cli *Client) ContainerWait(ctx context.Context, containerID string) (int64, error) { + resp, err := cli.post(ctx, "/containers/"+containerID+"/wait", nil, nil, nil) + if err != nil { + return -1, err + } + defer ensureReaderClosed(resp) + + var res container.ContainerWaitOKBody + if err := json.NewDecoder(resp.body).Decode(&res); err != nil { + return -1, err + } + + return res.StatusCode, nil +} diff --git a/vendor/github.com/docker/docker/client/disk_usage.go b/vendor/github.com/docker/docker/client/disk_usage.go new file mode 100644 index 00000000..03c80b39 --- /dev/null +++ b/vendor/github.com/docker/docker/client/disk_usage.go @@ -0,0 +1,26 @@ +package client + +import ( + "encoding/json" + "fmt" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// DiskUsage requests the current data usage from the daemon +func (cli *Client) DiskUsage(ctx context.Context) (types.DiskUsage, error) { + var du types.DiskUsage + + serverResp, err := cli.get(ctx, "/system/df", nil, nil) + if err != nil { + return du, err + } + defer ensureReaderClosed(serverResp) + + if err := json.NewDecoder(serverResp.body).Decode(&du); err != nil { + return du, fmt.Errorf("Error retrieving disk usage: %v", err) + } + + return du, nil +} diff --git a/vendor/github.com/docker/docker/client/errors.go b/vendor/github.com/docker/docker/client/errors.go new file mode 100644 index 00000000..bf6923f1 --- /dev/null +++ b/vendor/github.com/docker/docker/client/errors.go @@ -0,0 +1,278 @@ +package client + +import ( + "fmt" + + "github.com/docker/docker/api/types/versions" + "github.com/pkg/errors" +) + +// errConnectionFailed implements an error returned when connection failed. +type errConnectionFailed struct { + host string +} + +// Error returns a string representation of an errConnectionFailed +func (err errConnectionFailed) Error() string { + if err.host == "" { + return "Cannot connect to the Docker daemon. Is the docker daemon running on this host?" + } + return fmt.Sprintf("Cannot connect to the Docker daemon at %s. Is the docker daemon running?", err.host) +} + +// IsErrConnectionFailed returns true if the error is caused by connection failed. +func IsErrConnectionFailed(err error) bool { + _, ok := errors.Cause(err).(errConnectionFailed) + return ok +} + +// ErrorConnectionFailed returns an error with host in the error message when connection to docker daemon failed. +func ErrorConnectionFailed(host string) error { + return errConnectionFailed{host: host} +} + +type notFound interface { + error + NotFound() bool // Is the error a NotFound error +} + +// IsErrNotFound returns true if the error is caused with an +// object (image, container, network, volume, …) is not found in the docker host. +func IsErrNotFound(err error) bool { + te, ok := err.(notFound) + return ok && te.NotFound() +} + +// imageNotFoundError implements an error returned when an image is not in the docker host. +type imageNotFoundError struct { + imageID string +} + +// NotFound indicates that this error type is of NotFound +func (e imageNotFoundError) NotFound() bool { + return true +} + +// Error returns a string representation of an imageNotFoundError +func (e imageNotFoundError) Error() string { + return fmt.Sprintf("Error: No such image: %s", e.imageID) +} + +// IsErrImageNotFound returns true if the error is caused +// when an image is not found in the docker host. +func IsErrImageNotFound(err error) bool { + return IsErrNotFound(err) +} + +// containerNotFoundError implements an error returned when a container is not in the docker host. +type containerNotFoundError struct { + containerID string +} + +// NotFound indicates that this error type is of NotFound +func (e containerNotFoundError) NotFound() bool { + return true +} + +// Error returns a string representation of a containerNotFoundError +func (e containerNotFoundError) Error() string { + return fmt.Sprintf("Error: No such container: %s", e.containerID) +} + +// IsErrContainerNotFound returns true if the error is caused +// when a container is not found in the docker host. +func IsErrContainerNotFound(err error) bool { + return IsErrNotFound(err) +} + +// networkNotFoundError implements an error returned when a network is not in the docker host. +type networkNotFoundError struct { + networkID string +} + +// NotFound indicates that this error type is of NotFound +func (e networkNotFoundError) NotFound() bool { + return true +} + +// Error returns a string representation of a networkNotFoundError +func (e networkNotFoundError) Error() string { + return fmt.Sprintf("Error: No such network: %s", e.networkID) +} + +// IsErrNetworkNotFound returns true if the error is caused +// when a network is not found in the docker host. +func IsErrNetworkNotFound(err error) bool { + return IsErrNotFound(err) +} + +// volumeNotFoundError implements an error returned when a volume is not in the docker host. +type volumeNotFoundError struct { + volumeID string +} + +// NotFound indicates that this error type is of NotFound +func (e volumeNotFoundError) NotFound() bool { + return true +} + +// Error returns a string representation of a volumeNotFoundError +func (e volumeNotFoundError) Error() string { + return fmt.Sprintf("Error: No such volume: %s", e.volumeID) +} + +// IsErrVolumeNotFound returns true if the error is caused +// when a volume is not found in the docker host. +func IsErrVolumeNotFound(err error) bool { + return IsErrNotFound(err) +} + +// unauthorizedError represents an authorization error in a remote registry. +type unauthorizedError struct { + cause error +} + +// Error returns a string representation of an unauthorizedError +func (u unauthorizedError) Error() string { + return u.cause.Error() +} + +// IsErrUnauthorized returns true if the error is caused +// when a remote registry authentication fails +func IsErrUnauthorized(err error) bool { + _, ok := err.(unauthorizedError) + return ok +} + +// nodeNotFoundError implements an error returned when a node is not found. +type nodeNotFoundError struct { + nodeID string +} + +// Error returns a string representation of a nodeNotFoundError +func (e nodeNotFoundError) Error() string { + return fmt.Sprintf("Error: No such node: %s", e.nodeID) +} + +// NotFound indicates that this error type is of NotFound +func (e nodeNotFoundError) NotFound() bool { + return true +} + +// IsErrNodeNotFound returns true if the error is caused +// when a node is not found. +func IsErrNodeNotFound(err error) bool { + _, ok := err.(nodeNotFoundError) + return ok +} + +// serviceNotFoundError implements an error returned when a service is not found. +type serviceNotFoundError struct { + serviceID string +} + +// Error returns a string representation of a serviceNotFoundError +func (e serviceNotFoundError) Error() string { + return fmt.Sprintf("Error: No such service: %s", e.serviceID) +} + +// NotFound indicates that this error type is of NotFound +func (e serviceNotFoundError) NotFound() bool { + return true +} + +// IsErrServiceNotFound returns true if the error is caused +// when a service is not found. +func IsErrServiceNotFound(err error) bool { + _, ok := err.(serviceNotFoundError) + return ok +} + +// taskNotFoundError implements an error returned when a task is not found. +type taskNotFoundError struct { + taskID string +} + +// Error returns a string representation of a taskNotFoundError +func (e taskNotFoundError) Error() string { + return fmt.Sprintf("Error: No such task: %s", e.taskID) +} + +// NotFound indicates that this error type is of NotFound +func (e taskNotFoundError) NotFound() bool { + return true +} + +// IsErrTaskNotFound returns true if the error is caused +// when a task is not found. +func IsErrTaskNotFound(err error) bool { + _, ok := err.(taskNotFoundError) + return ok +} + +type pluginPermissionDenied struct { + name string +} + +func (e pluginPermissionDenied) Error() string { + return "Permission denied while installing plugin " + e.name +} + +// IsErrPluginPermissionDenied returns true if the error is caused +// when a user denies a plugin's permissions +func IsErrPluginPermissionDenied(err error) bool { + _, ok := err.(pluginPermissionDenied) + return ok +} + +// NewVersionError returns an error if the APIVersion required +// if less than the current supported version +func (cli *Client) NewVersionError(APIrequired, feature string) error { + if versions.LessThan(cli.version, APIrequired) { + return fmt.Errorf("%q requires API version %s, but the Docker server is version %s", feature, APIrequired, cli.version) + } + return nil +} + +// secretNotFoundError implements an error returned when a secret is not found. +type secretNotFoundError struct { + name string +} + +// Error returns a string representation of a secretNotFoundError +func (e secretNotFoundError) Error() string { + return fmt.Sprintf("Error: no such secret: %s", e.name) +} + +// NoFound indicates that this error type is of NotFound +func (e secretNotFoundError) NotFound() bool { + return true +} + +// IsErrSecretNotFound returns true if the error is caused +// when a secret is not found. +func IsErrSecretNotFound(err error) bool { + _, ok := err.(secretNotFoundError) + return ok +} + +// pluginNotFoundError implements an error returned when a plugin is not in the docker host. +type pluginNotFoundError struct { + name string +} + +// NotFound indicates that this error type is of NotFound +func (e pluginNotFoundError) NotFound() bool { + return true +} + +// Error returns a string representation of a pluginNotFoundError +func (e pluginNotFoundError) Error() string { + return fmt.Sprintf("Error: No such plugin: %s", e.name) +} + +// IsErrPluginNotFound returns true if the error is caused +// when a plugin is not found in the docker host. +func IsErrPluginNotFound(err error) bool { + return IsErrNotFound(err) +} diff --git a/vendor/github.com/docker/docker/client/events.go b/vendor/github.com/docker/docker/client/events.go new file mode 100644 index 00000000..af47aefa --- /dev/null +++ b/vendor/github.com/docker/docker/client/events.go @@ -0,0 +1,102 @@ +package client + +import ( + "encoding/json" + "net/url" + "time" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/events" + "github.com/docker/docker/api/types/filters" + timetypes "github.com/docker/docker/api/types/time" +) + +// Events returns a stream of events in the daemon. It's up to the caller to close the stream +// by cancelling the context. Once the stream has been completely read an io.EOF error will +// be sent over the error channel. If an error is sent all processing will be stopped. It's up +// to the caller to reopen the stream in the event of an error by reinvoking this method. +func (cli *Client) Events(ctx context.Context, options types.EventsOptions) (<-chan events.Message, <-chan error) { + + messages := make(chan events.Message) + errs := make(chan error, 1) + + started := make(chan struct{}) + go func() { + defer close(errs) + + query, err := buildEventsQueryParams(cli.version, options) + if err != nil { + close(started) + errs <- err + return + } + + resp, err := cli.get(ctx, "/events", query, nil) + if err != nil { + close(started) + errs <- err + return + } + defer resp.body.Close() + + decoder := json.NewDecoder(resp.body) + + close(started) + for { + select { + case <-ctx.Done(): + errs <- ctx.Err() + return + default: + var event events.Message + if err := decoder.Decode(&event); err != nil { + errs <- err + return + } + + select { + case messages <- event: + case <-ctx.Done(): + errs <- ctx.Err() + return + } + } + } + }() + <-started + + return messages, errs +} + +func buildEventsQueryParams(cliVersion string, options types.EventsOptions) (url.Values, error) { + query := url.Values{} + ref := time.Now() + + if options.Since != "" { + ts, err := timetypes.GetTimestamp(options.Since, ref) + if err != nil { + return nil, err + } + query.Set("since", ts) + } + + if options.Until != "" { + ts, err := timetypes.GetTimestamp(options.Until, ref) + if err != nil { + return nil, err + } + query.Set("until", ts) + } + + if options.Filters.Len() > 0 { + filterJSON, err := filters.ToParamWithVersion(cliVersion, options.Filters) + if err != nil { + return nil, err + } + query.Set("filters", filterJSON) + } + + return query, nil +} diff --git a/vendor/github.com/docker/docker/client/hijack.go b/vendor/github.com/docker/docker/client/hijack.go new file mode 100644 index 00000000..74c53f52 --- /dev/null +++ b/vendor/github.com/docker/docker/client/hijack.go @@ -0,0 +1,177 @@ +package client + +import ( + "crypto/tls" + "errors" + "fmt" + "net" + "net/http" + "net/http/httputil" + "net/url" + "strings" + "time" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/pkg/tlsconfig" + "github.com/docker/go-connections/sockets" + "golang.org/x/net/context" +) + +// tlsClientCon holds tls information and a dialed connection. +type tlsClientCon struct { + *tls.Conn + rawConn net.Conn +} + +func (c *tlsClientCon) CloseWrite() error { + // Go standard tls.Conn doesn't provide the CloseWrite() method so we do it + // on its underlying connection. + if conn, ok := c.rawConn.(types.CloseWriter); ok { + return conn.CloseWrite() + } + return nil +} + +// postHijacked sends a POST request and hijacks the connection. +func (cli *Client) postHijacked(ctx context.Context, path string, query url.Values, body interface{}, headers map[string][]string) (types.HijackedResponse, error) { + bodyEncoded, err := encodeData(body) + if err != nil { + return types.HijackedResponse{}, err + } + + apiPath := cli.getAPIPath(path, query) + req, err := http.NewRequest("POST", apiPath, bodyEncoded) + if err != nil { + return types.HijackedResponse{}, err + } + req = cli.addHeaders(req, headers) + + req.Host = cli.addr + req.Header.Set("Connection", "Upgrade") + req.Header.Set("Upgrade", "tcp") + + conn, err := dial(cli.proto, cli.addr, resolveTLSConfig(cli.client.Transport)) + if err != nil { + if strings.Contains(err.Error(), "connection refused") { + return types.HijackedResponse{}, fmt.Errorf("Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?") + } + return types.HijackedResponse{}, err + } + + // When we set up a TCP connection for hijack, there could be long periods + // of inactivity (a long running command with no output) that in certain + // network setups may cause ECONNTIMEOUT, leaving the client in an unknown + // state. Setting TCP KeepAlive on the socket connection will prohibit + // ECONNTIMEOUT unless the socket connection truly is broken + if tcpConn, ok := conn.(*net.TCPConn); ok { + tcpConn.SetKeepAlive(true) + tcpConn.SetKeepAlivePeriod(30 * time.Second) + } + + clientconn := httputil.NewClientConn(conn, nil) + defer clientconn.Close() + + // Server hijacks the connection, error 'connection closed' expected + _, err = clientconn.Do(req) + + rwc, br := clientconn.Hijack() + + return types.HijackedResponse{Conn: rwc, Reader: br}, err +} + +func tlsDial(network, addr string, config *tls.Config) (net.Conn, error) { + return tlsDialWithDialer(new(net.Dialer), network, addr, config) +} + +// We need to copy Go's implementation of tls.Dial (pkg/cryptor/tls/tls.go) in +// order to return our custom tlsClientCon struct which holds both the tls.Conn +// object _and_ its underlying raw connection. The rationale for this is that +// we need to be able to close the write end of the connection when attaching, +// which tls.Conn does not provide. +func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Config) (net.Conn, error) { + // We want the Timeout and Deadline values from dialer to cover the + // whole process: TCP connection and TLS handshake. This means that we + // also need to start our own timers now. + timeout := dialer.Timeout + + if !dialer.Deadline.IsZero() { + deadlineTimeout := dialer.Deadline.Sub(time.Now()) + if timeout == 0 || deadlineTimeout < timeout { + timeout = deadlineTimeout + } + } + + var errChannel chan error + + if timeout != 0 { + errChannel = make(chan error, 2) + time.AfterFunc(timeout, func() { + errChannel <- errors.New("") + }) + } + + proxyDialer, err := sockets.DialerFromEnvironment(dialer) + if err != nil { + return nil, err + } + + rawConn, err := proxyDialer.Dial(network, addr) + if err != nil { + return nil, err + } + // When we set up a TCP connection for hijack, there could be long periods + // of inactivity (a long running command with no output) that in certain + // network setups may cause ECONNTIMEOUT, leaving the client in an unknown + // state. Setting TCP KeepAlive on the socket connection will prohibit + // ECONNTIMEOUT unless the socket connection truly is broken + if tcpConn, ok := rawConn.(*net.TCPConn); ok { + tcpConn.SetKeepAlive(true) + tcpConn.SetKeepAlivePeriod(30 * time.Second) + } + + colonPos := strings.LastIndex(addr, ":") + if colonPos == -1 { + colonPos = len(addr) + } + hostname := addr[:colonPos] + + // If no ServerName is set, infer the ServerName + // from the hostname we're connecting to. + if config.ServerName == "" { + // Make a copy to avoid polluting argument or default. + config = tlsconfig.Clone(config) + config.ServerName = hostname + } + + conn := tls.Client(rawConn, config) + + if timeout == 0 { + err = conn.Handshake() + } else { + go func() { + errChannel <- conn.Handshake() + }() + + err = <-errChannel + } + + if err != nil { + rawConn.Close() + return nil, err + } + + // This is Docker difference with standard's crypto/tls package: returned a + // wrapper which holds both the TLS and raw connections. + return &tlsClientCon{conn, rawConn}, nil +} + +func dial(proto, addr string, tlsConfig *tls.Config) (net.Conn, error) { + if tlsConfig != nil && proto != "unix" && proto != "npipe" { + // Notice this isn't Go standard's tls.Dial function + return tlsDial(proto, addr, tlsConfig) + } + if proto == "npipe" { + return sockets.DialPipe(addr, 32*time.Second) + } + return net.Dial(proto, addr) +} diff --git a/vendor/github.com/docker/docker/client/image_build.go b/vendor/github.com/docker/docker/client/image_build.go new file mode 100644 index 00000000..6fde75dc --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_build.go @@ -0,0 +1,123 @@ +package client + +import ( + "encoding/base64" + "encoding/json" + "io" + "net/http" + "net/url" + "strconv" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" +) + +// ImageBuild sends request to the daemon to build images. +// The Body in the response implement an io.ReadCloser and it's up to the caller to +// close it. +func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) { + query, err := cli.imageBuildOptionsToQuery(options) + if err != nil { + return types.ImageBuildResponse{}, err + } + + headers := http.Header(make(map[string][]string)) + buf, err := json.Marshal(options.AuthConfigs) + if err != nil { + return types.ImageBuildResponse{}, err + } + headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf)) + headers.Set("Content-Type", "application/tar") + + serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers) + if err != nil { + return types.ImageBuildResponse{}, err + } + + osType := getDockerOS(serverResp.header.Get("Server")) + + return types.ImageBuildResponse{ + Body: serverResp.body, + OSType: osType, + }, nil +} + +func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (url.Values, error) { + query := url.Values{ + "t": options.Tags, + "securityopt": options.SecurityOpt, + } + if options.SuppressOutput { + query.Set("q", "1") + } + if options.RemoteContext != "" { + query.Set("remote", options.RemoteContext) + } + if options.NoCache { + query.Set("nocache", "1") + } + if options.Remove { + query.Set("rm", "1") + } else { + query.Set("rm", "0") + } + + if options.ForceRemove { + query.Set("forcerm", "1") + } + + if options.PullParent { + query.Set("pull", "1") + } + + if options.Squash { + if err := cli.NewVersionError("1.25", "squash"); err != nil { + return query, err + } + query.Set("squash", "1") + } + + if !container.Isolation.IsDefault(options.Isolation) { + query.Set("isolation", string(options.Isolation)) + } + + query.Set("cpusetcpus", options.CPUSetCPUs) + query.Set("networkmode", options.NetworkMode) + query.Set("cpusetmems", options.CPUSetMems) + query.Set("cpushares", strconv.FormatInt(options.CPUShares, 10)) + query.Set("cpuquota", strconv.FormatInt(options.CPUQuota, 10)) + query.Set("cpuperiod", strconv.FormatInt(options.CPUPeriod, 10)) + query.Set("memory", strconv.FormatInt(options.Memory, 10)) + query.Set("memswap", strconv.FormatInt(options.MemorySwap, 10)) + query.Set("cgroupparent", options.CgroupParent) + query.Set("shmsize", strconv.FormatInt(options.ShmSize, 10)) + query.Set("dockerfile", options.Dockerfile) + + ulimitsJSON, err := json.Marshal(options.Ulimits) + if err != nil { + return query, err + } + query.Set("ulimits", string(ulimitsJSON)) + + buildArgsJSON, err := json.Marshal(options.BuildArgs) + if err != nil { + return query, err + } + query.Set("buildargs", string(buildArgsJSON)) + + labelsJSON, err := json.Marshal(options.Labels) + if err != nil { + return query, err + } + query.Set("labels", string(labelsJSON)) + + cacheFromJSON, err := json.Marshal(options.CacheFrom) + if err != nil { + return query, err + } + query.Set("cachefrom", string(cacheFromJSON)) + + return query, nil +} diff --git a/vendor/github.com/docker/docker/client/image_create.go b/vendor/github.com/docker/docker/client/image_create.go new file mode 100644 index 00000000..cf023a71 --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_create.go @@ -0,0 +1,34 @@ +package client + +import ( + "io" + "net/url" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/reference" +) + +// ImageCreate creates a new image based in the parent options. +// It returns the JSON content in the response body. +func (cli *Client) ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) { + repository, tag, err := reference.Parse(parentReference) + if err != nil { + return nil, err + } + + query := url.Values{} + query.Set("fromImage", repository) + query.Set("tag", tag) + resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth) + if err != nil { + return nil, err + } + return resp.body, nil +} + +func (cli *Client) tryImageCreate(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { + headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + return cli.post(ctx, "/images/create", query, nil, headers) +} diff --git a/vendor/github.com/docker/docker/client/image_history.go b/vendor/github.com/docker/docker/client/image_history.go new file mode 100644 index 00000000..acb1ee92 --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_history.go @@ -0,0 +1,22 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ImageHistory returns the changes in an image in history format. +func (cli *Client) ImageHistory(ctx context.Context, imageID string) ([]types.ImageHistory, error) { + var history []types.ImageHistory + serverResp, err := cli.get(ctx, "/images/"+imageID+"/history", url.Values{}, nil) + if err != nil { + return history, err + } + + err = json.NewDecoder(serverResp.body).Decode(&history) + ensureReaderClosed(serverResp) + return history, err +} diff --git a/vendor/github.com/docker/docker/client/image_import.go b/vendor/github.com/docker/docker/client/image_import.go new file mode 100644 index 00000000..c6f154b2 --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_import.go @@ -0,0 +1,37 @@ +package client + +import ( + "io" + "net/url" + + "golang.org/x/net/context" + + "github.com/docker/distribution/reference" + "github.com/docker/docker/api/types" +) + +// ImageImport creates a new image based in the source options. +// It returns the JSON content in the response body. +func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error) { + if ref != "" { + //Check if the given image name can be resolved + if _, err := reference.ParseNamed(ref); err != nil { + return nil, err + } + } + + query := url.Values{} + query.Set("fromSrc", source.SourceName) + query.Set("repo", ref) + query.Set("tag", options.Tag) + query.Set("message", options.Message) + for _, change := range options.Changes { + query.Add("changes", change) + } + + resp, err := cli.postRaw(ctx, "/images/create", query, source.Source, nil) + if err != nil { + return nil, err + } + return resp.body, nil +} diff --git a/vendor/github.com/docker/docker/client/image_inspect.go b/vendor/github.com/docker/docker/client/image_inspect.go new file mode 100644 index 00000000..b3a64ce2 --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_inspect.go @@ -0,0 +1,33 @@ +package client + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ImageInspectWithRaw returns the image information and its raw representation. +func (cli *Client) ImageInspectWithRaw(ctx context.Context, imageID string) (types.ImageInspect, []byte, error) { + serverResp, err := cli.get(ctx, "/images/"+imageID+"/json", nil, nil) + if err != nil { + if serverResp.statusCode == http.StatusNotFound { + return types.ImageInspect{}, nil, imageNotFoundError{imageID} + } + return types.ImageInspect{}, nil, err + } + defer ensureReaderClosed(serverResp) + + body, err := ioutil.ReadAll(serverResp.body) + if err != nil { + return types.ImageInspect{}, nil, err + } + + var response types.ImageInspect + rdr := bytes.NewReader(body) + err = json.NewDecoder(rdr).Decode(&response) + return response, body, err +} diff --git a/vendor/github.com/docker/docker/client/image_list.go b/vendor/github.com/docker/docker/client/image_list.go new file mode 100644 index 00000000..f26464f6 --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_list.go @@ -0,0 +1,45 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/versions" + "golang.org/x/net/context" +) + +// ImageList returns a list of images in the docker host. +func (cli *Client) ImageList(ctx context.Context, options types.ImageListOptions) ([]types.ImageSummary, error) { + var images []types.ImageSummary + query := url.Values{} + + optionFilters := options.Filters + referenceFilters := optionFilters.Get("reference") + if versions.LessThan(cli.version, "1.25") && len(referenceFilters) > 0 { + query.Set("filter", referenceFilters[0]) + for _, filterValue := range referenceFilters { + optionFilters.Del("reference", filterValue) + } + } + if optionFilters.Len() > 0 { + filterJSON, err := filters.ToParamWithVersion(cli.version, optionFilters) + if err != nil { + return images, err + } + query.Set("filters", filterJSON) + } + if options.All { + query.Set("all", "1") + } + + serverResp, err := cli.get(ctx, "/images/json", query, nil) + if err != nil { + return images, err + } + + err = json.NewDecoder(serverResp.body).Decode(&images) + ensureReaderClosed(serverResp) + return images, err +} diff --git a/vendor/github.com/docker/docker/client/image_load.go b/vendor/github.com/docker/docker/client/image_load.go new file mode 100644 index 00000000..77aaf1af --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_load.go @@ -0,0 +1,30 @@ +package client + +import ( + "io" + "net/url" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/types" +) + +// ImageLoad loads an image in the docker host from the client host. +// It's up to the caller to close the io.ReadCloser in the +// ImageLoadResponse returned by this function. +func (cli *Client) ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) { + v := url.Values{} + v.Set("quiet", "0") + if quiet { + v.Set("quiet", "1") + } + headers := map[string][]string{"Content-Type": {"application/x-tar"}} + resp, err := cli.postRaw(ctx, "/images/load", v, input, headers) + if err != nil { + return types.ImageLoadResponse{}, err + } + return types.ImageLoadResponse{ + Body: resp.body, + JSON: resp.header.Get("Content-Type") == "application/json", + }, nil +} diff --git a/vendor/github.com/docker/docker/client/image_prune.go b/vendor/github.com/docker/docker/client/image_prune.go new file mode 100644 index 00000000..5ef98b7f --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_prune.go @@ -0,0 +1,36 @@ +package client + +import ( + "encoding/json" + "fmt" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "golang.org/x/net/context" +) + +// ImagesPrune requests the daemon to delete unused data +func (cli *Client) ImagesPrune(ctx context.Context, pruneFilters filters.Args) (types.ImagesPruneReport, error) { + var report types.ImagesPruneReport + + if err := cli.NewVersionError("1.25", "image prune"); err != nil { + return report, err + } + + query, err := getFiltersQuery(pruneFilters) + if err != nil { + return report, err + } + + serverResp, err := cli.post(ctx, "/images/prune", query, nil, nil) + if err != nil { + return report, err + } + defer ensureReaderClosed(serverResp) + + if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil { + return report, fmt.Errorf("Error retrieving disk usage: %v", err) + } + + return report, nil +} diff --git a/vendor/github.com/docker/docker/client/image_pull.go b/vendor/github.com/docker/docker/client/image_pull.go new file mode 100644 index 00000000..3bffdb70 --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_pull.go @@ -0,0 +1,46 @@ +package client + +import ( + "io" + "net/http" + "net/url" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/reference" +) + +// ImagePull requests the docker host to pull an image from a remote registry. +// It executes the privileged function if the operation is unauthorized +// and it tries one more time. +// It's up to the caller to handle the io.ReadCloser and close it properly. +// +// FIXME(vdemeester): there is currently used in a few way in docker/docker +// - if not in trusted content, ref is used to pass the whole reference, and tag is empty +// - if in trusted content, ref is used to pass the reference name, and tag for the digest +func (cli *Client) ImagePull(ctx context.Context, ref string, options types.ImagePullOptions) (io.ReadCloser, error) { + repository, tag, err := reference.Parse(ref) + if err != nil { + return nil, err + } + + query := url.Values{} + query.Set("fromImage", repository) + if tag != "" && !options.All { + query.Set("tag", tag) + } + + resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth) + if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil { + newAuthHeader, privilegeErr := options.PrivilegeFunc() + if privilegeErr != nil { + return nil, privilegeErr + } + resp, err = cli.tryImageCreate(ctx, query, newAuthHeader) + } + if err != nil { + return nil, err + } + return resp.body, nil +} diff --git a/vendor/github.com/docker/docker/client/image_push.go b/vendor/github.com/docker/docker/client/image_push.go new file mode 100644 index 00000000..8e73d28f --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_push.go @@ -0,0 +1,54 @@ +package client + +import ( + "errors" + "io" + "net/http" + "net/url" + + "golang.org/x/net/context" + + distreference "github.com/docker/distribution/reference" + "github.com/docker/docker/api/types" +) + +// ImagePush requests the docker host to push an image to a remote registry. +// It executes the privileged function if the operation is unauthorized +// and it tries one more time. +// It's up to the caller to handle the io.ReadCloser and close it properly. +func (cli *Client) ImagePush(ctx context.Context, ref string, options types.ImagePushOptions) (io.ReadCloser, error) { + distributionRef, err := distreference.ParseNamed(ref) + if err != nil { + return nil, err + } + + if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical { + return nil, errors.New("cannot push a digest reference") + } + + var tag = "" + if nameTaggedRef, isNamedTagged := distributionRef.(distreference.NamedTagged); isNamedTagged { + tag = nameTaggedRef.Tag() + } + + query := url.Values{} + query.Set("tag", tag) + + resp, err := cli.tryImagePush(ctx, distributionRef.Name(), query, options.RegistryAuth) + if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil { + newAuthHeader, privilegeErr := options.PrivilegeFunc() + if privilegeErr != nil { + return nil, privilegeErr + } + resp, err = cli.tryImagePush(ctx, distributionRef.Name(), query, newAuthHeader) + } + if err != nil { + return nil, err + } + return resp.body, nil +} + +func (cli *Client) tryImagePush(ctx context.Context, imageID string, query url.Values, registryAuth string) (serverResponse, error) { + headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + return cli.post(ctx, "/images/"+imageID+"/push", query, nil, headers) +} diff --git a/vendor/github.com/docker/docker/client/image_remove.go b/vendor/github.com/docker/docker/client/image_remove.go new file mode 100644 index 00000000..839e5311 --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_remove.go @@ -0,0 +1,31 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ImageRemove removes an image from the docker host. +func (cli *Client) ImageRemove(ctx context.Context, imageID string, options types.ImageRemoveOptions) ([]types.ImageDelete, error) { + query := url.Values{} + + if options.Force { + query.Set("force", "1") + } + if !options.PruneChildren { + query.Set("noprune", "1") + } + + resp, err := cli.delete(ctx, "/images/"+imageID, query, nil) + if err != nil { + return nil, err + } + + var dels []types.ImageDelete + err = json.NewDecoder(resp.body).Decode(&dels) + ensureReaderClosed(resp) + return dels, err +} diff --git a/vendor/github.com/docker/docker/client/image_save.go b/vendor/github.com/docker/docker/client/image_save.go new file mode 100644 index 00000000..ecac880a --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_save.go @@ -0,0 +1,22 @@ +package client + +import ( + "io" + "net/url" + + "golang.org/x/net/context" +) + +// ImageSave retrieves one or more images from the docker host as an io.ReadCloser. +// It's up to the caller to store the images and close the stream. +func (cli *Client) ImageSave(ctx context.Context, imageIDs []string) (io.ReadCloser, error) { + query := url.Values{ + "names": imageIDs, + } + + resp, err := cli.get(ctx, "/images/get", query, nil) + if err != nil { + return nil, err + } + return resp.body, nil +} diff --git a/vendor/github.com/docker/docker/client/image_search.go b/vendor/github.com/docker/docker/client/image_search.go new file mode 100644 index 00000000..b0fcd5c2 --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_search.go @@ -0,0 +1,51 @@ +package client + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/registry" + "golang.org/x/net/context" +) + +// ImageSearch makes the docker host to search by a term in a remote registry. +// The list of results is not sorted in any fashion. +func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) { + var results []registry.SearchResult + query := url.Values{} + query.Set("term", term) + query.Set("limit", fmt.Sprintf("%d", options.Limit)) + + if options.Filters.Len() > 0 { + filterJSON, err := filters.ToParam(options.Filters) + if err != nil { + return results, err + } + query.Set("filters", filterJSON) + } + + resp, err := cli.tryImageSearch(ctx, query, options.RegistryAuth) + if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil { + newAuthHeader, privilegeErr := options.PrivilegeFunc() + if privilegeErr != nil { + return results, privilegeErr + } + resp, err = cli.tryImageSearch(ctx, query, newAuthHeader) + } + if err != nil { + return results, err + } + + err = json.NewDecoder(resp.body).Decode(&results) + ensureReaderClosed(resp) + return results, err +} + +func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { + headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + return cli.get(ctx, "/images/search", query, headers) +} diff --git a/vendor/github.com/docker/docker/client/image_tag.go b/vendor/github.com/docker/docker/client/image_tag.go new file mode 100644 index 00000000..bdbf94ad --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_tag.go @@ -0,0 +1,34 @@ +package client + +import ( + "errors" + "fmt" + "net/url" + + "golang.org/x/net/context" + + distreference "github.com/docker/distribution/reference" + "github.com/docker/docker/api/types/reference" +) + +// ImageTag tags an image in the docker host +func (cli *Client) ImageTag(ctx context.Context, imageID, ref string) error { + distributionRef, err := distreference.ParseNamed(ref) + if err != nil { + return fmt.Errorf("Error parsing reference: %q is not a valid repository/tag", ref) + } + + if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical { + return errors.New("refusing to create a tag with a digest reference") + } + + tag := reference.GetTagFromNamedRef(distributionRef) + + query := url.Values{} + query.Set("repo", distributionRef.Name()) + query.Set("tag", tag) + + resp, err := cli.post(ctx, "/images/"+imageID+"/tag", query, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/info.go b/vendor/github.com/docker/docker/client/info.go new file mode 100644 index 00000000..ac079612 --- /dev/null +++ b/vendor/github.com/docker/docker/client/info.go @@ -0,0 +1,26 @@ +package client + +import ( + "encoding/json" + "fmt" + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// Info returns information about the docker server. +func (cli *Client) Info(ctx context.Context) (types.Info, error) { + var info types.Info + serverResp, err := cli.get(ctx, "/info", url.Values{}, nil) + if err != nil { + return info, err + } + defer ensureReaderClosed(serverResp) + + if err := json.NewDecoder(serverResp.body).Decode(&info); err != nil { + return info, fmt.Errorf("Error reading remote info: %v", err) + } + + return info, nil +} diff --git a/vendor/github.com/docker/docker/client/interface.go b/vendor/github.com/docker/docker/client/interface.go new file mode 100644 index 00000000..05978039 --- /dev/null +++ b/vendor/github.com/docker/docker/client/interface.go @@ -0,0 +1,171 @@ +package client + +import ( + "io" + "time" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/events" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/network" + "github.com/docker/docker/api/types/registry" + "github.com/docker/docker/api/types/swarm" + volumetypes "github.com/docker/docker/api/types/volume" + "golang.org/x/net/context" +) + +// CommonAPIClient is the common methods between stable and experimental versions of APIClient. +type CommonAPIClient interface { + ContainerAPIClient + ImageAPIClient + NodeAPIClient + NetworkAPIClient + PluginAPIClient + ServiceAPIClient + SwarmAPIClient + SecretAPIClient + SystemAPIClient + VolumeAPIClient + ClientVersion() string + ServerVersion(ctx context.Context) (types.Version, error) + UpdateClientVersion(v string) +} + +// ContainerAPIClient defines API client methods for the containers +type ContainerAPIClient interface { + ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) + ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) + ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error) + ContainerDiff(ctx context.Context, container string) ([]types.ContainerChange, error) + ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) + ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) + ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) + ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error + ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error + ContainerExport(ctx context.Context, container string) (io.ReadCloser, error) + ContainerInspect(ctx context.Context, container string) (types.ContainerJSON, error) + ContainerInspectWithRaw(ctx context.Context, container string, getSize bool) (types.ContainerJSON, []byte, error) + ContainerKill(ctx context.Context, container, signal string) error + ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) + ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) + ContainerPause(ctx context.Context, container string) error + ContainerRemove(ctx context.Context, container string, options types.ContainerRemoveOptions) error + ContainerRename(ctx context.Context, container, newContainerName string) error + ContainerResize(ctx context.Context, container string, options types.ResizeOptions) error + ContainerRestart(ctx context.Context, container string, timeout *time.Duration) error + ContainerStatPath(ctx context.Context, container, path string) (types.ContainerPathStat, error) + ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error) + ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error + ContainerStop(ctx context.Context, container string, timeout *time.Duration) error + ContainerTop(ctx context.Context, container string, arguments []string) (types.ContainerProcessList, error) + ContainerUnpause(ctx context.Context, container string) error + ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) + ContainerWait(ctx context.Context, container string) (int64, error) + CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) + CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error + ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error) +} + +// ImageAPIClient defines API client methods for the images +type ImageAPIClient interface { + ImageBuild(ctx context.Context, context io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) + ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) + ImageHistory(ctx context.Context, image string) ([]types.ImageHistory, error) + ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error) + ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error) + ImageList(ctx context.Context, options types.ImageListOptions) ([]types.ImageSummary, error) + ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) + ImagePull(ctx context.Context, ref string, options types.ImagePullOptions) (io.ReadCloser, error) + ImagePush(ctx context.Context, ref string, options types.ImagePushOptions) (io.ReadCloser, error) + ImageRemove(ctx context.Context, image string, options types.ImageRemoveOptions) ([]types.ImageDelete, error) + ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) + ImageSave(ctx context.Context, images []string) (io.ReadCloser, error) + ImageTag(ctx context.Context, image, ref string) error + ImagesPrune(ctx context.Context, pruneFilter filters.Args) (types.ImagesPruneReport, error) +} + +// NetworkAPIClient defines API client methods for the networks +type NetworkAPIClient interface { + NetworkConnect(ctx context.Context, networkID, container string, config *network.EndpointSettings) error + NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) + NetworkDisconnect(ctx context.Context, networkID, container string, force bool) error + NetworkInspect(ctx context.Context, networkID string) (types.NetworkResource, error) + NetworkInspectWithRaw(ctx context.Context, networkID string) (types.NetworkResource, []byte, error) + NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error) + NetworkRemove(ctx context.Context, networkID string) error + NetworksPrune(ctx context.Context, pruneFilter filters.Args) (types.NetworksPruneReport, error) +} + +// NodeAPIClient defines API client methods for the nodes +type NodeAPIClient interface { + NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm.Node, []byte, error) + NodeList(ctx context.Context, options types.NodeListOptions) ([]swarm.Node, error) + NodeRemove(ctx context.Context, nodeID string, options types.NodeRemoveOptions) error + NodeUpdate(ctx context.Context, nodeID string, version swarm.Version, node swarm.NodeSpec) error +} + +// PluginAPIClient defines API client methods for the plugins +type PluginAPIClient interface { + PluginList(ctx context.Context) (types.PluginsListResponse, error) + PluginRemove(ctx context.Context, name string, options types.PluginRemoveOptions) error + PluginEnable(ctx context.Context, name string, options types.PluginEnableOptions) error + PluginDisable(ctx context.Context, name string, options types.PluginDisableOptions) error + PluginInstall(ctx context.Context, name string, options types.PluginInstallOptions) (io.ReadCloser, error) + PluginUpgrade(ctx context.Context, name string, options types.PluginInstallOptions) (io.ReadCloser, error) + PluginPush(ctx context.Context, name string, registryAuth string) (io.ReadCloser, error) + PluginSet(ctx context.Context, name string, args []string) error + PluginInspectWithRaw(ctx context.Context, name string) (*types.Plugin, []byte, error) + PluginCreate(ctx context.Context, createContext io.Reader, options types.PluginCreateOptions) error +} + +// ServiceAPIClient defines API client methods for the services +type ServiceAPIClient interface { + ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error) + ServiceInspectWithRaw(ctx context.Context, serviceID string) (swarm.Service, []byte, error) + ServiceList(ctx context.Context, options types.ServiceListOptions) ([]swarm.Service, error) + ServiceRemove(ctx context.Context, serviceID string) error + ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) + ServiceLogs(ctx context.Context, serviceID string, options types.ContainerLogsOptions) (io.ReadCloser, error) + TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) + TaskList(ctx context.Context, options types.TaskListOptions) ([]swarm.Task, error) +} + +// SwarmAPIClient defines API client methods for the swarm +type SwarmAPIClient interface { + SwarmInit(ctx context.Context, req swarm.InitRequest) (string, error) + SwarmJoin(ctx context.Context, req swarm.JoinRequest) error + SwarmGetUnlockKey(ctx context.Context) (types.SwarmUnlockKeyResponse, error) + SwarmUnlock(ctx context.Context, req swarm.UnlockRequest) error + SwarmLeave(ctx context.Context, force bool) error + SwarmInspect(ctx context.Context) (swarm.Swarm, error) + SwarmUpdate(ctx context.Context, version swarm.Version, swarm swarm.Spec, flags swarm.UpdateFlags) error +} + +// SystemAPIClient defines API client methods for the system +type SystemAPIClient interface { + Events(ctx context.Context, options types.EventsOptions) (<-chan events.Message, <-chan error) + Info(ctx context.Context) (types.Info, error) + RegistryLogin(ctx context.Context, auth types.AuthConfig) (registry.AuthenticateOKBody, error) + DiskUsage(ctx context.Context) (types.DiskUsage, error) + Ping(ctx context.Context) (types.Ping, error) +} + +// VolumeAPIClient defines API client methods for the volumes +type VolumeAPIClient interface { + VolumeCreate(ctx context.Context, options volumetypes.VolumesCreateBody) (types.Volume, error) + VolumeInspect(ctx context.Context, volumeID string) (types.Volume, error) + VolumeInspectWithRaw(ctx context.Context, volumeID string) (types.Volume, []byte, error) + VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumesListOKBody, error) + VolumeRemove(ctx context.Context, volumeID string, force bool) error + VolumesPrune(ctx context.Context, pruneFilter filters.Args) (types.VolumesPruneReport, error) +} + +// SecretAPIClient defines API client methods for secrets +type SecretAPIClient interface { + SecretList(ctx context.Context, options types.SecretListOptions) ([]swarm.Secret, error) + SecretCreate(ctx context.Context, secret swarm.SecretSpec) (types.SecretCreateResponse, error) + SecretRemove(ctx context.Context, id string) error + SecretInspectWithRaw(ctx context.Context, name string) (swarm.Secret, []byte, error) + SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error +} diff --git a/vendor/github.com/docker/docker/client/interface_experimental.go b/vendor/github.com/docker/docker/client/interface_experimental.go new file mode 100644 index 00000000..51da98ec --- /dev/null +++ b/vendor/github.com/docker/docker/client/interface_experimental.go @@ -0,0 +1,17 @@ +package client + +import ( + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +type apiClientExperimental interface { + CheckpointAPIClient +} + +// CheckpointAPIClient defines API client methods for the checkpoints +type CheckpointAPIClient interface { + CheckpointCreate(ctx context.Context, container string, options types.CheckpointCreateOptions) error + CheckpointDelete(ctx context.Context, container string, options types.CheckpointDeleteOptions) error + CheckpointList(ctx context.Context, container string, options types.CheckpointListOptions) ([]types.Checkpoint, error) +} diff --git a/vendor/github.com/docker/docker/client/interface_stable.go b/vendor/github.com/docker/docker/client/interface_stable.go new file mode 100644 index 00000000..cc90a3cb --- /dev/null +++ b/vendor/github.com/docker/docker/client/interface_stable.go @@ -0,0 +1,10 @@ +package client + +// APIClient is an interface that clients that talk with a docker server must implement. +type APIClient interface { + CommonAPIClient + apiClientExperimental +} + +// Ensure that Client always implements APIClient. +var _ APIClient = &Client{} diff --git a/vendor/github.com/docker/docker/client/login.go b/vendor/github.com/docker/docker/client/login.go new file mode 100644 index 00000000..600dc719 --- /dev/null +++ b/vendor/github.com/docker/docker/client/login.go @@ -0,0 +1,29 @@ +package client + +import ( + "encoding/json" + "net/http" + "net/url" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/registry" + "golang.org/x/net/context" +) + +// RegistryLogin authenticates the docker server with a given docker registry. +// It returns UnauthorizerError when the authentication fails. +func (cli *Client) RegistryLogin(ctx context.Context, auth types.AuthConfig) (registry.AuthenticateOKBody, error) { + resp, err := cli.post(ctx, "/auth", url.Values{}, auth, nil) + + if resp.statusCode == http.StatusUnauthorized { + return registry.AuthenticateOKBody{}, unauthorizedError{err} + } + if err != nil { + return registry.AuthenticateOKBody{}, err + } + + var response registry.AuthenticateOKBody + err = json.NewDecoder(resp.body).Decode(&response) + ensureReaderClosed(resp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/network_connect.go b/vendor/github.com/docker/docker/client/network_connect.go new file mode 100644 index 00000000..c022c17b --- /dev/null +++ b/vendor/github.com/docker/docker/client/network_connect.go @@ -0,0 +1,18 @@ +package client + +import ( + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/network" + "golang.org/x/net/context" +) + +// NetworkConnect connects a container to an existent network in the docker host. +func (cli *Client) NetworkConnect(ctx context.Context, networkID, containerID string, config *network.EndpointSettings) error { + nc := types.NetworkConnect{ + Container: containerID, + EndpointConfig: config, + } + resp, err := cli.post(ctx, "/networks/"+networkID+"/connect", nil, nc, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/network_create.go b/vendor/github.com/docker/docker/client/network_create.go new file mode 100644 index 00000000..4067a541 --- /dev/null +++ b/vendor/github.com/docker/docker/client/network_create.go @@ -0,0 +1,25 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// NetworkCreate creates a new network in the docker host. +func (cli *Client) NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) { + networkCreateRequest := types.NetworkCreateRequest{ + NetworkCreate: options, + Name: name, + } + var response types.NetworkCreateResponse + serverResp, err := cli.post(ctx, "/networks/create", nil, networkCreateRequest, nil) + if err != nil { + return response, err + } + + json.NewDecoder(serverResp.body).Decode(&response) + ensureReaderClosed(serverResp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/network_disconnect.go b/vendor/github.com/docker/docker/client/network_disconnect.go new file mode 100644 index 00000000..24b58e3c --- /dev/null +++ b/vendor/github.com/docker/docker/client/network_disconnect.go @@ -0,0 +1,14 @@ +package client + +import ( + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// NetworkDisconnect disconnects a container from an existent network in the docker host. +func (cli *Client) NetworkDisconnect(ctx context.Context, networkID, containerID string, force bool) error { + nd := types.NetworkDisconnect{Container: containerID, Force: force} + resp, err := cli.post(ctx, "/networks/"+networkID+"/disconnect", nil, nd, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/network_inspect.go b/vendor/github.com/docker/docker/client/network_inspect.go new file mode 100644 index 00000000..5ad4ea5b --- /dev/null +++ b/vendor/github.com/docker/docker/client/network_inspect.go @@ -0,0 +1,38 @@ +package client + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// NetworkInspect returns the information for a specific network configured in the docker host. +func (cli *Client) NetworkInspect(ctx context.Context, networkID string) (types.NetworkResource, error) { + networkResource, _, err := cli.NetworkInspectWithRaw(ctx, networkID) + return networkResource, err +} + +// NetworkInspectWithRaw returns the information for a specific network configured in the docker host and its raw representation. +func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string) (types.NetworkResource, []byte, error) { + var networkResource types.NetworkResource + resp, err := cli.get(ctx, "/networks/"+networkID, nil, nil) + if err != nil { + if resp.statusCode == http.StatusNotFound { + return networkResource, nil, networkNotFoundError{networkID} + } + return networkResource, nil, err + } + defer ensureReaderClosed(resp) + + body, err := ioutil.ReadAll(resp.body) + if err != nil { + return networkResource, nil, err + } + rdr := bytes.NewReader(body) + err = json.NewDecoder(rdr).Decode(&networkResource) + return networkResource, body, err +} diff --git a/vendor/github.com/docker/docker/client/network_list.go b/vendor/github.com/docker/docker/client/network_list.go new file mode 100644 index 00000000..e566a93e --- /dev/null +++ b/vendor/github.com/docker/docker/client/network_list.go @@ -0,0 +1,31 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "golang.org/x/net/context" +) + +// NetworkList returns the list of networks configured in the docker host. +func (cli *Client) NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error) { + query := url.Values{} + if options.Filters.Len() > 0 { + filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters) + if err != nil { + return nil, err + } + + query.Set("filters", filterJSON) + } + var networkResources []types.NetworkResource + resp, err := cli.get(ctx, "/networks", query, nil) + if err != nil { + return networkResources, err + } + err = json.NewDecoder(resp.body).Decode(&networkResources) + ensureReaderClosed(resp) + return networkResources, err +} diff --git a/vendor/github.com/docker/docker/client/network_prune.go b/vendor/github.com/docker/docker/client/network_prune.go new file mode 100644 index 00000000..7352a7f0 --- /dev/null +++ b/vendor/github.com/docker/docker/client/network_prune.go @@ -0,0 +1,36 @@ +package client + +import ( + "encoding/json" + "fmt" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "golang.org/x/net/context" +) + +// NetworksPrune requests the daemon to delete unused networks +func (cli *Client) NetworksPrune(ctx context.Context, pruneFilters filters.Args) (types.NetworksPruneReport, error) { + var report types.NetworksPruneReport + + if err := cli.NewVersionError("1.25", "network prune"); err != nil { + return report, err + } + + query, err := getFiltersQuery(pruneFilters) + if err != nil { + return report, err + } + + serverResp, err := cli.post(ctx, "/networks/prune", query, nil, nil) + if err != nil { + return report, err + } + defer ensureReaderClosed(serverResp) + + if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil { + return report, fmt.Errorf("Error retrieving network prune report: %v", err) + } + + return report, nil +} diff --git a/vendor/github.com/docker/docker/client/network_remove.go b/vendor/github.com/docker/docker/client/network_remove.go new file mode 100644 index 00000000..6bd67489 --- /dev/null +++ b/vendor/github.com/docker/docker/client/network_remove.go @@ -0,0 +1,10 @@ +package client + +import "golang.org/x/net/context" + +// NetworkRemove removes an existent network from the docker host. +func (cli *Client) NetworkRemove(ctx context.Context, networkID string) error { + resp, err := cli.delete(ctx, "/networks/"+networkID, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/node_inspect.go b/vendor/github.com/docker/docker/client/node_inspect.go new file mode 100644 index 00000000..abf505d2 --- /dev/null +++ b/vendor/github.com/docker/docker/client/node_inspect.go @@ -0,0 +1,33 @@ +package client + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// NodeInspectWithRaw returns the node information. +func (cli *Client) NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm.Node, []byte, error) { + serverResp, err := cli.get(ctx, "/nodes/"+nodeID, nil, nil) + if err != nil { + if serverResp.statusCode == http.StatusNotFound { + return swarm.Node{}, nil, nodeNotFoundError{nodeID} + } + return swarm.Node{}, nil, err + } + defer ensureReaderClosed(serverResp) + + body, err := ioutil.ReadAll(serverResp.body) + if err != nil { + return swarm.Node{}, nil, err + } + + var response swarm.Node + rdr := bytes.NewReader(body) + err = json.NewDecoder(rdr).Decode(&response) + return response, body, err +} diff --git a/vendor/github.com/docker/docker/client/node_list.go b/vendor/github.com/docker/docker/client/node_list.go new file mode 100644 index 00000000..3e8440f0 --- /dev/null +++ b/vendor/github.com/docker/docker/client/node_list.go @@ -0,0 +1,36 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// NodeList returns the list of nodes. +func (cli *Client) NodeList(ctx context.Context, options types.NodeListOptions) ([]swarm.Node, error) { + query := url.Values{} + + if options.Filters.Len() > 0 { + filterJSON, err := filters.ToParam(options.Filters) + + if err != nil { + return nil, err + } + + query.Set("filters", filterJSON) + } + + resp, err := cli.get(ctx, "/nodes", query, nil) + if err != nil { + return nil, err + } + + var nodes []swarm.Node + err = json.NewDecoder(resp.body).Decode(&nodes) + ensureReaderClosed(resp) + return nodes, err +} diff --git a/vendor/github.com/docker/docker/client/node_remove.go b/vendor/github.com/docker/docker/client/node_remove.go new file mode 100644 index 00000000..0a77f3d5 --- /dev/null +++ b/vendor/github.com/docker/docker/client/node_remove.go @@ -0,0 +1,21 @@ +package client + +import ( + "net/url" + + "github.com/docker/docker/api/types" + + "golang.org/x/net/context" +) + +// NodeRemove removes a Node. +func (cli *Client) NodeRemove(ctx context.Context, nodeID string, options types.NodeRemoveOptions) error { + query := url.Values{} + if options.Force { + query.Set("force", "1") + } + + resp, err := cli.delete(ctx, "/nodes/"+nodeID, query, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/node_update.go b/vendor/github.com/docker/docker/client/node_update.go new file mode 100644 index 00000000..3ca97602 --- /dev/null +++ b/vendor/github.com/docker/docker/client/node_update.go @@ -0,0 +1,18 @@ +package client + +import ( + "net/url" + "strconv" + + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// NodeUpdate updates a Node. +func (cli *Client) NodeUpdate(ctx context.Context, nodeID string, version swarm.Version, node swarm.NodeSpec) error { + query := url.Values{} + query.Set("version", strconv.FormatUint(version.Index, 10)) + resp, err := cli.post(ctx, "/nodes/"+nodeID+"/update", query, node, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/ping.go b/vendor/github.com/docker/docker/client/ping.go new file mode 100644 index 00000000..22dcda24 --- /dev/null +++ b/vendor/github.com/docker/docker/client/ping.go @@ -0,0 +1,30 @@ +package client + +import ( + "fmt" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// Ping pings the server and return the value of the "Docker-Experimental" & "API-Version" headers +func (cli *Client) Ping(ctx context.Context) (types.Ping, error) { + var ping types.Ping + req, err := cli.buildRequest("GET", fmt.Sprintf("%s/_ping", cli.basePath), nil, nil) + if err != nil { + return ping, err + } + serverResp, err := cli.doRequest(ctx, req) + if err != nil { + return ping, err + } + defer ensureReaderClosed(serverResp) + + ping.APIVersion = serverResp.header.Get("API-Version") + + if serverResp.header.Get("Docker-Experimental") == "true" { + ping.Experimental = true + } + + return ping, nil +} diff --git a/vendor/github.com/docker/docker/client/plugin_create.go b/vendor/github.com/docker/docker/client/plugin_create.go new file mode 100644 index 00000000..a660ba57 --- /dev/null +++ b/vendor/github.com/docker/docker/client/plugin_create.go @@ -0,0 +1,26 @@ +package client + +import ( + "io" + "net/http" + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// PluginCreate creates a plugin +func (cli *Client) PluginCreate(ctx context.Context, createContext io.Reader, createOptions types.PluginCreateOptions) error { + headers := http.Header(make(map[string][]string)) + headers.Set("Content-Type", "application/tar") + + query := url.Values{} + query.Set("name", createOptions.RepoName) + + resp, err := cli.postRaw(ctx, "/plugins/create", query, createContext, headers) + if err != nil { + return err + } + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/plugin_disable.go b/vendor/github.com/docker/docker/client/plugin_disable.go new file mode 100644 index 00000000..30467db7 --- /dev/null +++ b/vendor/github.com/docker/docker/client/plugin_disable.go @@ -0,0 +1,19 @@ +package client + +import ( + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// PluginDisable disables a plugin +func (cli *Client) PluginDisable(ctx context.Context, name string, options types.PluginDisableOptions) error { + query := url.Values{} + if options.Force { + query.Set("force", "1") + } + resp, err := cli.post(ctx, "/plugins/"+name+"/disable", query, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/plugin_enable.go b/vendor/github.com/docker/docker/client/plugin_enable.go new file mode 100644 index 00000000..95517c4b --- /dev/null +++ b/vendor/github.com/docker/docker/client/plugin_enable.go @@ -0,0 +1,19 @@ +package client + +import ( + "net/url" + "strconv" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// PluginEnable enables a plugin +func (cli *Client) PluginEnable(ctx context.Context, name string, options types.PluginEnableOptions) error { + query := url.Values{} + query.Set("timeout", strconv.Itoa(options.Timeout)) + + resp, err := cli.post(ctx, "/plugins/"+name+"/enable", query, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/plugin_inspect.go b/vendor/github.com/docker/docker/client/plugin_inspect.go new file mode 100644 index 00000000..89f39ee2 --- /dev/null +++ b/vendor/github.com/docker/docker/client/plugin_inspect.go @@ -0,0 +1,32 @@ +package client + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// PluginInspectWithRaw inspects an existing plugin +func (cli *Client) PluginInspectWithRaw(ctx context.Context, name string) (*types.Plugin, []byte, error) { + resp, err := cli.get(ctx, "/plugins/"+name+"/json", nil, nil) + if err != nil { + if resp.statusCode == http.StatusNotFound { + return nil, nil, pluginNotFoundError{name} + } + return nil, nil, err + } + + defer ensureReaderClosed(resp) + body, err := ioutil.ReadAll(resp.body) + if err != nil { + return nil, nil, err + } + var p types.Plugin + rdr := bytes.NewReader(body) + err = json.NewDecoder(rdr).Decode(&p) + return &p, body, err +} diff --git a/vendor/github.com/docker/docker/client/plugin_install.go b/vendor/github.com/docker/docker/client/plugin_install.go new file mode 100644 index 00000000..3217c4cf --- /dev/null +++ b/vendor/github.com/docker/docker/client/plugin_install.go @@ -0,0 +1,113 @@ +package client + +import ( + "encoding/json" + "io" + "net/http" + "net/url" + + "github.com/docker/distribution/reference" + "github.com/docker/docker/api/types" + "github.com/pkg/errors" + "golang.org/x/net/context" +) + +// PluginInstall installs a plugin +func (cli *Client) PluginInstall(ctx context.Context, name string, options types.PluginInstallOptions) (rc io.ReadCloser, err error) { + query := url.Values{} + if _, err := reference.ParseNamed(options.RemoteRef); err != nil { + return nil, errors.Wrap(err, "invalid remote reference") + } + query.Set("remote", options.RemoteRef) + + privileges, err := cli.checkPluginPermissions(ctx, query, options) + if err != nil { + return nil, err + } + + // set name for plugin pull, if empty should default to remote reference + query.Set("name", name) + + resp, err := cli.tryPluginPull(ctx, query, privileges, options.RegistryAuth) + if err != nil { + return nil, err + } + + name = resp.header.Get("Docker-Plugin-Name") + + pr, pw := io.Pipe() + go func() { // todo: the client should probably be designed more around the actual api + _, err := io.Copy(pw, resp.body) + if err != nil { + pw.CloseWithError(err) + return + } + defer func() { + if err != nil { + delResp, _ := cli.delete(ctx, "/plugins/"+name, nil, nil) + ensureReaderClosed(delResp) + } + }() + if len(options.Args) > 0 { + if err := cli.PluginSet(ctx, name, options.Args); err != nil { + pw.CloseWithError(err) + return + } + } + + if options.Disabled { + pw.Close() + return + } + + err = cli.PluginEnable(ctx, name, types.PluginEnableOptions{Timeout: 0}) + pw.CloseWithError(err) + }() + return pr, nil +} + +func (cli *Client) tryPluginPrivileges(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { + headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + return cli.get(ctx, "/plugins/privileges", query, headers) +} + +func (cli *Client) tryPluginPull(ctx context.Context, query url.Values, privileges types.PluginPrivileges, registryAuth string) (serverResponse, error) { + headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + return cli.post(ctx, "/plugins/pull", query, privileges, headers) +} + +func (cli *Client) checkPluginPermissions(ctx context.Context, query url.Values, options types.PluginInstallOptions) (types.PluginPrivileges, error) { + resp, err := cli.tryPluginPrivileges(ctx, query, options.RegistryAuth) + if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil { + // todo: do inspect before to check existing name before checking privileges + newAuthHeader, privilegeErr := options.PrivilegeFunc() + if privilegeErr != nil { + ensureReaderClosed(resp) + return nil, privilegeErr + } + options.RegistryAuth = newAuthHeader + resp, err = cli.tryPluginPrivileges(ctx, query, options.RegistryAuth) + } + if err != nil { + ensureReaderClosed(resp) + return nil, err + } + + var privileges types.PluginPrivileges + if err := json.NewDecoder(resp.body).Decode(&privileges); err != nil { + ensureReaderClosed(resp) + return nil, err + } + ensureReaderClosed(resp) + + if !options.AcceptAllPermissions && options.AcceptPermissionsFunc != nil && len(privileges) > 0 { + accept, err := options.AcceptPermissionsFunc(privileges) + if err != nil { + return nil, err + } + if !accept { + return nil, pluginPermissionDenied{options.RemoteRef} + } + } + return privileges, nil +} diff --git a/vendor/github.com/docker/docker/client/plugin_list.go b/vendor/github.com/docker/docker/client/plugin_list.go new file mode 100644 index 00000000..88c480a3 --- /dev/null +++ b/vendor/github.com/docker/docker/client/plugin_list.go @@ -0,0 +1,21 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// PluginList returns the installed plugins +func (cli *Client) PluginList(ctx context.Context) (types.PluginsListResponse, error) { + var plugins types.PluginsListResponse + resp, err := cli.get(ctx, "/plugins", nil, nil) + if err != nil { + return plugins, err + } + + err = json.NewDecoder(resp.body).Decode(&plugins) + ensureReaderClosed(resp) + return plugins, err +} diff --git a/vendor/github.com/docker/docker/client/plugin_push.go b/vendor/github.com/docker/docker/client/plugin_push.go new file mode 100644 index 00000000..1e5f9632 --- /dev/null +++ b/vendor/github.com/docker/docker/client/plugin_push.go @@ -0,0 +1,17 @@ +package client + +import ( + "io" + + "golang.org/x/net/context" +) + +// PluginPush pushes a plugin to a registry +func (cli *Client) PluginPush(ctx context.Context, name string, registryAuth string) (io.ReadCloser, error) { + headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + resp, err := cli.post(ctx, "/plugins/"+name+"/push", nil, nil, headers) + if err != nil { + return nil, err + } + return resp.body, nil +} diff --git a/vendor/github.com/docker/docker/client/plugin_remove.go b/vendor/github.com/docker/docker/client/plugin_remove.go new file mode 100644 index 00000000..b017e4d3 --- /dev/null +++ b/vendor/github.com/docker/docker/client/plugin_remove.go @@ -0,0 +1,20 @@ +package client + +import ( + "net/url" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// PluginRemove removes a plugin +func (cli *Client) PluginRemove(ctx context.Context, name string, options types.PluginRemoveOptions) error { + query := url.Values{} + if options.Force { + query.Set("force", "1") + } + + resp, err := cli.delete(ctx, "/plugins/"+name, query, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/plugin_set.go b/vendor/github.com/docker/docker/client/plugin_set.go new file mode 100644 index 00000000..3260d2a9 --- /dev/null +++ b/vendor/github.com/docker/docker/client/plugin_set.go @@ -0,0 +1,12 @@ +package client + +import ( + "golang.org/x/net/context" +) + +// PluginSet modifies settings for an existing plugin +func (cli *Client) PluginSet(ctx context.Context, name string, args []string) error { + resp, err := cli.post(ctx, "/plugins/"+name+"/set", nil, args, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/plugin_upgrade.go b/vendor/github.com/docker/docker/client/plugin_upgrade.go new file mode 100644 index 00000000..95a4356b --- /dev/null +++ b/vendor/github.com/docker/docker/client/plugin_upgrade.go @@ -0,0 +1,37 @@ +package client + +import ( + "fmt" + "io" + "net/url" + + "github.com/docker/distribution/reference" + "github.com/docker/docker/api/types" + "github.com/pkg/errors" + "golang.org/x/net/context" +) + +// PluginUpgrade upgrades a plugin +func (cli *Client) PluginUpgrade(ctx context.Context, name string, options types.PluginInstallOptions) (rc io.ReadCloser, err error) { + query := url.Values{} + if _, err := reference.ParseNamed(options.RemoteRef); err != nil { + return nil, errors.Wrap(err, "invalid remote reference") + } + query.Set("remote", options.RemoteRef) + + privileges, err := cli.checkPluginPermissions(ctx, query, options) + if err != nil { + return nil, err + } + + resp, err := cli.tryPluginUpgrade(ctx, query, privileges, name, options.RegistryAuth) + if err != nil { + return nil, err + } + return resp.body, nil +} + +func (cli *Client) tryPluginUpgrade(ctx context.Context, query url.Values, privileges types.PluginPrivileges, name, registryAuth string) (serverResponse, error) { + headers := map[string][]string{"X-Registry-Auth": {registryAuth}} + return cli.post(ctx, fmt.Sprintf("/plugins/%s/upgrade", name), query, privileges, headers) +} diff --git a/vendor/github.com/docker/docker/client/request.go b/vendor/github.com/docker/docker/client/request.go new file mode 100644 index 00000000..ac053636 --- /dev/null +++ b/vendor/github.com/docker/docker/client/request.go @@ -0,0 +1,247 @@ +package client + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "net/url" + "os" + "strings" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/versions" + "github.com/pkg/errors" + "golang.org/x/net/context" + "golang.org/x/net/context/ctxhttp" +) + +// serverResponse is a wrapper for http API responses. +type serverResponse struct { + body io.ReadCloser + header http.Header + statusCode int +} + +// head sends an http request to the docker API using the method HEAD. +func (cli *Client) head(ctx context.Context, path string, query url.Values, headers map[string][]string) (serverResponse, error) { + return cli.sendRequest(ctx, "HEAD", path, query, nil, headers) +} + +// getWithContext sends an http request to the docker API using the method GET with a specific go context. +func (cli *Client) get(ctx context.Context, path string, query url.Values, headers map[string][]string) (serverResponse, error) { + return cli.sendRequest(ctx, "GET", path, query, nil, headers) +} + +// postWithContext sends an http request to the docker API using the method POST with a specific go context. +func (cli *Client) post(ctx context.Context, path string, query url.Values, obj interface{}, headers map[string][]string) (serverResponse, error) { + body, headers, err := encodeBody(obj, headers) + if err != nil { + return serverResponse{}, err + } + return cli.sendRequest(ctx, "POST", path, query, body, headers) +} + +func (cli *Client) postRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers map[string][]string) (serverResponse, error) { + return cli.sendRequest(ctx, "POST", path, query, body, headers) +} + +// put sends an http request to the docker API using the method PUT. +func (cli *Client) put(ctx context.Context, path string, query url.Values, obj interface{}, headers map[string][]string) (serverResponse, error) { + body, headers, err := encodeBody(obj, headers) + if err != nil { + return serverResponse{}, err + } + return cli.sendRequest(ctx, "PUT", path, query, body, headers) +} + +// put sends an http request to the docker API using the method PUT. +func (cli *Client) putRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers map[string][]string) (serverResponse, error) { + return cli.sendRequest(ctx, "PUT", path, query, body, headers) +} + +// delete sends an http request to the docker API using the method DELETE. +func (cli *Client) delete(ctx context.Context, path string, query url.Values, headers map[string][]string) (serverResponse, error) { + return cli.sendRequest(ctx, "DELETE", path, query, nil, headers) +} + +type headers map[string][]string + +func encodeBody(obj interface{}, headers headers) (io.Reader, headers, error) { + if obj == nil { + return nil, headers, nil + } + + body, err := encodeData(obj) + if err != nil { + return nil, headers, err + } + if headers == nil { + headers = make(map[string][]string) + } + headers["Content-Type"] = []string{"application/json"} + return body, headers, nil +} + +func (cli *Client) buildRequest(method, path string, body io.Reader, headers headers) (*http.Request, error) { + expectedPayload := (method == "POST" || method == "PUT") + if expectedPayload && body == nil { + body = bytes.NewReader([]byte{}) + } + + req, err := http.NewRequest(method, path, body) + if err != nil { + return nil, err + } + req = cli.addHeaders(req, headers) + + if cli.proto == "unix" || cli.proto == "npipe" { + // For local communications, it doesn't matter what the host is. We just + // need a valid and meaningful host name. (See #189) + req.Host = "docker" + } + + req.URL.Host = cli.addr + req.URL.Scheme = cli.scheme + + if expectedPayload && req.Header.Get("Content-Type") == "" { + req.Header.Set("Content-Type", "text/plain") + } + return req, nil +} + +func (cli *Client) sendRequest(ctx context.Context, method, path string, query url.Values, body io.Reader, headers headers) (serverResponse, error) { + req, err := cli.buildRequest(method, cli.getAPIPath(path, query), body, headers) + if err != nil { + return serverResponse{}, err + } + return cli.doRequest(ctx, req) +} + +func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResponse, error) { + serverResp := serverResponse{statusCode: -1} + + resp, err := ctxhttp.Do(ctx, cli.client, req) + if err != nil { + if cli.scheme != "https" && strings.Contains(err.Error(), "malformed HTTP response") { + return serverResp, fmt.Errorf("%v.\n* Are you trying to connect to a TLS-enabled daemon without TLS?", err) + } + + if cli.scheme == "https" && strings.Contains(err.Error(), "bad certificate") { + return serverResp, fmt.Errorf("The server probably has client authentication (--tlsverify) enabled. Please check your TLS client certification settings: %v", err) + } + + // Don't decorate context sentinel errors; users may be comparing to + // them directly. + switch err { + case context.Canceled, context.DeadlineExceeded: + return serverResp, err + } + + if nErr, ok := err.(*url.Error); ok { + if nErr, ok := nErr.Err.(*net.OpError); ok { + if os.IsPermission(nErr.Err) { + return serverResp, errors.Wrapf(err, "Got permission denied while trying to connect to the Docker daemon socket at %v", cli.host) + } + } + } + + if err, ok := err.(net.Error); ok { + if err.Timeout() { + return serverResp, ErrorConnectionFailed(cli.host) + } + if !err.Temporary() { + if strings.Contains(err.Error(), "connection refused") || strings.Contains(err.Error(), "dial unix") { + return serverResp, ErrorConnectionFailed(cli.host) + } + } + } + + // Although there's not a strongly typed error for this in go-winio, + // lots of people are using the default configuration for the docker + // daemon on Windows where the daemon is listening on a named pipe + // `//./pipe/docker_engine, and the client must be running elevated. + // Give users a clue rather than the not-overly useful message + // such as `error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.25/info: + // open //./pipe/docker_engine: The system cannot find the file specified.`. + // Note we can't string compare "The system cannot find the file specified" as + // this is localised - for example in French the error would be + // `open //./pipe/docker_engine: Le fichier spécifié est introuvable.` + if strings.Contains(err.Error(), `open //./pipe/docker_engine`) { + err = errors.New(err.Error() + " In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.") + } + + return serverResp, errors.Wrap(err, "error during connect") + } + + if resp != nil { + serverResp.statusCode = resp.StatusCode + } + + if serverResp.statusCode < 200 || serverResp.statusCode >= 400 { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return serverResp, err + } + if len(body) == 0 { + return serverResp, fmt.Errorf("Error: request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(serverResp.statusCode), req.URL) + } + + var errorMessage string + if (cli.version == "" || versions.GreaterThan(cli.version, "1.23")) && + resp.Header.Get("Content-Type") == "application/json" { + var errorResponse types.ErrorResponse + if err := json.Unmarshal(body, &errorResponse); err != nil { + return serverResp, fmt.Errorf("Error reading JSON: %v", err) + } + errorMessage = errorResponse.Message + } else { + errorMessage = string(body) + } + + return serverResp, fmt.Errorf("Error response from daemon: %s", strings.TrimSpace(errorMessage)) + } + + serverResp.body = resp.Body + serverResp.header = resp.Header + return serverResp, nil +} + +func (cli *Client) addHeaders(req *http.Request, headers headers) *http.Request { + // Add CLI Config's HTTP Headers BEFORE we set the Docker headers + // then the user can't change OUR headers + for k, v := range cli.customHTTPHeaders { + if versions.LessThan(cli.version, "1.25") && k == "User-Agent" { + continue + } + req.Header.Set(k, v) + } + + if headers != nil { + for k, v := range headers { + req.Header[k] = v + } + } + return req +} + +func encodeData(data interface{}) (*bytes.Buffer, error) { + params := bytes.NewBuffer(nil) + if data != nil { + if err := json.NewEncoder(params).Encode(data); err != nil { + return nil, err + } + } + return params, nil +} + +func ensureReaderClosed(response serverResponse) { + if body := response.body; body != nil { + // Drain up to 512 bytes and close the body to let the Transport reuse the connection + io.CopyN(ioutil.Discard, body, 512) + response.body.Close() + } +} diff --git a/vendor/github.com/docker/docker/client/secret_create.go b/vendor/github.com/docker/docker/client/secret_create.go new file mode 100644 index 00000000..de8b0415 --- /dev/null +++ b/vendor/github.com/docker/docker/client/secret_create.go @@ -0,0 +1,24 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// SecretCreate creates a new Secret. +func (cli *Client) SecretCreate(ctx context.Context, secret swarm.SecretSpec) (types.SecretCreateResponse, error) { + var headers map[string][]string + + var response types.SecretCreateResponse + resp, err := cli.post(ctx, "/secrets/create", nil, secret, headers) + if err != nil { + return response, err + } + + err = json.NewDecoder(resp.body).Decode(&response) + ensureReaderClosed(resp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/secret_inspect.go b/vendor/github.com/docker/docker/client/secret_inspect.go new file mode 100644 index 00000000..f7745761 --- /dev/null +++ b/vendor/github.com/docker/docker/client/secret_inspect.go @@ -0,0 +1,34 @@ +package client + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// SecretInspectWithRaw returns the secret information with raw data +func (cli *Client) SecretInspectWithRaw(ctx context.Context, id string) (swarm.Secret, []byte, error) { + resp, err := cli.get(ctx, "/secrets/"+id, nil, nil) + if err != nil { + if resp.statusCode == http.StatusNotFound { + return swarm.Secret{}, nil, secretNotFoundError{id} + } + return swarm.Secret{}, nil, err + } + defer ensureReaderClosed(resp) + + body, err := ioutil.ReadAll(resp.body) + if err != nil { + return swarm.Secret{}, nil, err + } + + var secret swarm.Secret + rdr := bytes.NewReader(body) + err = json.NewDecoder(rdr).Decode(&secret) + + return secret, body, err +} diff --git a/vendor/github.com/docker/docker/client/secret_list.go b/vendor/github.com/docker/docker/client/secret_list.go new file mode 100644 index 00000000..7e9d5ec1 --- /dev/null +++ b/vendor/github.com/docker/docker/client/secret_list.go @@ -0,0 +1,35 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// SecretList returns the list of secrets. +func (cli *Client) SecretList(ctx context.Context, options types.SecretListOptions) ([]swarm.Secret, error) { + query := url.Values{} + + if options.Filters.Len() > 0 { + filterJSON, err := filters.ToParam(options.Filters) + if err != nil { + return nil, err + } + + query.Set("filters", filterJSON) + } + + resp, err := cli.get(ctx, "/secrets", query, nil) + if err != nil { + return nil, err + } + + var secrets []swarm.Secret + err = json.NewDecoder(resp.body).Decode(&secrets) + ensureReaderClosed(resp) + return secrets, err +} diff --git a/vendor/github.com/docker/docker/client/secret_remove.go b/vendor/github.com/docker/docker/client/secret_remove.go new file mode 100644 index 00000000..1955b988 --- /dev/null +++ b/vendor/github.com/docker/docker/client/secret_remove.go @@ -0,0 +1,10 @@ +package client + +import "golang.org/x/net/context" + +// SecretRemove removes a Secret. +func (cli *Client) SecretRemove(ctx context.Context, id string) error { + resp, err := cli.delete(ctx, "/secrets/"+id, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/secret_update.go b/vendor/github.com/docker/docker/client/secret_update.go new file mode 100644 index 00000000..b94e24aa --- /dev/null +++ b/vendor/github.com/docker/docker/client/secret_update.go @@ -0,0 +1,19 @@ +package client + +import ( + "net/url" + "strconv" + + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// SecretUpdate updates a Secret. Currently, the only part of a secret spec +// which can be updated is Labels. +func (cli *Client) SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error { + query := url.Values{} + query.Set("version", strconv.FormatUint(version.Index, 10)) + resp, err := cli.post(ctx, "/secrets/"+id+"/update", query, secret, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/service_create.go b/vendor/github.com/docker/docker/client/service_create.go new file mode 100644 index 00000000..3d1be225 --- /dev/null +++ b/vendor/github.com/docker/docker/client/service_create.go @@ -0,0 +1,30 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// ServiceCreate creates a new Service. +func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error) { + var headers map[string][]string + + if options.EncodedRegistryAuth != "" { + headers = map[string][]string{ + "X-Registry-Auth": {options.EncodedRegistryAuth}, + } + } + + var response types.ServiceCreateResponse + resp, err := cli.post(ctx, "/services/create", nil, service, headers) + if err != nil { + return response, err + } + + err = json.NewDecoder(resp.body).Decode(&response) + ensureReaderClosed(resp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/service_inspect.go b/vendor/github.com/docker/docker/client/service_inspect.go new file mode 100644 index 00000000..ca71cbde --- /dev/null +++ b/vendor/github.com/docker/docker/client/service_inspect.go @@ -0,0 +1,33 @@ +package client + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// ServiceInspectWithRaw returns the service information and the raw data. +func (cli *Client) ServiceInspectWithRaw(ctx context.Context, serviceID string) (swarm.Service, []byte, error) { + serverResp, err := cli.get(ctx, "/services/"+serviceID, nil, nil) + if err != nil { + if serverResp.statusCode == http.StatusNotFound { + return swarm.Service{}, nil, serviceNotFoundError{serviceID} + } + return swarm.Service{}, nil, err + } + defer ensureReaderClosed(serverResp) + + body, err := ioutil.ReadAll(serverResp.body) + if err != nil { + return swarm.Service{}, nil, err + } + + var response swarm.Service + rdr := bytes.NewReader(body) + err = json.NewDecoder(rdr).Decode(&response) + return response, body, err +} diff --git a/vendor/github.com/docker/docker/client/service_list.go b/vendor/github.com/docker/docker/client/service_list.go new file mode 100644 index 00000000..c29e6d40 --- /dev/null +++ b/vendor/github.com/docker/docker/client/service_list.go @@ -0,0 +1,35 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// ServiceList returns the list of services. +func (cli *Client) ServiceList(ctx context.Context, options types.ServiceListOptions) ([]swarm.Service, error) { + query := url.Values{} + + if options.Filters.Len() > 0 { + filterJSON, err := filters.ToParam(options.Filters) + if err != nil { + return nil, err + } + + query.Set("filters", filterJSON) + } + + resp, err := cli.get(ctx, "/services", query, nil) + if err != nil { + return nil, err + } + + var services []swarm.Service + err = json.NewDecoder(resp.body).Decode(&services) + ensureReaderClosed(resp) + return services, err +} diff --git a/vendor/github.com/docker/docker/client/service_logs.go b/vendor/github.com/docker/docker/client/service_logs.go new file mode 100644 index 00000000..24384e3e --- /dev/null +++ b/vendor/github.com/docker/docker/client/service_logs.go @@ -0,0 +1,52 @@ +package client + +import ( + "io" + "net/url" + "time" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/types" + timetypes "github.com/docker/docker/api/types/time" +) + +// ServiceLogs returns the logs generated by a service in an io.ReadCloser. +// It's up to the caller to close the stream. +func (cli *Client) ServiceLogs(ctx context.Context, serviceID string, options types.ContainerLogsOptions) (io.ReadCloser, error) { + query := url.Values{} + if options.ShowStdout { + query.Set("stdout", "1") + } + + if options.ShowStderr { + query.Set("stderr", "1") + } + + if options.Since != "" { + ts, err := timetypes.GetTimestamp(options.Since, time.Now()) + if err != nil { + return nil, err + } + query.Set("since", ts) + } + + if options.Timestamps { + query.Set("timestamps", "1") + } + + if options.Details { + query.Set("details", "1") + } + + if options.Follow { + query.Set("follow", "1") + } + query.Set("tail", options.Tail) + + resp, err := cli.get(ctx, "/services/"+serviceID+"/logs", query, nil) + if err != nil { + return nil, err + } + return resp.body, nil +} diff --git a/vendor/github.com/docker/docker/client/service_remove.go b/vendor/github.com/docker/docker/client/service_remove.go new file mode 100644 index 00000000..a9331f92 --- /dev/null +++ b/vendor/github.com/docker/docker/client/service_remove.go @@ -0,0 +1,10 @@ +package client + +import "golang.org/x/net/context" + +// ServiceRemove kills and removes a service. +func (cli *Client) ServiceRemove(ctx context.Context, serviceID string) error { + resp, err := cli.delete(ctx, "/services/"+serviceID, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/service_update.go b/vendor/github.com/docker/docker/client/service_update.go new file mode 100644 index 00000000..afa94d47 --- /dev/null +++ b/vendor/github.com/docker/docker/client/service_update.go @@ -0,0 +1,41 @@ +package client + +import ( + "encoding/json" + "net/url" + "strconv" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// ServiceUpdate updates a Service. +func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) { + var ( + headers map[string][]string + query = url.Values{} + ) + + if options.EncodedRegistryAuth != "" { + headers = map[string][]string{ + "X-Registry-Auth": {options.EncodedRegistryAuth}, + } + } + + if options.RegistryAuthFrom != "" { + query.Set("registryAuthFrom", options.RegistryAuthFrom) + } + + query.Set("version", strconv.FormatUint(version.Index, 10)) + + var response types.ServiceUpdateResponse + resp, err := cli.post(ctx, "/services/"+serviceID+"/update", query, service, headers) + if err != nil { + return response, err + } + + err = json.NewDecoder(resp.body).Decode(&response) + ensureReaderClosed(resp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go b/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go new file mode 100644 index 00000000..be28d326 --- /dev/null +++ b/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go @@ -0,0 +1,21 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// SwarmGetUnlockKey retrieves the swarm's unlock key. +func (cli *Client) SwarmGetUnlockKey(ctx context.Context) (types.SwarmUnlockKeyResponse, error) { + serverResp, err := cli.get(ctx, "/swarm/unlockkey", nil, nil) + if err != nil { + return types.SwarmUnlockKeyResponse{}, err + } + + var response types.SwarmUnlockKeyResponse + err = json.NewDecoder(serverResp.body).Decode(&response) + ensureReaderClosed(serverResp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/swarm_init.go b/vendor/github.com/docker/docker/client/swarm_init.go new file mode 100644 index 00000000..fd45d066 --- /dev/null +++ b/vendor/github.com/docker/docker/client/swarm_init.go @@ -0,0 +1,21 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// SwarmInit initializes the Swarm. +func (cli *Client) SwarmInit(ctx context.Context, req swarm.InitRequest) (string, error) { + serverResp, err := cli.post(ctx, "/swarm/init", nil, req, nil) + if err != nil { + return "", err + } + + var response string + err = json.NewDecoder(serverResp.body).Decode(&response) + ensureReaderClosed(serverResp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/swarm_inspect.go b/vendor/github.com/docker/docker/client/swarm_inspect.go new file mode 100644 index 00000000..6d95cfc0 --- /dev/null +++ b/vendor/github.com/docker/docker/client/swarm_inspect.go @@ -0,0 +1,21 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// SwarmInspect inspects the Swarm. +func (cli *Client) SwarmInspect(ctx context.Context) (swarm.Swarm, error) { + serverResp, err := cli.get(ctx, "/swarm", nil, nil) + if err != nil { + return swarm.Swarm{}, err + } + + var response swarm.Swarm + err = json.NewDecoder(serverResp.body).Decode(&response) + ensureReaderClosed(serverResp) + return response, err +} diff --git a/vendor/github.com/docker/docker/client/swarm_join.go b/vendor/github.com/docker/docker/client/swarm_join.go new file mode 100644 index 00000000..cda99930 --- /dev/null +++ b/vendor/github.com/docker/docker/client/swarm_join.go @@ -0,0 +1,13 @@ +package client + +import ( + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// SwarmJoin joins the Swarm. +func (cli *Client) SwarmJoin(ctx context.Context, req swarm.JoinRequest) error { + resp, err := cli.post(ctx, "/swarm/join", nil, req, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/swarm_leave.go b/vendor/github.com/docker/docker/client/swarm_leave.go new file mode 100644 index 00000000..a4df7321 --- /dev/null +++ b/vendor/github.com/docker/docker/client/swarm_leave.go @@ -0,0 +1,18 @@ +package client + +import ( + "net/url" + + "golang.org/x/net/context" +) + +// SwarmLeave leaves the Swarm. +func (cli *Client) SwarmLeave(ctx context.Context, force bool) error { + query := url.Values{} + if force { + query.Set("force", "1") + } + resp, err := cli.post(ctx, "/swarm/leave", query, nil, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/swarm_unlock.go b/vendor/github.com/docker/docker/client/swarm_unlock.go new file mode 100644 index 00000000..addfb59f --- /dev/null +++ b/vendor/github.com/docker/docker/client/swarm_unlock.go @@ -0,0 +1,17 @@ +package client + +import ( + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// SwarmUnlock unlockes locked swarm. +func (cli *Client) SwarmUnlock(ctx context.Context, req swarm.UnlockRequest) error { + serverResp, err := cli.post(ctx, "/swarm/unlock", nil, req, nil) + if err != nil { + return err + } + + ensureReaderClosed(serverResp) + return err +} diff --git a/vendor/github.com/docker/docker/client/swarm_update.go b/vendor/github.com/docker/docker/client/swarm_update.go new file mode 100644 index 00000000..cc8eeb65 --- /dev/null +++ b/vendor/github.com/docker/docker/client/swarm_update.go @@ -0,0 +1,22 @@ +package client + +import ( + "fmt" + "net/url" + "strconv" + + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// SwarmUpdate updates the Swarm. +func (cli *Client) SwarmUpdate(ctx context.Context, version swarm.Version, swarm swarm.Spec, flags swarm.UpdateFlags) error { + query := url.Values{} + query.Set("version", strconv.FormatUint(version.Index, 10)) + query.Set("rotateWorkerToken", fmt.Sprintf("%v", flags.RotateWorkerToken)) + query.Set("rotateManagerToken", fmt.Sprintf("%v", flags.RotateManagerToken)) + query.Set("rotateManagerUnlockKey", fmt.Sprintf("%v", flags.RotateManagerUnlockKey)) + resp, err := cli.post(ctx, "/swarm/update", query, swarm, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/client/task_inspect.go b/vendor/github.com/docker/docker/client/task_inspect.go new file mode 100644 index 00000000..bc8058fc --- /dev/null +++ b/vendor/github.com/docker/docker/client/task_inspect.go @@ -0,0 +1,34 @@ +package client + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/docker/docker/api/types/swarm" + + "golang.org/x/net/context" +) + +// TaskInspectWithRaw returns the task information and its raw representation.. +func (cli *Client) TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) { + serverResp, err := cli.get(ctx, "/tasks/"+taskID, nil, nil) + if err != nil { + if serverResp.statusCode == http.StatusNotFound { + return swarm.Task{}, nil, taskNotFoundError{taskID} + } + return swarm.Task{}, nil, err + } + defer ensureReaderClosed(serverResp) + + body, err := ioutil.ReadAll(serverResp.body) + if err != nil { + return swarm.Task{}, nil, err + } + + var response swarm.Task + rdr := bytes.NewReader(body) + err = json.NewDecoder(rdr).Decode(&response) + return response, body, err +} diff --git a/vendor/github.com/docker/docker/client/task_list.go b/vendor/github.com/docker/docker/client/task_list.go new file mode 100644 index 00000000..66324da9 --- /dev/null +++ b/vendor/github.com/docker/docker/client/task_list.go @@ -0,0 +1,35 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" +) + +// TaskList returns the list of tasks. +func (cli *Client) TaskList(ctx context.Context, options types.TaskListOptions) ([]swarm.Task, error) { + query := url.Values{} + + if options.Filters.Len() > 0 { + filterJSON, err := filters.ToParam(options.Filters) + if err != nil { + return nil, err + } + + query.Set("filters", filterJSON) + } + + resp, err := cli.get(ctx, "/tasks", query, nil) + if err != nil { + return nil, err + } + + var tasks []swarm.Task + err = json.NewDecoder(resp.body).Decode(&tasks) + ensureReaderClosed(resp) + return tasks, err +} diff --git a/vendor/github.com/docker/docker/client/transport.go b/vendor/github.com/docker/docker/client/transport.go new file mode 100644 index 00000000..f04e6016 --- /dev/null +++ b/vendor/github.com/docker/docker/client/transport.go @@ -0,0 +1,28 @@ +package client + +import ( + "crypto/tls" + "errors" + "net/http" +) + +var errTLSConfigUnavailable = errors.New("TLSConfig unavailable") + +// transportFunc allows us to inject a mock transport for testing. We define it +// here so we can detect the tlsconfig and return nil for only this type. +type transportFunc func(*http.Request) (*http.Response, error) + +func (tf transportFunc) RoundTrip(req *http.Request) (*http.Response, error) { + return tf(req) +} + +// resolveTLSConfig attempts to resolve the tls configuration from the +// RoundTripper. +func resolveTLSConfig(transport http.RoundTripper) *tls.Config { + switch tr := transport.(type) { + case *http.Transport: + return tr.TLSClientConfig + default: + return nil + } +} diff --git a/vendor/github.com/docker/docker/client/utils.go b/vendor/github.com/docker/docker/client/utils.go new file mode 100644 index 00000000..23d520ec --- /dev/null +++ b/vendor/github.com/docker/docker/client/utils.go @@ -0,0 +1,33 @@ +package client + +import ( + "github.com/docker/docker/api/types/filters" + "net/url" + "regexp" +) + +var headerRegexp = regexp.MustCompile(`\ADocker/.+\s\((.+)\)\z`) + +// getDockerOS returns the operating system based on the server header from the daemon. +func getDockerOS(serverHeader string) string { + var osType string + matches := headerRegexp.FindStringSubmatch(serverHeader) + if len(matches) > 0 { + osType = matches[1] + } + return osType +} + +// getFiltersQuery returns a url query with "filters" query term, based on the +// filters provided. +func getFiltersQuery(f filters.Args) (url.Values, error) { + query := url.Values{} + if f.Len() > 0 { + filterJSON, err := filters.ToParam(f) + if err != nil { + return query, err + } + query.Set("filters", filterJSON) + } + return query, nil +} diff --git a/vendor/github.com/docker/docker/client/version.go b/vendor/github.com/docker/docker/client/version.go new file mode 100644 index 00000000..933ceb4a --- /dev/null +++ b/vendor/github.com/docker/docker/client/version.go @@ -0,0 +1,21 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// ServerVersion returns information of the docker client and server host. +func (cli *Client) ServerVersion(ctx context.Context) (types.Version, error) { + resp, err := cli.get(ctx, "/version", nil, nil) + if err != nil { + return types.Version{}, err + } + + var server types.Version + err = json.NewDecoder(resp.body).Decode(&server) + ensureReaderClosed(resp) + return server, err +} diff --git a/vendor/github.com/docker/docker/client/volume_create.go b/vendor/github.com/docker/docker/client/volume_create.go new file mode 100644 index 00000000..9620c87c --- /dev/null +++ b/vendor/github.com/docker/docker/client/volume_create.go @@ -0,0 +1,21 @@ +package client + +import ( + "encoding/json" + + "github.com/docker/docker/api/types" + volumetypes "github.com/docker/docker/api/types/volume" + "golang.org/x/net/context" +) + +// VolumeCreate creates a volume in the docker host. +func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumesCreateBody) (types.Volume, error) { + var volume types.Volume + resp, err := cli.post(ctx, "/volumes/create", nil, options, nil) + if err != nil { + return volume, err + } + err = json.NewDecoder(resp.body).Decode(&volume) + ensureReaderClosed(resp) + return volume, err +} diff --git a/vendor/github.com/docker/docker/client/volume_inspect.go b/vendor/github.com/docker/docker/client/volume_inspect.go new file mode 100644 index 00000000..3860e9b2 --- /dev/null +++ b/vendor/github.com/docker/docker/client/volume_inspect.go @@ -0,0 +1,38 @@ +package client + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/docker/docker/api/types" + "golang.org/x/net/context" +) + +// VolumeInspect returns the information about a specific volume in the docker host. +func (cli *Client) VolumeInspect(ctx context.Context, volumeID string) (types.Volume, error) { + volume, _, err := cli.VolumeInspectWithRaw(ctx, volumeID) + return volume, err +} + +// VolumeInspectWithRaw returns the information about a specific volume in the docker host and its raw representation +func (cli *Client) VolumeInspectWithRaw(ctx context.Context, volumeID string) (types.Volume, []byte, error) { + var volume types.Volume + resp, err := cli.get(ctx, "/volumes/"+volumeID, nil, nil) + if err != nil { + if resp.statusCode == http.StatusNotFound { + return volume, nil, volumeNotFoundError{volumeID} + } + return volume, nil, err + } + defer ensureReaderClosed(resp) + + body, err := ioutil.ReadAll(resp.body) + if err != nil { + return volume, nil, err + } + rdr := bytes.NewReader(body) + err = json.NewDecoder(rdr).Decode(&volume) + return volume, body, err +} diff --git a/vendor/github.com/docker/docker/client/volume_list.go b/vendor/github.com/docker/docker/client/volume_list.go new file mode 100644 index 00000000..32247ce1 --- /dev/null +++ b/vendor/github.com/docker/docker/client/volume_list.go @@ -0,0 +1,32 @@ +package client + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types/filters" + volumetypes "github.com/docker/docker/api/types/volume" + "golang.org/x/net/context" +) + +// VolumeList returns the volumes configured in the docker host. +func (cli *Client) VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumesListOKBody, error) { + var volumes volumetypes.VolumesListOKBody + query := url.Values{} + + if filter.Len() > 0 { + filterJSON, err := filters.ToParamWithVersion(cli.version, filter) + if err != nil { + return volumes, err + } + query.Set("filters", filterJSON) + } + resp, err := cli.get(ctx, "/volumes", query, nil) + if err != nil { + return volumes, err + } + + err = json.NewDecoder(resp.body).Decode(&volumes) + ensureReaderClosed(resp) + return volumes, err +} diff --git a/vendor/github.com/docker/docker/client/volume_prune.go b/vendor/github.com/docker/docker/client/volume_prune.go new file mode 100644 index 00000000..a07e4ce6 --- /dev/null +++ b/vendor/github.com/docker/docker/client/volume_prune.go @@ -0,0 +1,36 @@ +package client + +import ( + "encoding/json" + "fmt" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "golang.org/x/net/context" +) + +// VolumesPrune requests the daemon to delete unused data +func (cli *Client) VolumesPrune(ctx context.Context, pruneFilters filters.Args) (types.VolumesPruneReport, error) { + var report types.VolumesPruneReport + + if err := cli.NewVersionError("1.25", "volume prune"); err != nil { + return report, err + } + + query, err := getFiltersQuery(pruneFilters) + if err != nil { + return report, err + } + + serverResp, err := cli.post(ctx, "/volumes/prune", query, nil, nil) + if err != nil { + return report, err + } + defer ensureReaderClosed(serverResp) + + if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil { + return report, fmt.Errorf("Error retrieving disk usage: %v", err) + } + + return report, nil +} diff --git a/vendor/github.com/docker/docker/client/volume_remove.go b/vendor/github.com/docker/docker/client/volume_remove.go new file mode 100644 index 00000000..6c26575b --- /dev/null +++ b/vendor/github.com/docker/docker/client/volume_remove.go @@ -0,0 +1,21 @@ +package client + +import ( + "net/url" + + "github.com/docker/docker/api/types/versions" + "golang.org/x/net/context" +) + +// VolumeRemove removes a volume from the docker host. +func (cli *Client) VolumeRemove(ctx context.Context, volumeID string, force bool) error { + query := url.Values{} + if versions.GreaterThanOrEqualTo(cli.version, "1.25") { + if force { + query.Set("force", "1") + } + } + resp, err := cli.delete(ctx, "/volumes/"+volumeID, query, nil) + ensureReaderClosed(resp) + return err +} diff --git a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go new file mode 100644 index 00000000..e4dec3a5 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go @@ -0,0 +1,11 @@ +// +build go1.8 + +package tlsconfig + +import "crypto/tls" + +// Clone returns a clone of tls.Config. This function is provided for +// compatibility for go1.7 that doesn't include this method in stdlib. +func Clone(c *tls.Config) *tls.Config { + return c.Clone() +} diff --git a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go16.go b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go16.go new file mode 100644 index 00000000..0b816650 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go16.go @@ -0,0 +1,31 @@ +// +build go1.6,!go1.7 + +package tlsconfig + +import "crypto/tls" + +// Clone returns a clone of tls.Config. This function is provided for +// compatibility for go1.6 that doesn't include this method in stdlib. +func Clone(c *tls.Config) *tls.Config { + return &tls.Config{ + Rand: c.Rand, + Time: c.Time, + Certificates: c.Certificates, + NameToCertificate: c.NameToCertificate, + GetCertificate: c.GetCertificate, + RootCAs: c.RootCAs, + NextProtos: c.NextProtos, + ServerName: c.ServerName, + ClientAuth: c.ClientAuth, + ClientCAs: c.ClientCAs, + InsecureSkipVerify: c.InsecureSkipVerify, + CipherSuites: c.CipherSuites, + PreferServerCipherSuites: c.PreferServerCipherSuites, + SessionTicketsDisabled: c.SessionTicketsDisabled, + SessionTicketKey: c.SessionTicketKey, + ClientSessionCache: c.ClientSessionCache, + MinVersion: c.MinVersion, + MaxVersion: c.MaxVersion, + CurvePreferences: c.CurvePreferences, + } +} diff --git a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go new file mode 100644 index 00000000..0d5b448f --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go @@ -0,0 +1,33 @@ +// +build go1.7,!go1.8 + +package tlsconfig + +import "crypto/tls" + +// Clone returns a clone of tls.Config. This function is provided for +// compatibility for go1.7 that doesn't include this method in stdlib. +func Clone(c *tls.Config) *tls.Config { + return &tls.Config{ + Rand: c.Rand, + Time: c.Time, + Certificates: c.Certificates, + NameToCertificate: c.NameToCertificate, + GetCertificate: c.GetCertificate, + RootCAs: c.RootCAs, + NextProtos: c.NextProtos, + ServerName: c.ServerName, + ClientAuth: c.ClientAuth, + ClientCAs: c.ClientCAs, + InsecureSkipVerify: c.InsecureSkipVerify, + CipherSuites: c.CipherSuites, + PreferServerCipherSuites: c.PreferServerCipherSuites, + SessionTicketsDisabled: c.SessionTicketsDisabled, + SessionTicketKey: c.SessionTicketKey, + ClientSessionCache: c.ClientSessionCache, + MinVersion: c.MinVersion, + MaxVersion: c.MaxVersion, + CurvePreferences: c.CurvePreferences, + DynamicRecordSizingDisabled: c.DynamicRecordSizingDisabled, + Renegotiation: c.Renegotiation, + } +} diff --git a/vendor/github.com/docker/go-connections/LICENSE b/vendor/github.com/docker/go-connections/LICENSE new file mode 100644 index 00000000..b55b37bc --- /dev/null +++ b/vendor/github.com/docker/go-connections/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2015 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/docker/go-connections/nat/nat.go b/vendor/github.com/docker/go-connections/nat/nat.go new file mode 100644 index 00000000..bb7e4e33 --- /dev/null +++ b/vendor/github.com/docker/go-connections/nat/nat.go @@ -0,0 +1,242 @@ +// Package nat is a convenience package for manipulation of strings describing network ports. +package nat + +import ( + "fmt" + "net" + "strconv" + "strings" +) + +const ( + // portSpecTemplate is the expected format for port specifications + portSpecTemplate = "ip:hostPort:containerPort" +) + +// PortBinding represents a binding between a Host IP address and a Host Port +type PortBinding struct { + // HostIP is the host IP Address + HostIP string `json:"HostIp"` + // HostPort is the host port number + HostPort string +} + +// PortMap is a collection of PortBinding indexed by Port +type PortMap map[Port][]PortBinding + +// PortSet is a collection of structs indexed by Port +type PortSet map[Port]struct{} + +// Port is a string containing port number and protocol in the format "80/tcp" +type Port string + +// NewPort creates a new instance of a Port given a protocol and port number or port range +func NewPort(proto, port string) (Port, error) { + // Check for parsing issues on "port" now so we can avoid having + // to check it later on. + + portStartInt, portEndInt, err := ParsePortRangeToInt(port) + if err != nil { + return "", err + } + + if portStartInt == portEndInt { + return Port(fmt.Sprintf("%d/%s", portStartInt, proto)), nil + } + return Port(fmt.Sprintf("%d-%d/%s", portStartInt, portEndInt, proto)), nil +} + +// ParsePort parses the port number string and returns an int +func ParsePort(rawPort string) (int, error) { + if len(rawPort) == 0 { + return 0, nil + } + port, err := strconv.ParseUint(rawPort, 10, 16) + if err != nil { + return 0, err + } + return int(port), nil +} + +// ParsePortRangeToInt parses the port range string and returns start/end ints +func ParsePortRangeToInt(rawPort string) (int, int, error) { + if len(rawPort) == 0 { + return 0, 0, nil + } + start, end, err := ParsePortRange(rawPort) + if err != nil { + return 0, 0, err + } + return int(start), int(end), nil +} + +// Proto returns the protocol of a Port +func (p Port) Proto() string { + proto, _ := SplitProtoPort(string(p)) + return proto +} + +// Port returns the port number of a Port +func (p Port) Port() string { + _, port := SplitProtoPort(string(p)) + return port +} + +// Int returns the port number of a Port as an int +func (p Port) Int() int { + portStr := p.Port() + // We don't need to check for an error because we're going to + // assume that any error would have been found, and reported, in NewPort() + port, _ := ParsePort(portStr) + return port +} + +// Range returns the start/end port numbers of a Port range as ints +func (p Port) Range() (int, int, error) { + return ParsePortRangeToInt(p.Port()) +} + +// SplitProtoPort splits a port in the format of proto/port +func SplitProtoPort(rawPort string) (string, string) { + parts := strings.Split(rawPort, "/") + l := len(parts) + if len(rawPort) == 0 || l == 0 || len(parts[0]) == 0 { + return "", "" + } + if l == 1 { + return "tcp", rawPort + } + if len(parts[1]) == 0 { + return "tcp", parts[0] + } + return parts[1], parts[0] +} + +func validateProto(proto string) bool { + for _, availableProto := range []string{"tcp", "udp", "sctp"} { + if availableProto == proto { + return true + } + } + return false +} + +// ParsePortSpecs receives port specs in the format of ip:public:private/proto and parses +// these in to the internal types +func ParsePortSpecs(ports []string) (map[Port]struct{}, map[Port][]PortBinding, error) { + var ( + exposedPorts = make(map[Port]struct{}, len(ports)) + bindings = make(map[Port][]PortBinding) + ) + for _, rawPort := range ports { + portMappings, err := ParsePortSpec(rawPort) + if err != nil { + return nil, nil, err + } + + for _, portMapping := range portMappings { + port := portMapping.Port + if _, exists := exposedPorts[port]; !exists { + exposedPorts[port] = struct{}{} + } + bslice, exists := bindings[port] + if !exists { + bslice = []PortBinding{} + } + bindings[port] = append(bslice, portMapping.Binding) + } + } + return exposedPorts, bindings, nil +} + +// PortMapping is a data object mapping a Port to a PortBinding +type PortMapping struct { + Port Port + Binding PortBinding +} + +func splitParts(rawport string) (string, string, string) { + parts := strings.Split(rawport, ":") + n := len(parts) + containerport := parts[n-1] + + switch n { + case 1: + return "", "", containerport + case 2: + return "", parts[0], containerport + case 3: + return parts[0], parts[1], containerport + default: + return strings.Join(parts[:n-2], ":"), parts[n-2], containerport + } +} + +// ParsePortSpec parses a port specification string into a slice of PortMappings +func ParsePortSpec(rawPort string) ([]PortMapping, error) { + var proto string + rawIP, hostPort, containerPort := splitParts(rawPort) + proto, containerPort = SplitProtoPort(containerPort) + + // Strip [] from IPV6 addresses + ip, _, err := net.SplitHostPort(rawIP + ":") + if err != nil { + return nil, fmt.Errorf("Invalid ip address %v: %s", rawIP, err) + } + if ip != "" && net.ParseIP(ip) == nil { + return nil, fmt.Errorf("Invalid ip address: %s", ip) + } + if containerPort == "" { + return nil, fmt.Errorf("No port specified: %s", rawPort) + } + + startPort, endPort, err := ParsePortRange(containerPort) + if err != nil { + return nil, fmt.Errorf("Invalid containerPort: %s", containerPort) + } + + var startHostPort, endHostPort uint64 = 0, 0 + if len(hostPort) > 0 { + startHostPort, endHostPort, err = ParsePortRange(hostPort) + if err != nil { + return nil, fmt.Errorf("Invalid hostPort: %s", hostPort) + } + } + + if hostPort != "" && (endPort-startPort) != (endHostPort-startHostPort) { + // Allow host port range iff containerPort is not a range. + // In this case, use the host port range as the dynamic + // host port range to allocate into. + if endPort != startPort { + return nil, fmt.Errorf("Invalid ranges specified for container and host Ports: %s and %s", containerPort, hostPort) + } + } + + if !validateProto(strings.ToLower(proto)) { + return nil, fmt.Errorf("Invalid proto: %s", proto) + } + + ports := []PortMapping{} + for i := uint64(0); i <= (endPort - startPort); i++ { + containerPort = strconv.FormatUint(startPort+i, 10) + if len(hostPort) > 0 { + hostPort = strconv.FormatUint(startHostPort+i, 10) + } + // Set hostPort to a range only if there is a single container port + // and a dynamic host port. + if startPort == endPort && startHostPort != endHostPort { + hostPort = fmt.Sprintf("%s-%s", hostPort, strconv.FormatUint(endHostPort, 10)) + } + port, err := NewPort(strings.ToLower(proto), containerPort) + if err != nil { + return nil, err + } + + binding := PortBinding{ + HostIP: ip, + HostPort: hostPort, + } + ports = append(ports, PortMapping{Port: port, Binding: binding}) + } + return ports, nil +} diff --git a/vendor/github.com/docker/go-connections/nat/parse.go b/vendor/github.com/docker/go-connections/nat/parse.go new file mode 100644 index 00000000..892adf8c --- /dev/null +++ b/vendor/github.com/docker/go-connections/nat/parse.go @@ -0,0 +1,57 @@ +package nat + +import ( + "fmt" + "strconv" + "strings" +) + +// PartParser parses and validates the specified string (data) using the specified template +// e.g. ip:public:private -> 192.168.0.1:80:8000 +// DEPRECATED: do not use, this function may be removed in a future version +func PartParser(template, data string) (map[string]string, error) { + // ip:public:private + var ( + templateParts = strings.Split(template, ":") + parts = strings.Split(data, ":") + out = make(map[string]string, len(templateParts)) + ) + if len(parts) != len(templateParts) { + return nil, fmt.Errorf("Invalid format to parse. %s should match template %s", data, template) + } + + for i, t := range templateParts { + value := "" + if len(parts) > i { + value = parts[i] + } + out[t] = value + } + return out, nil +} + +// ParsePortRange parses and validates the specified string as a port-range (8000-9000) +func ParsePortRange(ports string) (uint64, uint64, error) { + if ports == "" { + return 0, 0, fmt.Errorf("Empty string specified for ports.") + } + if !strings.Contains(ports, "-") { + start, err := strconv.ParseUint(ports, 10, 16) + end := start + return start, end, err + } + + parts := strings.Split(ports, "-") + start, err := strconv.ParseUint(parts[0], 10, 16) + if err != nil { + return 0, 0, err + } + end, err := strconv.ParseUint(parts[1], 10, 16) + if err != nil { + return 0, 0, err + } + if end < start { + return 0, 0, fmt.Errorf("Invalid range specified for the Port: %s", ports) + } + return start, end, nil +} diff --git a/vendor/github.com/docker/go-connections/nat/sort.go b/vendor/github.com/docker/go-connections/nat/sort.go new file mode 100644 index 00000000..ce950171 --- /dev/null +++ b/vendor/github.com/docker/go-connections/nat/sort.go @@ -0,0 +1,96 @@ +package nat + +import ( + "sort" + "strings" +) + +type portSorter struct { + ports []Port + by func(i, j Port) bool +} + +func (s *portSorter) Len() int { + return len(s.ports) +} + +func (s *portSorter) Swap(i, j int) { + s.ports[i], s.ports[j] = s.ports[j], s.ports[i] +} + +func (s *portSorter) Less(i, j int) bool { + ip := s.ports[i] + jp := s.ports[j] + + return s.by(ip, jp) +} + +// Sort sorts a list of ports using the provided predicate +// This function should compare `i` and `j`, returning true if `i` is +// considered to be less than `j` +func Sort(ports []Port, predicate func(i, j Port) bool) { + s := &portSorter{ports, predicate} + sort.Sort(s) +} + +type portMapEntry struct { + port Port + binding PortBinding +} + +type portMapSorter []portMapEntry + +func (s portMapSorter) Len() int { return len(s) } +func (s portMapSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// sort the port so that the order is: +// 1. port with larger specified bindings +// 2. larger port +// 3. port with tcp protocol +func (s portMapSorter) Less(i, j int) bool { + pi, pj := s[i].port, s[j].port + hpi, hpj := toInt(s[i].binding.HostPort), toInt(s[j].binding.HostPort) + return hpi > hpj || pi.Int() > pj.Int() || (pi.Int() == pj.Int() && strings.ToLower(pi.Proto()) == "tcp") +} + +// SortPortMap sorts the list of ports and their respected mapping. The ports +// will explicit HostPort will be placed first. +func SortPortMap(ports []Port, bindings PortMap) { + s := portMapSorter{} + for _, p := range ports { + if binding, ok := bindings[p]; ok { + for _, b := range binding { + s = append(s, portMapEntry{port: p, binding: b}) + } + bindings[p] = []PortBinding{} + } else { + s = append(s, portMapEntry{port: p}) + } + } + + sort.Sort(s) + var ( + i int + pm = make(map[Port]struct{}) + ) + // reorder ports + for _, entry := range s { + if _, ok := pm[entry.port]; !ok { + ports[i] = entry.port + pm[entry.port] = struct{}{} + i++ + } + // reorder bindings for this port + if _, ok := bindings[entry.port]; ok { + bindings[entry.port] = append(bindings[entry.port], entry.binding) + } + } +} + +func toInt(s string) uint64 { + i, _, err := ParsePortRange(s) + if err != nil { + i = 0 + } + return i +} diff --git a/vendor/github.com/docker/go-connections/sockets/README.md b/vendor/github.com/docker/go-connections/sockets/README.md new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/docker/go-connections/sockets/inmem_socket.go b/vendor/github.com/docker/go-connections/sockets/inmem_socket.go new file mode 100644 index 00000000..99846ffd --- /dev/null +++ b/vendor/github.com/docker/go-connections/sockets/inmem_socket.go @@ -0,0 +1,81 @@ +package sockets + +import ( + "errors" + "net" + "sync" +) + +var errClosed = errors.New("use of closed network connection") + +// InmemSocket implements net.Listener using in-memory only connections. +type InmemSocket struct { + chConn chan net.Conn + chClose chan struct{} + addr string + mu sync.Mutex +} + +// dummyAddr is used to satisfy net.Addr for the in-mem socket +// it is just stored as a string and returns the string for all calls +type dummyAddr string + +// NewInmemSocket creates an in-memory only net.Listener +// The addr argument can be any string, but is used to satisfy the `Addr()` part +// of the net.Listener interface +func NewInmemSocket(addr string, bufSize int) *InmemSocket { + return &InmemSocket{ + chConn: make(chan net.Conn, bufSize), + chClose: make(chan struct{}), + addr: addr, + } +} + +// Addr returns the socket's addr string to satisfy net.Listener +func (s *InmemSocket) Addr() net.Addr { + return dummyAddr(s.addr) +} + +// Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn. +func (s *InmemSocket) Accept() (net.Conn, error) { + select { + case conn := <-s.chConn: + return conn, nil + case <-s.chClose: + return nil, errClosed + } +} + +// Close closes the listener. It will be unavailable for use once closed. +func (s *InmemSocket) Close() error { + s.mu.Lock() + defer s.mu.Unlock() + select { + case <-s.chClose: + default: + close(s.chClose) + } + return nil +} + +// Dial is used to establish a connection with the in-mem server +func (s *InmemSocket) Dial(network, addr string) (net.Conn, error) { + srvConn, clientConn := net.Pipe() + select { + case s.chConn <- srvConn: + case <-s.chClose: + return nil, errClosed + } + + return clientConn, nil +} + +// Network returns the addr string, satisfies net.Addr +func (a dummyAddr) Network() string { + return string(a) +} + +// String returns the string form +func (a dummyAddr) String() string { + return string(a) +} diff --git a/vendor/github.com/docker/go-connections/sockets/proxy.go b/vendor/github.com/docker/go-connections/sockets/proxy.go new file mode 100644 index 00000000..98e9a1dc --- /dev/null +++ b/vendor/github.com/docker/go-connections/sockets/proxy.go @@ -0,0 +1,51 @@ +package sockets + +import ( + "net" + "net/url" + "os" + "strings" + + "golang.org/x/net/proxy" +) + +// GetProxyEnv allows access to the uppercase and the lowercase forms of +// proxy-related variables. See the Go specification for details on these +// variables. https://golang.org/pkg/net/http/ +func GetProxyEnv(key string) string { + proxyValue := os.Getenv(strings.ToUpper(key)) + if proxyValue == "" { + return os.Getenv(strings.ToLower(key)) + } + return proxyValue +} + +// DialerFromEnvironment takes in a "direct" *net.Dialer and returns a +// proxy.Dialer which will route the connections through the proxy using the +// given dialer. +func DialerFromEnvironment(direct *net.Dialer) (proxy.Dialer, error) { + allProxy := GetProxyEnv("all_proxy") + if len(allProxy) == 0 { + return direct, nil + } + + proxyURL, err := url.Parse(allProxy) + if err != nil { + return direct, err + } + + proxyFromURL, err := proxy.FromURL(proxyURL, direct) + if err != nil { + return direct, err + } + + noProxy := GetProxyEnv("no_proxy") + if len(noProxy) == 0 { + return proxyFromURL, nil + } + + perHost := proxy.NewPerHost(proxyFromURL, direct) + perHost.AddFromString(noProxy) + + return perHost, nil +} diff --git a/vendor/github.com/docker/go-connections/sockets/sockets.go b/vendor/github.com/docker/go-connections/sockets/sockets.go new file mode 100644 index 00000000..a1d7beb4 --- /dev/null +++ b/vendor/github.com/docker/go-connections/sockets/sockets.go @@ -0,0 +1,38 @@ +// Package sockets provides helper functions to create and configure Unix or TCP sockets. +package sockets + +import ( + "errors" + "net" + "net/http" + "time" +) + +// Why 32? See https://github.com/docker/docker/pull/8035. +const defaultTimeout = 32 * time.Second + +// ErrProtocolNotAvailable is returned when a given transport protocol is not provided by the operating system. +var ErrProtocolNotAvailable = errors.New("protocol not available") + +// ConfigureTransport configures the specified Transport according to the +// specified proto and addr. +// If the proto is unix (using a unix socket to communicate) or npipe the +// compression is disabled. +func ConfigureTransport(tr *http.Transport, proto, addr string) error { + switch proto { + case "unix": + return configureUnixTransport(tr, proto, addr) + case "npipe": + return configureNpipeTransport(tr, proto, addr) + default: + tr.Proxy = http.ProxyFromEnvironment + dialer, err := DialerFromEnvironment(&net.Dialer{ + Timeout: defaultTimeout, + }) + if err != nil { + return err + } + tr.Dial = dialer.Dial + } + return nil +} diff --git a/vendor/github.com/docker/go-connections/sockets/sockets_unix.go b/vendor/github.com/docker/go-connections/sockets/sockets_unix.go new file mode 100644 index 00000000..386cf0db --- /dev/null +++ b/vendor/github.com/docker/go-connections/sockets/sockets_unix.go @@ -0,0 +1,35 @@ +// +build !windows + +package sockets + +import ( + "fmt" + "net" + "net/http" + "syscall" + "time" +) + +const maxUnixSocketPathSize = len(syscall.RawSockaddrUnix{}.Path) + +func configureUnixTransport(tr *http.Transport, proto, addr string) error { + if len(addr) > maxUnixSocketPathSize { + return fmt.Errorf("Unix socket path %q is too long", addr) + } + // No need for compression in local communications. + tr.DisableCompression = true + tr.Dial = func(_, _ string) (net.Conn, error) { + return net.DialTimeout(proto, addr, defaultTimeout) + } + return nil +} + +func configureNpipeTransport(tr *http.Transport, proto, addr string) error { + return ErrProtocolNotAvailable +} + +// DialPipe connects to a Windows named pipe. +// This is not supported on other OSes. +func DialPipe(_ string, _ time.Duration) (net.Conn, error) { + return nil, syscall.EAFNOSUPPORT +} diff --git a/vendor/github.com/docker/go-connections/sockets/sockets_windows.go b/vendor/github.com/docker/go-connections/sockets/sockets_windows.go new file mode 100644 index 00000000..5c21644e --- /dev/null +++ b/vendor/github.com/docker/go-connections/sockets/sockets_windows.go @@ -0,0 +1,27 @@ +package sockets + +import ( + "net" + "net/http" + "time" + + "github.com/Microsoft/go-winio" +) + +func configureUnixTransport(tr *http.Transport, proto, addr string) error { + return ErrProtocolNotAvailable +} + +func configureNpipeTransport(tr *http.Transport, proto, addr string) error { + // No need for compression in local communications. + tr.DisableCompression = true + tr.Dial = func(_, _ string) (net.Conn, error) { + return DialPipe(addr, defaultTimeout) + } + return nil +} + +// DialPipe connects to a Windows named pipe. +func DialPipe(addr string, timeout time.Duration) (net.Conn, error) { + return winio.DialPipe(addr, &timeout) +} diff --git a/vendor/github.com/docker/go-connections/sockets/tcp_socket.go b/vendor/github.com/docker/go-connections/sockets/tcp_socket.go new file mode 100644 index 00000000..53cbb6c7 --- /dev/null +++ b/vendor/github.com/docker/go-connections/sockets/tcp_socket.go @@ -0,0 +1,22 @@ +// Package sockets provides helper functions to create and configure Unix or TCP sockets. +package sockets + +import ( + "crypto/tls" + "net" +) + +// NewTCPSocket creates a TCP socket listener with the specified address and +// the specified tls configuration. If TLSConfig is set, will encapsulate the +// TCP listener inside a TLS one. +func NewTCPSocket(addr string, tlsConfig *tls.Config) (net.Listener, error) { + l, err := net.Listen("tcp", addr) + if err != nil { + return nil, err + } + if tlsConfig != nil { + tlsConfig.NextProtos = []string{"http/1.1"} + l = tls.NewListener(l, tlsConfig) + } + return l, nil +} diff --git a/vendor/github.com/docker/go-connections/sockets/unix_socket.go b/vendor/github.com/docker/go-connections/sockets/unix_socket.go new file mode 100644 index 00000000..a8b5dbb6 --- /dev/null +++ b/vendor/github.com/docker/go-connections/sockets/unix_socket.go @@ -0,0 +1,32 @@ +// +build !windows + +package sockets + +import ( + "net" + "os" + "syscall" +) + +// NewUnixSocket creates a unix socket with the specified path and group. +func NewUnixSocket(path string, gid int) (net.Listener, error) { + if err := syscall.Unlink(path); err != nil && !os.IsNotExist(err) { + return nil, err + } + mask := syscall.Umask(0777) + defer syscall.Umask(mask) + + l, err := net.Listen("unix", path) + if err != nil { + return nil, err + } + if err := os.Chown(path, 0, gid); err != nil { + l.Close() + return nil, err + } + if err := os.Chmod(path, 0660); err != nil { + l.Close() + return nil, err + } + return l, nil +} diff --git a/vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go b/vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go new file mode 100644 index 00000000..1ca0965e --- /dev/null +++ b/vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go @@ -0,0 +1,18 @@ +// +build go1.7 + +package tlsconfig + +import ( + "crypto/x509" + "runtime" +) + +// SystemCertPool returns a copy of the system cert pool, +// returns an error if failed to load or empty pool on windows. +func SystemCertPool() (*x509.CertPool, error) { + certpool, err := x509.SystemCertPool() + if err != nil && runtime.GOOS == "windows" { + return x509.NewCertPool(), nil + } + return certpool, err +} diff --git a/vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go b/vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go new file mode 100644 index 00000000..1ff81c33 --- /dev/null +++ b/vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go @@ -0,0 +1,13 @@ +// +build !go1.7 + +package tlsconfig + +import ( + "crypto/x509" +) + +// SystemCertPool returns an new empty cert pool, +// accessing system cert pool is supported in go 1.7 +func SystemCertPool() (*x509.CertPool, error) { + return x509.NewCertPool(), nil +} diff --git a/vendor/github.com/docker/go-connections/tlsconfig/config.go b/vendor/github.com/docker/go-connections/tlsconfig/config.go new file mode 100644 index 00000000..0ef3fdcb --- /dev/null +++ b/vendor/github.com/docker/go-connections/tlsconfig/config.go @@ -0,0 +1,254 @@ +// Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers. +// +// As a reminder from https://golang.org/pkg/crypto/tls/#Config: +// A Config structure is used to configure a TLS client or server. After one has been passed to a TLS function it must not be modified. +// A Config may be reused; the tls package will also not modify it. +package tlsconfig + +import ( + "crypto/tls" + "crypto/x509" + "encoding/pem" + "fmt" + "io/ioutil" + "os" + + "github.com/pkg/errors" +) + +// Options represents the information needed to create client and server TLS configurations. +type Options struct { + CAFile string + + // If either CertFile or KeyFile is empty, Client() will not load them + // preventing the client from authenticating to the server. + // However, Server() requires them and will error out if they are empty. + CertFile string + KeyFile string + + // client-only option + InsecureSkipVerify bool + // server-only option + ClientAuth tls.ClientAuthType + // If ExclusiveRootPools is set, then if a CA file is provided, the root pool used for TLS + // creds will include exclusively the roots in that CA file. If no CA file is provided, + // the system pool will be used. + ExclusiveRootPools bool + MinVersion uint16 + // If Passphrase is set, it will be used to decrypt a TLS private key + // if the key is encrypted + Passphrase string +} + +// Extra (server-side) accepted CBC cipher suites - will phase out in the future +var acceptedCBCCiphers = []uint16{ + tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, +} + +// DefaultServerAcceptedCiphers should be uses by code which already has a crypto/tls +// options struct but wants to use a commonly accepted set of TLS cipher suites, with +// known weak algorithms removed. +var DefaultServerAcceptedCiphers = append(clientCipherSuites, acceptedCBCCiphers...) + +// allTLSVersions lists all the TLS versions and is used by the code that validates +// a uint16 value as a TLS version. +var allTLSVersions = map[uint16]struct{}{ + tls.VersionSSL30: {}, + tls.VersionTLS10: {}, + tls.VersionTLS11: {}, + tls.VersionTLS12: {}, +} + +// ServerDefault returns a secure-enough TLS configuration for the server TLS configuration. +func ServerDefault(ops ...func(*tls.Config)) *tls.Config { + tlsconfig := &tls.Config{ + // Avoid fallback by default to SSL protocols < TLS1.2 + MinVersion: tls.VersionTLS12, + PreferServerCipherSuites: true, + CipherSuites: DefaultServerAcceptedCiphers, + } + + for _, op := range ops { + op(tlsconfig) + } + + return tlsconfig +} + +// ClientDefault returns a secure-enough TLS configuration for the client TLS configuration. +func ClientDefault(ops ...func(*tls.Config)) *tls.Config { + tlsconfig := &tls.Config{ + // Prefer TLS1.2 as the client minimum + MinVersion: tls.VersionTLS12, + CipherSuites: clientCipherSuites, + } + + for _, op := range ops { + op(tlsconfig) + } + + return tlsconfig +} + +// certPool returns an X.509 certificate pool from `caFile`, the certificate file. +func certPool(caFile string, exclusivePool bool) (*x509.CertPool, error) { + // If we should verify the server, we need to load a trusted ca + var ( + certPool *x509.CertPool + err error + ) + if exclusivePool { + certPool = x509.NewCertPool() + } else { + certPool, err = SystemCertPool() + if err != nil { + return nil, fmt.Errorf("failed to read system certificates: %v", err) + } + } + pem, err := ioutil.ReadFile(caFile) + if err != nil { + return nil, fmt.Errorf("could not read CA certificate %q: %v", caFile, err) + } + if !certPool.AppendCertsFromPEM(pem) { + return nil, fmt.Errorf("failed to append certificates from PEM file: %q", caFile) + } + return certPool, nil +} + +// isValidMinVersion checks that the input value is a valid tls minimum version +func isValidMinVersion(version uint16) bool { + _, ok := allTLSVersions[version] + return ok +} + +// adjustMinVersion sets the MinVersion on `config`, the input configuration. +// It assumes the current MinVersion on the `config` is the lowest allowed. +func adjustMinVersion(options Options, config *tls.Config) error { + if options.MinVersion > 0 { + if !isValidMinVersion(options.MinVersion) { + return fmt.Errorf("Invalid minimum TLS version: %x", options.MinVersion) + } + if options.MinVersion < config.MinVersion { + return fmt.Errorf("Requested minimum TLS version is too low. Should be at-least: %x", config.MinVersion) + } + config.MinVersion = options.MinVersion + } + + return nil +} + +// IsErrEncryptedKey returns true if the 'err' is an error of incorrect +// password when tryin to decrypt a TLS private key +func IsErrEncryptedKey(err error) bool { + return errors.Cause(err) == x509.IncorrectPasswordError +} + +// getPrivateKey returns the private key in 'keyBytes', in PEM-encoded format. +// If the private key is encrypted, 'passphrase' is used to decrypted the +// private key. +func getPrivateKey(keyBytes []byte, passphrase string) ([]byte, error) { + // this section makes some small changes to code from notary/tuf/utils/x509.go + pemBlock, _ := pem.Decode(keyBytes) + if pemBlock == nil { + return nil, fmt.Errorf("no valid private key found") + } + + var err error + if x509.IsEncryptedPEMBlock(pemBlock) { + keyBytes, err = x509.DecryptPEMBlock(pemBlock, []byte(passphrase)) + if err != nil { + return nil, errors.Wrap(err, "private key is encrypted, but could not decrypt it") + } + keyBytes = pem.EncodeToMemory(&pem.Block{Type: pemBlock.Type, Bytes: keyBytes}) + } + + return keyBytes, nil +} + +// getCert returns a Certificate from the CertFile and KeyFile in 'options', +// if the key is encrypted, the Passphrase in 'options' will be used to +// decrypt it. +func getCert(options Options) ([]tls.Certificate, error) { + if options.CertFile == "" && options.KeyFile == "" { + return nil, nil + } + + errMessage := "Could not load X509 key pair" + + cert, err := ioutil.ReadFile(options.CertFile) + if err != nil { + return nil, errors.Wrap(err, errMessage) + } + + prKeyBytes, err := ioutil.ReadFile(options.KeyFile) + if err != nil { + return nil, errors.Wrap(err, errMessage) + } + + prKeyBytes, err = getPrivateKey(prKeyBytes, options.Passphrase) + if err != nil { + return nil, errors.Wrap(err, errMessage) + } + + tlsCert, err := tls.X509KeyPair(cert, prKeyBytes) + if err != nil { + return nil, errors.Wrap(err, errMessage) + } + + return []tls.Certificate{tlsCert}, nil +} + +// Client returns a TLS configuration meant to be used by a client. +func Client(options Options) (*tls.Config, error) { + tlsConfig := ClientDefault() + tlsConfig.InsecureSkipVerify = options.InsecureSkipVerify + if !options.InsecureSkipVerify && options.CAFile != "" { + CAs, err := certPool(options.CAFile, options.ExclusiveRootPools) + if err != nil { + return nil, err + } + tlsConfig.RootCAs = CAs + } + + tlsCerts, err := getCert(options) + if err != nil { + return nil, err + } + tlsConfig.Certificates = tlsCerts + + if err := adjustMinVersion(options, tlsConfig); err != nil { + return nil, err + } + + return tlsConfig, nil +} + +// Server returns a TLS configuration meant to be used by a server. +func Server(options Options) (*tls.Config, error) { + tlsConfig := ServerDefault() + tlsConfig.ClientAuth = options.ClientAuth + tlsCert, err := tls.LoadX509KeyPair(options.CertFile, options.KeyFile) + if err != nil { + if os.IsNotExist(err) { + return nil, fmt.Errorf("Could not load X509 key pair (cert: %q, key: %q): %v", options.CertFile, options.KeyFile, err) + } + return nil, fmt.Errorf("Error reading X509 key pair (cert: %q, key: %q): %v. Make sure the key is not encrypted.", options.CertFile, options.KeyFile, err) + } + tlsConfig.Certificates = []tls.Certificate{tlsCert} + if options.ClientAuth >= tls.VerifyClientCertIfGiven && options.CAFile != "" { + CAs, err := certPool(options.CAFile, options.ExclusiveRootPools) + if err != nil { + return nil, err + } + tlsConfig.ClientCAs = CAs + } + + if err := adjustMinVersion(options, tlsConfig); err != nil { + return nil, err + } + + return tlsConfig, nil +} diff --git a/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go b/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go new file mode 100644 index 00000000..6b4c6a7c --- /dev/null +++ b/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go @@ -0,0 +1,17 @@ +// +build go1.5 + +// Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers. +// +package tlsconfig + +import ( + "crypto/tls" +) + +// Client TLS cipher suites (dropping CBC ciphers for client preferred suite set) +var clientCipherSuites = []uint16{ + tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, +} diff --git a/vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go b/vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go new file mode 100644 index 00000000..ee22df47 --- /dev/null +++ b/vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go @@ -0,0 +1,15 @@ +// +build !go1.5 + +// Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers. +// +package tlsconfig + +import ( + "crypto/tls" +) + +// Client TLS cipher suites (dropping CBC ciphers for client preferred suite set) +var clientCipherSuites = []uint16{ + tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, +} diff --git a/vendor/github.com/docker/go-units/CONTRIBUTING.md b/vendor/github.com/docker/go-units/CONTRIBUTING.md new file mode 100644 index 00000000..9ea86d78 --- /dev/null +++ b/vendor/github.com/docker/go-units/CONTRIBUTING.md @@ -0,0 +1,67 @@ +# Contributing to go-units + +Want to hack on go-units? Awesome! Here are instructions to get you started. + +go-units is a part of the [Docker](https://www.docker.com) project, and follows +the same rules and principles. If you're already familiar with the way +Docker does things, you'll feel right at home. + +Otherwise, go read Docker's +[contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md), +[issue triaging](https://github.com/docker/docker/blob/master/project/ISSUE-TRIAGE.md), +[review process](https://github.com/docker/docker/blob/master/project/REVIEWING.md) and +[branches and tags](https://github.com/docker/docker/blob/master/project/BRANCHES-AND-TAGS.md). + +### Sign your work + +The sign-off is a simple line at the end of the explanation for the patch. Your +signature certifies that you wrote the patch or otherwise have the right to pass +it on as an open-source patch. The rules are pretty simple: if you can certify +the below (from [developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +Then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +Use your real name (sorry, no pseudonyms or anonymous contributions.) + +If you set your `user.name` and `user.email` git configs, you can sign your +commit automatically with `git commit -s`. diff --git a/vendor/github.com/docker/go-units/LICENSE b/vendor/github.com/docker/go-units/LICENSE new file mode 100644 index 00000000..b55b37bc --- /dev/null +++ b/vendor/github.com/docker/go-units/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2015 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/docker/go-units/MAINTAINERS b/vendor/github.com/docker/go-units/MAINTAINERS new file mode 100644 index 00000000..4aac7c74 --- /dev/null +++ b/vendor/github.com/docker/go-units/MAINTAINERS @@ -0,0 +1,46 @@ +# go-units maintainers file +# +# This file describes who runs the docker/go-units project and how. +# This is a living document - if you see something out of date or missing, speak up! +# +# It is structured to be consumable by both humans and programs. +# To extract its contents programmatically, use any TOML-compliant parser. +# +# This file is compiled into the MAINTAINERS file in docker/opensource. +# +[Org] + [Org."Core maintainers"] + people = [ + "akihirosuda", + "dnephin", + "thajeztah", + "vdemeester", + ] + +[people] + +# A reference list of all people associated with the project. +# All other sections should refer to people by their canonical key +# in the people section. + + # ADD YOURSELF HERE IN ALPHABETICAL ORDER + + [people.akihirosuda] + Name = "Akihiro Suda" + Email = "akihiro.suda.cz@hco.ntt.co.jp" + GitHub = "AkihiroSuda" + + [people.dnephin] + Name = "Daniel Nephin" + Email = "dnephin@gmail.com" + GitHub = "dnephin" + + [people.thajeztah] + Name = "Sebastiaan van Stijn" + Email = "github@gone.nl" + GitHub = "thaJeztah" + + [people.vdemeester] + Name = "Vincent Demeester" + Email = "vincent@sbr.pm" + GitHub = "vdemeester" \ No newline at end of file diff --git a/vendor/github.com/docker/go-units/README.md b/vendor/github.com/docker/go-units/README.md new file mode 100644 index 00000000..4f70a4e1 --- /dev/null +++ b/vendor/github.com/docker/go-units/README.md @@ -0,0 +1,16 @@ +[![GoDoc](https://godoc.org/github.com/docker/go-units?status.svg)](https://godoc.org/github.com/docker/go-units) + +# Introduction + +go-units is a library to transform human friendly measurements into machine friendly values. + +## Usage + +See the [docs in godoc](https://godoc.org/github.com/docker/go-units) for examples and documentation. + +## Copyright and license + +Copyright © 2015 Docker, Inc. + +go-units is licensed under the Apache License, Version 2.0. +See [LICENSE](LICENSE) for the full text of the license. diff --git a/vendor/github.com/docker/go-units/circle.yml b/vendor/github.com/docker/go-units/circle.yml new file mode 100644 index 00000000..af9d6055 --- /dev/null +++ b/vendor/github.com/docker/go-units/circle.yml @@ -0,0 +1,11 @@ +dependencies: + post: + # install golint + - go get golang.org/x/lint/golint + +test: + pre: + # run analysis before tests + - go vet ./... + - test -z "$(golint ./... | tee /dev/stderr)" + - test -z "$(gofmt -s -l . | tee /dev/stderr)" diff --git a/vendor/github.com/docker/go-units/duration.go b/vendor/github.com/docker/go-units/duration.go new file mode 100644 index 00000000..48dd8744 --- /dev/null +++ b/vendor/github.com/docker/go-units/duration.go @@ -0,0 +1,35 @@ +// Package units provides helper function to parse and print size and time units +// in human-readable format. +package units + +import ( + "fmt" + "time" +) + +// HumanDuration returns a human-readable approximation of a duration +// (eg. "About a minute", "4 hours ago", etc.). +func HumanDuration(d time.Duration) string { + if seconds := int(d.Seconds()); seconds < 1 { + return "Less than a second" + } else if seconds == 1 { + return "1 second" + } else if seconds < 60 { + return fmt.Sprintf("%d seconds", seconds) + } else if minutes := int(d.Minutes()); minutes == 1 { + return "About a minute" + } else if minutes < 60 { + return fmt.Sprintf("%d minutes", minutes) + } else if hours := int(d.Hours() + 0.5); hours == 1 { + return "About an hour" + } else if hours < 48 { + return fmt.Sprintf("%d hours", hours) + } else if hours < 24*7*2 { + return fmt.Sprintf("%d days", hours/24) + } else if hours < 24*30*2 { + return fmt.Sprintf("%d weeks", hours/24/7) + } else if hours < 24*365*2 { + return fmt.Sprintf("%d months", hours/24/30) + } + return fmt.Sprintf("%d years", int(d.Hours())/24/365) +} diff --git a/vendor/github.com/docker/go-units/size.go b/vendor/github.com/docker/go-units/size.go new file mode 100644 index 00000000..85f6ab07 --- /dev/null +++ b/vendor/github.com/docker/go-units/size.go @@ -0,0 +1,108 @@ +package units + +import ( + "fmt" + "regexp" + "strconv" + "strings" +) + +// See: http://en.wikipedia.org/wiki/Binary_prefix +const ( + // Decimal + + KB = 1000 + MB = 1000 * KB + GB = 1000 * MB + TB = 1000 * GB + PB = 1000 * TB + + // Binary + + KiB = 1024 + MiB = 1024 * KiB + GiB = 1024 * MiB + TiB = 1024 * GiB + PiB = 1024 * TiB +) + +type unitMap map[string]int64 + +var ( + decimalMap = unitMap{"k": KB, "m": MB, "g": GB, "t": TB, "p": PB} + binaryMap = unitMap{"k": KiB, "m": MiB, "g": GiB, "t": TiB, "p": PiB} + sizeRegex = regexp.MustCompile(`^(\d+(\.\d+)*) ?([kKmMgGtTpP])?[iI]?[bB]?$`) +) + +var decimapAbbrs = []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"} +var binaryAbbrs = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"} + +func getSizeAndUnit(size float64, base float64, _map []string) (float64, string) { + i := 0 + unitsLimit := len(_map) - 1 + for size >= base && i < unitsLimit { + size = size / base + i++ + } + return size, _map[i] +} + +// CustomSize returns a human-readable approximation of a size +// using custom format. +func CustomSize(format string, size float64, base float64, _map []string) string { + size, unit := getSizeAndUnit(size, base, _map) + return fmt.Sprintf(format, size, unit) +} + +// HumanSizeWithPrecision allows the size to be in any precision, +// instead of 4 digit precision used in units.HumanSize. +func HumanSizeWithPrecision(size float64, precision int) string { + size, unit := getSizeAndUnit(size, 1000.0, decimapAbbrs) + return fmt.Sprintf("%.*g%s", precision, size, unit) +} + +// HumanSize returns a human-readable approximation of a size +// capped at 4 valid numbers (eg. "2.746 MB", "796 KB"). +func HumanSize(size float64) string { + return HumanSizeWithPrecision(size, 4) +} + +// BytesSize returns a human-readable size in bytes, kibibytes, +// mebibytes, gibibytes, or tebibytes (eg. "44kiB", "17MiB"). +func BytesSize(size float64) string { + return CustomSize("%.4g%s", size, 1024.0, binaryAbbrs) +} + +// FromHumanSize returns an integer from a human-readable specification of a +// size using SI standard (eg. "44kB", "17MB"). +func FromHumanSize(size string) (int64, error) { + return parseSize(size, decimalMap) +} + +// RAMInBytes parses a human-readable string representing an amount of RAM +// in bytes, kibibytes, mebibytes, gibibytes, or tebibytes and +// returns the number of bytes, or -1 if the string is unparseable. +// Units are case-insensitive, and the 'b' suffix is optional. +func RAMInBytes(size string) (int64, error) { + return parseSize(size, binaryMap) +} + +// Parses the human-readable size string into the amount it represents. +func parseSize(sizeStr string, uMap unitMap) (int64, error) { + matches := sizeRegex.FindStringSubmatch(sizeStr) + if len(matches) != 4 { + return -1, fmt.Errorf("invalid size: '%s'", sizeStr) + } + + size, err := strconv.ParseFloat(matches[1], 64) + if err != nil { + return -1, err + } + + unitPrefix := strings.ToLower(matches[3]) + if mul, ok := uMap[unitPrefix]; ok { + size *= float64(mul) + } + + return int64(size), nil +} diff --git a/vendor/github.com/docker/go-units/ulimit.go b/vendor/github.com/docker/go-units/ulimit.go new file mode 100644 index 00000000..fca0400c --- /dev/null +++ b/vendor/github.com/docker/go-units/ulimit.go @@ -0,0 +1,123 @@ +package units + +import ( + "fmt" + "strconv" + "strings" +) + +// Ulimit is a human friendly version of Rlimit. +type Ulimit struct { + Name string + Hard int64 + Soft int64 +} + +// Rlimit specifies the resource limits, such as max open files. +type Rlimit struct { + Type int `json:"type,omitempty"` + Hard uint64 `json:"hard,omitempty"` + Soft uint64 `json:"soft,omitempty"` +} + +const ( + // magic numbers for making the syscall + // some of these are defined in the syscall package, but not all. + // Also since Windows client doesn't get access to the syscall package, need to + // define these here + rlimitAs = 9 + rlimitCore = 4 + rlimitCPU = 0 + rlimitData = 2 + rlimitFsize = 1 + rlimitLocks = 10 + rlimitMemlock = 8 + rlimitMsgqueue = 12 + rlimitNice = 13 + rlimitNofile = 7 + rlimitNproc = 6 + rlimitRss = 5 + rlimitRtprio = 14 + rlimitRttime = 15 + rlimitSigpending = 11 + rlimitStack = 3 +) + +var ulimitNameMapping = map[string]int{ + //"as": rlimitAs, // Disabled since this doesn't seem usable with the way Docker inits a container. + "core": rlimitCore, + "cpu": rlimitCPU, + "data": rlimitData, + "fsize": rlimitFsize, + "locks": rlimitLocks, + "memlock": rlimitMemlock, + "msgqueue": rlimitMsgqueue, + "nice": rlimitNice, + "nofile": rlimitNofile, + "nproc": rlimitNproc, + "rss": rlimitRss, + "rtprio": rlimitRtprio, + "rttime": rlimitRttime, + "sigpending": rlimitSigpending, + "stack": rlimitStack, +} + +// ParseUlimit parses and returns a Ulimit from the specified string. +func ParseUlimit(val string) (*Ulimit, error) { + parts := strings.SplitN(val, "=", 2) + if len(parts) != 2 { + return nil, fmt.Errorf("invalid ulimit argument: %s", val) + } + + if _, exists := ulimitNameMapping[parts[0]]; !exists { + return nil, fmt.Errorf("invalid ulimit type: %s", parts[0]) + } + + var ( + soft int64 + hard = &soft // default to soft in case no hard was set + temp int64 + err error + ) + switch limitVals := strings.Split(parts[1], ":"); len(limitVals) { + case 2: + temp, err = strconv.ParseInt(limitVals[1], 10, 64) + if err != nil { + return nil, err + } + hard = &temp + fallthrough + case 1: + soft, err = strconv.ParseInt(limitVals[0], 10, 64) + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("too many limit value arguments - %s, can only have up to two, `soft[:hard]`", parts[1]) + } + + if *hard != -1 { + if soft == -1 { + return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: soft: -1 (unlimited), hard: %d", *hard) + } + if soft > *hard { + return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: %d > %d", soft, *hard) + } + } + + return &Ulimit{Name: parts[0], Soft: soft, Hard: *hard}, nil +} + +// GetRlimit returns the RLimit corresponding to Ulimit. +func (u *Ulimit) GetRlimit() (*Rlimit, error) { + t, exists := ulimitNameMapping[u.Name] + if !exists { + return nil, fmt.Errorf("invalid ulimit name %s", u.Name) + } + + return &Rlimit{Type: t, Soft: uint64(u.Soft), Hard: uint64(u.Hard)}, nil +} + +func (u *Ulimit) String() string { + return fmt.Sprintf("%s=%d:%d", u.Name, u.Soft, u.Hard) +} diff --git a/vendor/github.com/gdamore/tcell/database.json b/vendor/github.com/gdamore/tcell/database.json deleted file mode 100644 index 2769591a..00000000 --- a/vendor/github.com/gdamore/tcell/database.json +++ /dev/null @@ -1,1351 +0,0 @@ -{"name":"rxvt-unicode","cols":80,"lines":24,"colors":88,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[r\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[38;5;%p1%dm","setbg":"\u001b[48;5;%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~-A.B+C,D0EhFiG","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[38;5;%p1%d;48;5;%p2%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"rxvt-unicode-256color","cols":80,"lines":24,"colors":256,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[r\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[38;5;%p1%dm","setbg":"\u001b[48;5;%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~-A.B+C,D0EhFiG","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[38;5;%p1%d;48;5;%p2%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"Eterm","aliases":["Eterm-color"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"Eterm-256color","cols":80,"lines":24,"colors":256,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"Eterm-88color","cols":80,"lines":24,"colors":88,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"NCR260VT300WPP","aliases":["ncr260vt300wpp"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[4~","khome":"\u001b[H","kend":"\u001b[1~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"aaa","aliases":["aaa-30","ambas","ambassador"],"cols":80,"lines":30,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[30;0;0;30p","rmcup":"\u001b[60;0;0;30p\u001b[30;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa+unk","aliases":["aaa-unk"],"cols":80,"lines":-1,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-18","cols":80,"lines":18,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[18;0;0;18p","rmcup":"\u001b[60;0;0;18p\u001b[60;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-18-rv","cols":80,"lines":18,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[18;0;0;18p","rmcup":"\u001b[60;0;0;18p\u001b[60;1H\u001b[K","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-20","cols":80,"lines":20,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[20;0;0;20p","rmcup":"\u001b[60;0;0;20p\u001b[60;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-22","cols":80,"lines":22,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[22;0;0;22p","rmcup":"\u001b[60;0;0;22p\u001b[60;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-24","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[24;0;0;24p","rmcup":"\u001b[60;0;0;24p\u001b[60;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-24-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[24;0;0;24p","rmcup":"\u001b[60;0;0;24p\u001b[60;1H\u001b[K","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-26","cols":80,"lines":26,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[26;0;0;26p","rmcup":"\u001b[60;0;0;26p\u001b[26;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-28","cols":80,"lines":28,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[28;0;0;28p","rmcup":"\u001b[60;0;0;28p\u001b[28;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-30-ctxt","aliases":["aaa-ctxt"],"cols":80,"lines":30,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[30;0;0;30p","rmcup":"\u001b[60;0;0;30p\u001b[60;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-30-rv","aliases":["aaa-rv"],"cols":80,"lines":30,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[30;0;0;30p","rmcup":"\u001b[60;0;0;30p\u001b[30;1H\u001b[K","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-30-rv-ctxt","aliases":["aaa-rv-ctxt"],"cols":80,"lines":30,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[30;0;0;30p","rmcup":"\u001b[60;0;0;30p\u001b[60;1H\u001b[K","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-30-s","aliases":["aaa-s"],"cols":80,"lines":29,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[30;1;0;30p\u001b[30;1H\u001b[K","rmcup":"\u001b[60;1;0;30p\u001b[29;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-30-s-rv","aliases":["aaa-s-rv"],"cols":80,"lines":29,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[30;1;0;30p\u001b[30;1H\u001b[K","rmcup":"\u001b[60;1;0;30p\u001b[29;1H\u001b[K","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-36","cols":80,"lines":36,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[36;0;0;36p","rmcup":"\u001b[60;0;0;36p\u001b[36;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-36-rv","cols":80,"lines":36,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[36;0;0;36p","rmcup":"\u001b[60;0;0;36p\u001b[36;1H\u001b[K","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-40","cols":80,"lines":40,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[40;0;0;40p","rmcup":"\u001b[60;0;0;40p\u001b[40;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-40-rv","cols":80,"lines":40,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[40;0;0;40p","rmcup":"\u001b[60;0;0;40p\u001b[40;1H\u001b[K","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-48","cols":80,"lines":48,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[48;0;0;48p","rmcup":"\u001b[60;0;0;48p\u001b[48;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-48-rv","cols":80,"lines":48,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[48;0;0;48p","rmcup":"\u001b[60;0;0;48p\u001b[48;1H\u001b[K","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-60","cols":80,"lines":60,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-60-dec-rv","cols":80,"lines":59,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J","acsc":"aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}","smacs":"\u000f","rmacs":"\u000e","enacs":"\u001b(0"} -{"name":"aaa-60-rv","cols":80,"lines":60,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-60-s","cols":80,"lines":59,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-60-s-rv","cols":80,"lines":59,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-db","cols":80,"lines":30,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[30;0;0;30p","rmcup":"\u001b[60;0;0;30p\u001b[30;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-s-ctxt","aliases":["aaa-30-s-ctxt"],"cols":80,"lines":29,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[30;1H\u001b[K\u001b[30;1;0;30p","rmcup":"\u001b[60;1;0;30p\u001b[59;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"aaa-s-rv-ctxt","aliases":["aaa-30-s-rv-ct"],"cols":80,"lines":29,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[30;1H\u001b[K\u001b[30;1;0;30p","rmcup":"\u001b[60;1;0;30p\u001b[59;1H\u001b[K","sgr0":"\u001b[7m\u000e","smul":"\u001b[4;7m","bold":"\u001b[1;7m","blink":"\u001b[5;7m","rev":"\u001b[m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"abm80","cols":80,"lines":24,"clear":"\u001b\u001c","cup":"\u001b\u0011%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001b\u000c","pad":"\u0000"} -{"name":"abm85","cols":80,"lines":24,"clear":"\u001b*","smul":"\u001bl","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"abm85e","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001b(\u001bk","smul":"\u001bl","rev":"\u001bj","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"abm85h","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","cnorm":"\u001b.4","sgr0":"\u001b(\u001bG0","smul":"\u001bG8","rev":"\u001bG4","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"abm85h-old","aliases":["o85h","oabm85h"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001b(\u001bk","smul":"\u001bl","rev":"\u001bj","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"act4","aliases":["microterm"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c12/\u003e","cup":"\u0014%p1%{24}%+%c%p2%p2%?%'/'%\u003e%t%'0'%+%;%'P'%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kcuu1":"\u001a","kcud1":"\u000b","kcub1":"\u0008","kcuf1":"\u0018"} -{"name":"act5","aliases":["microterm5"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c12/\u003e","cup":"\u0014%p1%{24}%+%c%p2%p2%?%'/'%\u003e%t%'0'%+%;%'P'%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kcuu1":"\u001a","kcud1":"\u000b","kcub1":"\u0008","kcuf1":"\u0018"} -{"name":"adds980","aliases":["a980"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c1\u003e\u000b@","sgr0":"\u000f","cup":"\u000b%p1%'@'%+%c\u001b\u0005%p2%2d","cub1":"\u0008","pad":"\u0000","kf1":"\u001b1","kf2":"\u001b2","kf3":"\u001b3","kf4":"\u001b4","kf5":"\u001b5","kf6":"\u001b6","kf7":"\u001b7","kf8":"\u001b8","kf9":"\u001b9"} -{"name":"adm11","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001bG0","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm1178","aliases":["1178"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+","sgr0":"\u001b)","smul":"\u001bG1","bold":"\u001b(","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"adm12","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u00011\r","kf2":"\u00012\r","kf3":"\u00013\r","kf4":"\u00014\r","kf5":"\u00015\r","kf6":"\u00016\r","kf7":"\u00017\r","kf8":"\u00018\r","kf9":"\u00019\r","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm1a","aliases":["adm1"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b;$\u003c1\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"adm2","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b;","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm20","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","sgr0":"\u001b(","cup":"\u001b=%i%p2%{31}%+%c%p1%{31}%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001","kf2":"\u0002","kf3":"\u0017","kf4":"\u0004","kf5":"\u0005","kf6":"\u0018","kf7":"\u001a"} -{"name":"adm21","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c1/\u003e","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm22","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+","sgr0":"\u001b(","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm31","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001bG0","smul":"\u001bG1","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u00011\r","kf2":"\u00012\r","kf3":"\u00013\r","kf4":"\u00014\r","kf5":"\u00015\r","kf6":"\u00016\r","kf7":"\u00017\r","kf8":"\u00018\r","kf9":"\u00019\r","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm31-old","aliases":["o31"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001bG0","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u00011\r","kf2":"\u00012\r","kf3":"\u00013\r","kf4":"\u00014\r","kf5":"\u00015\r","kf6":"\u00016\r","kf7":"\u00017\r","kf8":"\u00018\r","kf9":"\u00019\r","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm36","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"adm3a","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c1/\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm3a+","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c1/\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm42","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b;","sgr0":"\u001bG0","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm42-ns","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b;\u001bF \t","sgr0":"\u001bG0","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c6\u003e\u001bF \t","cub1":"\u0008","cuu1":"\u000b","pad":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"adm5","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c1/\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"aepro","cols":80,"lines":24,"clear":"\u000c$\u003c300/\u003e","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cuu1":"\u001bA","pad":"\u0000"} -{"name":"aixterm","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"jjkkllmmnnqqttuuvvwwxx","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"aixterm-16color","cols":80,"lines":25,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"jjkkllmmnnqqttuuvvwwxx","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"aixterm-m","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"jjkkllmmnnqqttuuvvwwxx"} -{"name":"aixterm-m-old","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"aj510","cols":80,"lines":24,"clear":"\u000c","smcup":"\u001b\"N","rmcup":"\u001b\"N","smul":"\u001b\"U","cup":"\u001b#%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bY","pad":"","kcuu1":"\u001bY","kcud1":"\u001bZ","kcub1":"\u001bW","kcuf1":"\u001bX"} -{"name":"alto-h19","aliases":["alto-heath","altoh19","altoheath"],"cols":80,"lines":60,"bell":"\u0007","clear":"\u001bE","cnorm":"\u001by4","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"~^x`qanbkcjdmelfgg+hai.kwsutvutvozs{","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"altos2","aliases":["alt2","altos-2"],"cols":80,"lines":24,"clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[1A","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf32":"\u0001`\r","kf33":"\u0001a\r","kf34":"\u0001b\r","kf35":"\u0001c\r","kf36":"\u0001d\r","kf37":"\u0001e\r","kf38":"\u0001f\r","kf39":"\u0001g\r","kf40":"\u0001h\r","kf41":"\u0001i\r","kf42":"\u0001j\r","kf43":"\u0001k\r","kdch":"\u0001M\r","khome":"\u001b[f","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u0001K\r","kclr":"\u0001L\r"} -{"name":"altos3","aliases":["alt3","alt5","altos-3","altos-5","altos5"],"cols":80,"lines":24,"clear":"\u001b[H\u001b[2J","sgr0":"\u001b[p","smul":"\u001b[4m","blink":"\u001b[5p","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[1A","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf32":"\u0001`\r","kf33":"\u0001a\r","kf34":"\u0001b\r","kf35":"\u0001c\r","kf36":"\u0001d\r","kf37":"\u0001e\r","kf38":"\u0001f\r","kf39":"\u0001g\r","kf40":"\u0001h\r","kf41":"\u0001i\r","kf42":"\u0001j\r","kf43":"\u0001k\r","kdch":"\u0001M\r","khome":"\u001b[f","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u0001K\r","kclr":"\u0001L\r"} -{"name":"altos4","aliases":["alt4","altos-4"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003","rev":"\u001b`6\u001b)","dim":"\u001b`7\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kHOM":"\u001b{"} -{"name":"altos7","aliases":["alt7"],"cols":80,"lines":24,"clear":"\u001b+\u001e","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bGt","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf32":"\u0001`\r","kf33":"\u0001a\r","kf34":"\u0001b\r","kf35":"\u0001c\r","kf36":"\u0001d\r","kf37":"\u0001e\r","kf38":"\u0001f\r","kf39":"\u0001g\r","kf40":"\u0001h\r","kf41":"\u0001i\r","kf42":"\u0001j\r","kf43":"\u0001k\r","kdch":"\u0001M\r","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u0001K\r","kclr":"\u0001L\r","acsc":"j5k3l2m1n8q:t4u9v=w0x6"} -{"name":"altos7pc","aliases":["alt7pc"],"cols":80,"lines":24,"clear":"\u001b+\u001e","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bGt","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf32":"\u0001`\r","kf33":"\u0001a\r","kf34":"\u0001b\r","kf35":"\u0001c\r","kf36":"\u0001d\r","kf37":"\u0001e\r","kf38":"\u0001f\r","kf39":"\u0001g\r","kf40":"\u0001h\r","kf41":"\u0001i\r","kf42":"\u0001j\r","kf43":"\u0001k\r","kdch":"\u0001M\r","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u0001K\r","kclr":"\u0001L\r","acsc":"j5k3l2m1n8q:t4u9v=w0x6"} -{"name":"amiga","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[ p","civis":"\u001b[0 p","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[7;2m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[0~","kf2":"\u001b[1~","kf3":"\u001b[2~","kf4":"\u001b[3~","kf5":"\u001b[4~","kf6":"\u001b[5~","kf7":"\u001b[6~","kf8":"\u001b[7~","kf9":"\u001b[8~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000e","rmacs":"\u000f"} -{"name":"amiga-8bit","cols":80,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","smcup":"\ufffd?7l","rmcup":"\ufffd?7h","cnorm":"\ufffd p","civis":"\ufffd0 p","sgr0":"\ufffd0m","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd7;2m","rev":"\ufffd7m","dim":"\ufffd2m","cup":"\ufffd%i%p1%d;%p2%dH","cub1":"\ufffdD","cuu1":"\ufffdA","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd0~","kf2":"\ufffd1~","kf3":"\ufffd2~","kf4":"\ufffd3~","kf5":"\ufffd4~","kf6":"\ufffd5~","kf7":"\ufffd6~","kf8":"\ufffd7~","kf9":"\ufffd8~","kdch":"","khome":"\ufffd A","kend":"\ufffd @","kpp":"\ufffdT","knp":"\ufffdS","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","smacs":"\u000e","rmacs":"\u000f"} -{"name":"amiga-h","cols":80,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","smcup":"\ufffd?7l","rmcup":"\ufffd?7h","cnorm":"\ufffd p","civis":"\ufffd0 p","sgr0":"\ufffd0m","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd7;2m","rev":"\ufffd7m","dim":"\ufffd2m","cup":"\ufffd%i%p1%d;%p2%dH","cub1":"\ufffdD","cuu1":"\ufffdA","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd0~","kf2":"\ufffd1~","kf3":"\ufffd2~","kf4":"\ufffd3~","kf5":"\ufffd4~","kf6":"\ufffd5~","kf7":"\ufffd6~","kf8":"\ufffd7~","kf9":"\ufffd8~","kdch":"","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","smacs":"\u000e","rmacs":"\u000f"} -{"name":"amiga-vnc","cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?7h","rmcup":"\u001b[?7h\u001b[r\u001b[J","cnorm":"\u001b[p\u001b[\u003e?6l","civis":"\u001b[0p","sgr0":"\u001b[0m\u000f\u001b[30;85;\u003e15m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[7;2m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1h","rmkx":"\u001b[?1l","setaf":"\u001b[%?%p1%{8}%\u003e%t%'2'%p1%+%d%e3%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003e%t%'F'%p1%+%d%e4%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[0~","kf2":"\u001b[1~","kf3":"\u001b[2~","kf4":"\u001b[3~","kf5":"\u001b[4~","kf6":"\u001b[5~","kf7":"\u001b[6~","kf8":"\u001b[7~","kf9":"\u001b[8~","kdch":"","khome":"\u001b[44~","khlp":"\u001b[?~","kpp":"\u001b[41~","knp":"\u001b[42~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\ufffdZ","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","_setfgbg":"\u001b[%?%p1%{8}%\u003e%t%'2'%p1%+%d%e3%p1%d%;;%?%p2%{8}%\u003e%t%'F'%p2%+%d%e4%p2%d%;m"} -{"name":"ampex175","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+","smcup":"\u001bN","rmcup":"\u001bF","smul":"\u001bl","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"ampex175-b","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+","smcup":"\u001bN","rmcup":"\u001bF","smul":"\u001bl","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u001f","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"ampex210","aliases":["a210"],"cols":80,"lines":24,"clear":"\u001b*","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u00011\r","kf2":"\u00012\r","kf3":"\u00013\r","kf4":"\u00014\r","kf5":"\u00015\r","kf6":"\u00016\r","kf7":"\u00017\r","kf8":"\u00018\r","kf9":"\u00019\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"ampex219","aliases":["amp219","ampex-219"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","cnorm":"\u001b[?3l","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m","dim":"\u001b[1m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kf1":"\u001b[7~","kf2":"\u001b[8~","kf3":"\u001b[9~","kf4":"\u001b[10~","kf5":"\u001b[11~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ampex219w","aliases":["amp219w","ampex-219w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","cnorm":"\u001b[?3l","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m","dim":"\u001b[1m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kf1":"\u001b[7~","kf2":"\u001b[8~","kf3":"\u001b[9~","kf4":"\u001b[10~","kf5":"\u001b[11~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ampex232","aliases":["ampex-232"],"cols":80,"lines":24,"clear":"\u001b+","cnorm":"\u001b.4","civis":"\u001b.0","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001A\r","kf2":"\u0001B\r","kf3":"\u0001C\r","kf4":"\u0001D\r","kf5":"\u0001E\r","kf6":"\u0001F\r","kf7":"\u0001G\r","kf8":"\u0001H\r","kf9":"\u0001I\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"ampex232w","cols":132,"lines":24,"clear":"\u001b+","cnorm":"\u001b.4","civis":"\u001b.0","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001A\r","kf2":"\u0001B\r","kf3":"\u0001C\r","kf4":"\u0001D\r","kf5":"\u0001E\r","kf6":"\u0001F\r","kf7":"\u0001G\r","kf8":"\u0001H\r","kf9":"\u0001I\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"ampex80","aliases":["a80","d80","dialogue","dialogue80"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c75\u003e","smul":"\u001bl","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"annarbor4080","aliases":["aa4080"],"cols":80,"lines":40,"bell":"\u0007","clear":"\u000c$\u003c2\u003e","cup":"\u000f%p2%{10}%/%{16}%*%p2%{10}%m%+%c%p1%?%p1%{19}%\u003e%t%{12}%+%;%'@'%+%c","cub1":"\u0008","cuu1":"\u000e","pad":"\u0000","kbs":"\u001e","khome":"\u000b","kcuu1":"\u000e","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001f"} -{"name":"ansi","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[L","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ansi-color-2-emx","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[0;37;44m\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0;37;44m","smul":"\u001b[1;36;44m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[1;37;46m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd;","kf2":"\ufffd\u003c","kf3":"\ufffd=","kf4":"\ufffd\u003e","kf5":"\ufffd?","kf6":"\ufffd@","kf7":"\ufffdA","kf8":"\ufffdB","kf9":"\ufffdC","kf10":"\ufffdD","kf11":"\ufffd\ufffd","kf12":"\ufffd\ufffd","kf13":"\ufffdT","kf14":"\ufffdU","kf15":"\ufffdV","kf16":"\ufffdW","kf17":"\ufffdX","kf18":"\ufffdY","kf19":"\ufffdZ","kf20":"\ufffd[","kf21":"\ufffd\\","kf22":"\ufffd]","kf23":"\ufffd\ufffd","kf24":"\ufffd\ufffd","kf25":"\ufffd^","kf26":"\ufffd_","kf27":"\ufffd`","kf28":"\ufffda","kf29":"\ufffdb","kf30":"\ufffdc","kf31":"\ufffdd","kf32":"\ufffde","kf33":"\ufffdf","kf34":"\ufffdg","kf35":"\ufffd\ufffd","kf36":"\ufffd\ufffd","kf37":"\ufffdh","kf38":"\ufffdi","kf39":"\ufffdj","kf40":"\ufffdk","kf41":"\ufffdl","kf42":"\ufffdm","kf43":"\ufffdn","kf44":"\ufffdo","kf45":"\ufffdp","kf46":"\ufffdq","kf47":"\ufffd\ufffd","kf48":"\ufffd\ufffd","kich":"\ufffdR","kdch":"\ufffdS","khome":"\ufffdG","kend":"\ufffdO","kpp":"\ufffdI","knp":"\ufffdQ","kcuu1":"\ufffdH","kcud1":"\ufffdP","kcub1":"\ufffdK","kcuf1":"\ufffdM","kcbt":"\ufffd\u000f","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ansi-color-3-emx","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[0;37;40m\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0;10m","smul":"\u001b[0;36;40m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[1;37;46m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd;","kf2":"\ufffd\u003c","kf3":"\ufffd=","kf4":"\ufffd\u003e","kf5":"\ufffd?","kf6":"\ufffd@","kf7":"\ufffdA","kf8":"\ufffdB","kf9":"\ufffdC","kf10":"\ufffdD","kf11":"\ufffd\ufffd","kf12":"\ufffd\ufffd","kf13":"\ufffdT","kf14":"\ufffdU","kf15":"\ufffdV","kf16":"\ufffdW","kf17":"\ufffdX","kf18":"\ufffdY","kf19":"\ufffdZ","kf20":"\ufffd[","kf21":"\ufffd\\","kf22":"\ufffd]","kf23":"\ufffd\ufffd","kf24":"\ufffd\ufffd","kf25":"\ufffd^","kf26":"\ufffd_","kf27":"\ufffd`","kf28":"\ufffda","kf29":"\ufffdb","kf30":"\ufffdc","kf31":"\ufffdd","kf32":"\ufffde","kf33":"\ufffdf","kf34":"\ufffdg","kf35":"\ufffd\ufffd","kf36":"\ufffd\ufffd","kf37":"\ufffdh","kf38":"\ufffdi","kf39":"\ufffdj","kf40":"\ufffdk","kf41":"\ufffdl","kf42":"\ufffdm","kf43":"\ufffdn","kf44":"\ufffdo","kf45":"\ufffdp","kf46":"\ufffdq","kf47":"\ufffd\ufffd","kf48":"\ufffd\ufffd","kich":"\ufffdR","kdch":"\ufffdS","khome":"\ufffdG","kend":"\ufffdO","kpp":"\ufffdI","knp":"\ufffdQ","kcuu1":"\ufffdH","kcud1":"\ufffdP","kcub1":"\ufffdK","kcuf1":"\ufffdM","kcbt":"\ufffd\u000f","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ansi-emx","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[1;33;44m\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u001b[1;33;44m","smul":"\u001b[1;31;44m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[5;37;41m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd;","kf2":"\ufffd\u003c","kf3":"\ufffd=","kf4":"\ufffd\u003e","kf5":"\ufffd?","kf6":"\ufffd@","kf7":"\ufffdA","kf8":"\ufffdB","kf9":"\ufffdC","kf10":"\ufffdD","kf11":"\ufffd\ufffd","kf12":"\ufffd\ufffd","kf13":"\ufffdT","kf14":"\ufffdU","kf15":"\ufffdV","kf16":"\ufffdW","kf17":"\ufffdX","kf18":"\ufffdY","kf19":"\ufffdZ","kf20":"\ufffd[","kf21":"\ufffd\\","kf22":"\ufffd]","kf23":"\ufffd\ufffd","kf24":"\ufffd\ufffd","kf25":"\ufffd^","kf26":"\ufffd_","kf27":"\ufffd`","kf28":"\ufffda","kf29":"\ufffdb","kf30":"\ufffdc","kf31":"\ufffdd","kf32":"\ufffde","kf33":"\ufffdf","kf34":"\ufffdg","kf35":"\ufffd\ufffd","kf36":"\ufffd\ufffd","kf37":"\ufffdh","kf38":"\ufffdi","kf39":"\ufffdj","kf40":"\ufffdk","kf41":"\ufffdl","kf42":"\ufffdm","kf43":"\ufffdn","kf44":"\ufffdo","kf45":"\ufffdp","kf46":"\ufffdq","kf47":"\ufffd\ufffd","kf48":"\ufffd\ufffd","kich":"\ufffdR","kdch":"\ufffdS","khome":"\ufffdG","kend":"\ufffdO","kpp":"\ufffdI","knp":"\ufffdQ","kcuu1":"\ufffdH","kcud1":"\ufffdP","kcub1":"\ufffdK","kcuf1":"\ufffdM","kcbt":"\ufffd\u000f","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ansi-generic","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ansi-m","aliases":["ansi-mono"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[L","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m"} -{"name":"ansi-mini","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cup":"\u001b[%i%p1%d;%p2%dH","pad":"\u0000"} -{"name":"ansi-mtabs","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000"} -{"name":"ansi-nt","aliases":["psx_ansi"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[2J","sgr0":"\u001b[0m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001b[A","kcud1":"\u001b[V","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ansi.sys","cols":80,"lines":25,"colors":8,"clear":"\u001b[2J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ansi.sys-old","cols":80,"lines":25,"colors":8,"clear":"\u001b[2J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ansi.sysk","aliases":["ansisysk"],"cols":80,"lines":25,"colors":8,"clear":"\u001b[2J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[;71;30p\u001b[;72;11p\u001b[;73;27;21p\u001b[;77;12p\u001b[;80;10p\u001b[;81;27;4p\u001b[;82;27;27;105p\u001b[;83;127p","rmkx":"\u001b[;71;0;71p\u001b[;72;0;72p\u001b[;73;0;73p\u001b[;77;0;77p\u001b[;80;0;80p\u001b[;81;0;81p\u001b[;82;0;82p\u001b[;83;0;83p","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ansi77","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"apollo","cols":88,"lines":53,"clear":"\u000c","smcup":"\u001bW","rmcup":"\u001bX","smul":"\u001bU","cup":"\u001bM%p1%' '%+%c%p2%d)","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000"} -{"name":"apollo_15P","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"apollo_19L","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"apollo_color","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"apple-80","cols":80,"lines":24,"clear":"\u000c$\u003c10*/\u003e","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001f","pad":"\u0000"} -{"name":"apple-ae","cols":80,"lines":24,"bell":"\u0007$\u003c500/\u003e","clear":"\u000c","sgr0":"\u000e","rev":"\u000f","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001f","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0015","kclr":"\u0018"} -{"name":"apple-soroc","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c300\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"apple-uterm","cols":80,"lines":24,"clear":"\u000c","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cuu1":"\u001f","pad":"\u0000"} -{"name":"apple-uterm-vb","cols":80,"lines":24,"clear":"\u000c","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cuu1":"\u001f","pad":"\u0000"} -{"name":"apple-videx","cols":80,"lines":24,"clear":"\u000c$\u003c300/\u003e","sgr0":"\u001a2","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001f","pad":"\u0000","khome":"\u0019","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0015"} -{"name":"apple-videx2","cols":80,"lines":24,"bell":"\u0007$\u003c100/\u003e","clear":"\u000c$\u003c16*/\u003e","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001f","pad":"\u0000","kbs":"\u0008","khome":"\u0019","kcuu1":"\u001f","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001c"} -{"name":"apple-videx3","aliases":["vapple"],"cols":80,"lines":24,"clear":"\u001bv","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cuu1":"\u001bA","pad":"\u0000","kf1":"\u001bQ","kf2":"\u001bR","kf3":"\u001b ","kf4":"\u001b!","kf5":"\u001b\"","kf6":"\u001b#","kf7":"\u001b$","kf8":"\u001b%%","kf9":"\u001b\u0026","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"apple-vm80","aliases":["ap-vm80"],"cols":80,"lines":24,"clear":"\u000c$\u003c300/\u003e","cup":"\u001e%p1%' '%+%c%p2%' '%+%c$\u003c100/\u003e","cuu1":"\u001f","pad":"\u0000"} -{"name":"apple2e-p","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c100/\u003e","sgr0":"\u000e","rev":"\u000f","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001f","pad":"\u0000","kbs":"\u0008","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0015"} -{"name":"apple80p","cols":80,"lines":24,"clear":"\u0019\u000c","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cuu1":"\u001f","pad":"\u0000","kcub1":"\u0008"} -{"name":"appleII","cols":80,"lines":24,"clear":"\u000c","cnorm":"\u0014C2","sgr0":"\u000e","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001f","pad":"\u0000","kcud1":"\n","kcuf1":"\u0015"} -{"name":"appleIIgs","aliases":["appleIIc","appleIIe"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001f","pad":"\u0000","kbs":"\u0008","kdch":"","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0015","kclr":"\u0018"} -{"name":"arm100","aliases":["arm100-am"],"cols":80,"lines":30,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[P","kf2":"\u001b[Q","kf3":"\u001b[R","kf4":"\u001b[S","kf5":"\u001b[t","kf6":"\u001b[u","kf7":"\u001b[v","kf8":"\u001b[l","kf9":"\u001b[w","kf10":"\u001b[x","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"arm100-w","aliases":["arm100-wam"],"cols":132,"lines":50,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[P","kf2":"\u001b[Q","kf3":"\u001b[R","kf4":"\u001b[S","kf5":"\u001b[t","kf6":"\u001b[u","kf7":"\u001b[v","kf8":"\u001b[l","kf9":"\u001b[w","kf10":"\u001b[x","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"atari","cols":80,"lines":25,"clear":"\u001bH\u001bJ","sgr0":"\u001bq","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"aterm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"att2300","aliases":["sv80"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[1r","kf2":"\u001b[2r","kf3":"\u001b[3r","kf4":"\u001b[4r","kf5":"\u001b[5r","kf6":"\u001b[6r","kf7":"\u001b[7r","kf8":"\u001b[8r","kf9":"\u001b[9r","kf10":"\u001b[10r","kf11":"\u001b[11r","kf12":"\u001b[12r","kf13":"\u001b[13r","kf14":"\u001b[14r","kf15":"\u001b[15r","kf16":"\u001b[16r","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"att2350","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[1r","kf2":"\u001b[2r","kf3":"\u001b[3r","kf4":"\u001b[4r","kf5":"\u001b[5r","kf6":"\u001b[6r","kf7":"\u001b[7r","kf8":"\u001b[8r","kf9":"\u001b[9r","kf10":"\u001b[10r","kf11":"\u001b[11r","kf12":"\u001b[12r","kf13":"\u001b[13r","kf14":"\u001b[14r","kf15":"\u001b[15r","kf16":"\u001b[16r","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"att4410","aliases":["att5410","tty5410"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4410v1-w","aliases":["att5410v1-w","tty5410v1-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4415","aliases":["att5420","tty5420"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[x\u001b[J","cnorm":"\u001b[11;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1j\u001b[21;4j\u001bent","rmkx":"\u001b[19;0j\u001b[21;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dx","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4415-nl","aliases":["att5420-nl","tty5420-nl"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[x\u001b[J","cnorm":"\u001b[11;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1j\u001b[21;4j\u001bent","rmkx":"\u001b[19;0j\u001b[21;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dx","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4415-rv","aliases":["att5420-rv","tty5420-rv"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[x\u001b[J","cnorm":"\u001b[11;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1j\u001b[21;4j\u001bent","rmkx":"\u001b[19;0j\u001b[21;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dx","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4415-rv-nl","aliases":["att5420-rv-nl","tty5420-rv-nl"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[x\u001b[J","cnorm":"\u001b[11;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1j\u001b[21;4j\u001bent","rmkx":"\u001b[19;0j\u001b[21;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dx","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4415-w","aliases":["att5420-w","tty5420-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[x\u001b[J","cnorm":"\u001b[11;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1j\u001b[21;4j\u001bent","rmkx":"\u001b[19;0j\u001b[21;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dx","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4415-w-nl","aliases":["att5420-w-nl","tty5420-w-nl"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[x\u001b[J","cnorm":"\u001b[11;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1j\u001b[21;4j\u001bent","rmkx":"\u001b[19;0j\u001b[21;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dx","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4415-w-rv","aliases":["att5420-w-rv","tty5420-w-rv"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[x\u001b[J","cnorm":"\u001b[11;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1j\u001b[21;4j\u001bent","rmkx":"\u001b[19;0j\u001b[21;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dx","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4415-w-rv-n","aliases":["att5420-w-rv-n","tty5420-w-rv-n"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[x\u001b[J","cnorm":"\u001b[11;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1j\u001b[21;4j\u001bent","rmkx":"\u001b[19;0j\u001b[21;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dx","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4418","aliases":["att5418"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[h","kf2":"\u001b[i","kf3":"\u001b[j","kf6":"\u001b[k","kf7":"\u001b[l","kf8":"\u001b[f","kf9":"\u001b[w","kf10":"\u001b[m","kf11":"\u001b[n","kf12":"\u001b[o","kf13":"\u001b[H","kf14":"\u001b[I","kf15":"\u001b[J","kf18":"\u001b[K","kf19":"\u001b[L","kf20":"\u001b[E","kf21":"\u001b[_","kf22":"\u001b[M","kf23":"\u001b[N","kf24":"\u001b[O","khome":"\u001bc","kcuu1":"\u001bS","kcud1":"\u001bU","kcub1":"\u001b@","kcuf1":"\u001bA","kclr":"\u001b[%%","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4418-w","aliases":["att5418-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[h","kf2":"\u001b[i","kf3":"\u001b[j","kf6":"\u001b[k","kf7":"\u001b[l","kf8":"\u001b[f","kf9":"\u001b[w","kf10":"\u001b[m","kf11":"\u001b[n","kf12":"\u001b[o","kf13":"\u001b[H","kf14":"\u001b[I","kf15":"\u001b[J","kf18":"\u001b[K","kf19":"\u001b[L","kf20":"\u001b[E","kf21":"\u001b[_","kf22":"\u001b[M","kf23":"\u001b[N","kf24":"\u001b[O","khome":"\u001bc","kcuu1":"\u001bS","kcud1":"\u001bU","kcub1":"\u001b@","kcuf1":"\u001bA","kclr":"\u001b[%%","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att4420","aliases":["tty4420"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","smul":"\u001b\\","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kf3":"\u001b@","kich":"\u001b^","kdch":"\u001bP","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u0008","kcuf1":"\u001bC","kcbt":"\u001bO","kclr":"\u001bJ"} -{"name":"att4424","aliases":["tty4424"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001bX\u001b~\u001bZ\u001b4\u001b(B","smul":"\u001b\\","bold":"\u001b3","blink":"\u001b3","rev":"\u001b}","dim":"\u001bW","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001bJ","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"att4424-1","aliases":["tty4424-1"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001bX\u001b~\u001bZ\u001b4\u001b(B","smul":"\u001b\\","bold":"\u001b3","blink":"\u001b3","rev":"\u001b}","dim":"\u001bW","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"att4424m","aliases":["tty4424m"],"cols":80,"lines":23,"bell":"\u0007","clear":"\u001b[2;H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%2d;%p2%2dH\u001b[B","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"att4426","aliases":["tty4426"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J\u001b[1U\u001b[H\u001b[2J\u001b[1V","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","khome":"\u001b[H","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bO","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"att500","aliases":["att513"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[11;0|","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1|\u001b[21;4|\u001bent","rmkx":"\u001b[19;0|\u001b[21;1|\ufffd","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001bNj","kdch":"\u001bNf","khome":"\u001b[H","kend":"\u001b0","khlp":"\u001bOm","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001bOk","kclr":"\u001b[J","kprt":"\u001bOz","kcan":"\u001bOw","acsc":"+g,h-f.e`bhrisjjkkllmmnnqqttuuvvwwxx{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)1","kRIT":"\u001bNL","kLFT":"\u001bNK","kHOM":"\u001bNM","kEND":"\u001bNN"} -{"name":"att505","aliases":["att5430","gs5430","pt505"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[\u003el","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[01s","kf2":"\u001b[02s","kf3":"\u001b[03s","kf4":"\u001b[04s","kf5":"\u001b[05s","kf6":"\u001b[06s","kf18":"\u001b[18s","kf19":"\u001b[19s","kf20":"\u001b[20s","kf21":"\u001b[21s","kf22":"\u001b[22s","kf23":"\u001b[23s","kf24":"\u001b[24s","kf26":"\u001b[26s","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"att505-24","aliases":["gs5430-24","pt505-24"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[\u003el","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[01s","kf2":"\u001b[02s","kf3":"\u001b[03s","kf4":"\u001b[04s","kf5":"\u001b[05s","kf6":"\u001b[06s","kf18":"\u001b[18s","kf19":"\u001b[19s","kf20":"\u001b[20s","kf21":"\u001b[21s","kf22":"\u001b[22s","kf23":"\u001b[23s","kf24":"\u001b[24s","kf26":"\u001b[26s","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"att510a","aliases":["bct510a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[11;3|","civis":"\u001b[11;0|","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1|","rmkx":"\u001b[19;0|","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOm","kf2":"\u001bOV","kf3":"\u001bOu","kf4":"\u001bNj","kf5":"\u001bNe","kf6":"\u001bNf","kf7":"\u001bNh","kf8":"\u001b[H","kf9":"\u001bOc","kf10":"\u001bOd","kf11":"\u001bOe","kf12":"\u001bOf","kf13":"\u001bOg","kf14":"\u001bOh","kf15":"\u001bOi","kf16":"\u001bOj","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+g,h-f.e`bhrisjjkkllmmnnqqttuuvvwwxx{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)1","kRIT":"\u001b[v","kLFT":"\u001b[u"} -{"name":"att510d","aliases":["bct510d"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[11;3|","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1|","rmkx":"\u001b[19;0|","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOm","kf2":"\u001bOV","kf3":"\u001bOu","kf4":"\u001bNj","kf5":"\u001bNe","kf6":"\u001bNf","kf7":"\u001bNh","kf8":"\u001b[H","kf9":"\u001bOc","kf10":"\u001bOd","kf11":"\u001bOe","kf12":"\u001bOf","kf13":"\u001bOg","kf14":"\u001bOh","kf15":"\u001bOi","kf16":"\u001bOj","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+g,h-f.e`bhrisjjkkllmmnnqqttuuvvwwxx{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)1","kRIT":"\u001b[v","kLFT":"\u001b[u"} -{"name":"att5410-w","aliases":["4410-w","5410-w","att4410-w","tty5410-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att5410v1","aliases":["att4410v1","tty5410v1"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","acsc":"++,,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att5420_2","cols":80,"lines":24,"clear":"\u001bH\u001bJ","cnorm":"\u001b[11;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1j","rmkx":"\u001b[19;0j","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att5420_2-w","cols":132,"lines":24,"clear":"\u001bH\u001bJ","cnorm":"\u001b[11;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[19;1j","rmkx":"\u001b[19;0j","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"att5425","aliases":["att4425","tty5425"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[12;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[21;1j\u001b[25;4j\u001bent\u001b~","rmkx":"\u001b[21;0j\u001b[25;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"att5425-nl","aliases":["att4425-nl","tty5425-nl"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[12;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[21;1j\u001b[25;4j\u001bent","rmkx":"\u001b[21;0j\u001b[25;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"att5425-w","aliases":["att4425-w","tty5425-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[12;0j","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[2;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[21;1j\u001b[25;4j\u001bent\u001b~","rmkx":"\u001b[21;0j\u001b[25;1j\ufffd","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001bz","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"att5620","aliases":["5620","dmd","tty5620","ttydmd"],"cols":88,"lines":70,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[2m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J"} -{"name":"att5620-1","aliases":["dmd1","tty5620-1"],"cols":88,"lines":70,"bell":"\u0007","clear":"\u001b[H\u001b[J","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J"} -{"name":"att5620-24","aliases":["dmd-24","tty5620-24"],"cols":88,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[2m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J"} -{"name":"att5620-34","aliases":["dmd-34","tty5620-34"],"cols":88,"lines":34,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[2m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J"} -{"name":"att5620-s","aliases":["layer","tty5620-s","vitty"],"cols":80,"lines":72,"bell":"\u0007","clear":"\u000c","cup":"\u001bY%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J"} -{"name":"att605","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bOC","kf16":"\u001bOD","kf17":"\u001bOE","kf18":"\u001bOF","kf19":"\u001bOG","kf20":"\u001bOH","kf21":"\u001bOI","kf22":"\u001bOJ","kf23":"\u001bNO","kf24":"\u001bNP","kf25":"\u001bNQ","kf26":"\u001bNR","kf27":"\u001bNS","kf28":"\u001bNT","kf29":"\u001bOP","kf30":"\u001bOQ","kf31":"\u001bOR","kf32":"\u001bOS","kf33":"\u001bOw","kf34":"\u001bOx","kf35":"\u001bOy","kf36":"\u001bOm","kf37":"\u001bOt","kf38":"\u001bOu","kf39":"\u001bOv","kf40":"\u001bOl","kf41":"\u001bOq","kf42":"\u001bOr","kf43":"\u001bOs","kf44":"\u001bOp","kf45":"\u001bOn","kf46":"\u001bOM","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[24;1H","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b)0\u000e","rmacs":"\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A"} -{"name":"att605-pc","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bOC","kf16":"\u001bOD","kf17":"\u001bOE","kf18":"\u001bOF","kf19":"\u001bOG","kf20":"\u001bOH","kf21":"\u001bOI","kf22":"\u001bOJ","kf23":"\u001bNO","kf24":"\u001bNP","kf25":"\u001bNQ","kf26":"\u001bNR","kf27":"\u001bNS","kf28":"\u001bNT","kf29":"\u001bOP","kf30":"\u001bOQ","kf31":"\u001bOR","kf32":"\u001bOS","kf33":"\u001bOw","kf34":"\u001bOx","kf35":"\u001bOy","kf36":"\u001bOm","kf37":"\u001bOt","kf38":"\u001bOu","kf39":"\u001bOv","kf40":"\u001bOl","kf41":"\u001bOq","kf42":"\u001bOr","kf43":"\u001bOs","kf44":"\u001bOp","kf45":"\u001bOn","kf46":"\u001bOM","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","smacs":"\u001b)0\u000e","rmacs":"\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A"} -{"name":"att605-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bOC","kf16":"\u001bOD","kf17":"\u001bOE","kf18":"\u001bOF","kf19":"\u001bOG","kf20":"\u001bOH","kf21":"\u001bOI","kf22":"\u001bOJ","kf23":"\u001bNO","kf24":"\u001bNP","kf25":"\u001bNQ","kf26":"\u001bNR","kf27":"\u001bNS","kf28":"\u001bNT","kf29":"\u001bOP","kf30":"\u001bOQ","kf31":"\u001bOR","kf32":"\u001bOS","kf33":"\u001bOw","kf34":"\u001bOx","kf35":"\u001bOy","kf36":"\u001bOm","kf37":"\u001bOt","kf38":"\u001bOu","kf39":"\u001bOv","kf40":"\u001bOl","kf41":"\u001bOq","kf42":"\u001bOr","kf43":"\u001bOs","kf44":"\u001bOp","kf45":"\u001bOn","kf46":"\u001bOM","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[24;1H","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b)0\u000e","rmacs":"\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A"} -{"name":"att610","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[ A","kLFT":"\u001b[ @"} -{"name":"att610-103k","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001bNj","kdch":"\u001bNf","khome":"\u001b[H","kend":"\u001b0","khlp":"\u001bOm","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001bOk","kclr":"\u001b[2J","kprt":"\u001bOz","kcan":"\u001bOw","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[ A","kLFT":"\u001b[ @","kEND":"\u001bNN"} -{"name":"att610-103k-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001bNj","kdch":"\u001bNf","khome":"\u001b[H","kend":"\u001b0","khlp":"\u001bOm","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001bOk","kclr":"\u001b[2J","kprt":"\u001bOz","kcan":"\u001bOw","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[ A","kLFT":"\u001b[ @","kEND":"\u001bNN"} -{"name":"att610-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[ A","kLFT":"\u001b[ @"} -{"name":"att615","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bOC","kf16":"\u001bOD","kf17":"\u001bOE","kf18":"\u001bOF","kf19":"\u001bOG","kf20":"\u001bOH","kf21":"\u001bOI","kf22":"\u001bOJ","kf23":"\u001bNO","kf24":"\u001bNP","kf25":"\u001bNQ","kf26":"\u001bNR","kf27":"\u001bNS","kf28":"\u001bNT","kf29":"\u001bOP","kf30":"\u001bOQ","kf31":"\u001bOR","kf32":"\u001bOS","kf33":"\u001bOw","kf34":"\u001bOx","kf35":"\u001bOy","kf36":"\u001bOm","kf37":"\u001bOt","kf38":"\u001bOu","kf39":"\u001bOv","kf40":"\u001bOl","kf41":"\u001bOq","kf42":"\u001bOr","kf43":"\u001bOs","kf44":"\u001bOp","kf45":"\u001bOn","kf46":"\u001bOM","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A"} -{"name":"att615-103k","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001bNj","kdch":"\u001bNf","khome":"\u001b[H","kend":"\u001b0","khlp":"\u001bOm","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001bOk","kclr":"\u001b[2J","kprt":"\u001bOz","kcan":"\u001bOw","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A","kEND":"\u001bNN"} -{"name":"att615-103k-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001bNj","kdch":"\u001bNf","khome":"\u001b[H","kend":"\u001b0","khlp":"\u001bOm","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001bOk","kclr":"\u001b[2J","kprt":"\u001bOz","kcan":"\u001bOw","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A","kEND":"\u001bNN"} -{"name":"att615-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bOC","kf16":"\u001bOD","kf17":"\u001bOE","kf18":"\u001bOF","kf19":"\u001bOG","kf20":"\u001bOH","kf21":"\u001bOI","kf22":"\u001bOJ","kf23":"\u001bNO","kf24":"\u001bNP","kf25":"\u001bNQ","kf26":"\u001bNR","kf27":"\u001bNS","kf28":"\u001bNT","kf29":"\u001bOP","kf30":"\u001bOQ","kf31":"\u001bOR","kf32":"\u001bOS","kf33":"\u001bOw","kf34":"\u001bOx","kf35":"\u001bOy","kf36":"\u001bOm","kf37":"\u001bOt","kf38":"\u001bOu","kf39":"\u001bOv","kf40":"\u001bOl","kf41":"\u001bOq","kf42":"\u001bOr","kf43":"\u001bOs","kf44":"\u001bOp","kf45":"\u001bOn","kf46":"\u001bOM","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A"} -{"name":"att620","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bOC","kf16":"\u001bOD","kf17":"\u001bOE","kf18":"\u001bOF","kf19":"\u001bOG","kf20":"\u001bOH","kf21":"\u001bOI","kf22":"\u001bOJ","kf23":"\u001bNO","kf24":"\u001bNP","kf25":"\u001bNQ","kf26":"\u001bNR","kf27":"\u001bNS","kf28":"\u001bNT","kf29":"\u001bOP","kf30":"\u001bOQ","kf31":"\u001bOR","kf32":"\u001bOS","kf33":"\u001bOw","kf34":"\u001bOx","kf35":"\u001bOy","kf36":"\u001bOm","kf37":"\u001bOt","kf38":"\u001bOu","kf39":"\u001bOv","kf40":"\u001bOl","kf41":"\u001bOq","kf42":"\u001bOr","kf43":"\u001bOs","kf44":"\u001bOp","kf45":"\u001bOn","kf46":"\u001bOM","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b)0\u000e","rmacs":"\u001b(B\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A"} -{"name":"att620-103k","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001bNj","kdch":"\u001bNf","khome":"\u001b[H","kend":"\u001b0","khlp":"\u001bOm","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001bOk","kclr":"\u001b[2J","kprt":"\u001bOz","kcan":"\u001bOw","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b)0\u000e","rmacs":"\u001b(B\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A","kEND":"\u001bNN"} -{"name":"att620-103k-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001bNj","kdch":"\u001bNf","khome":"\u001b[H","kend":"\u001b0","khlp":"\u001bOm","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001bOk","kclr":"\u001b[2J","kprt":"\u001bOz","kcan":"\u001bOw","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b)0\u000e","rmacs":"\u001b(B\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A","kEND":"\u001bNN"} -{"name":"att620-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bOC","kf16":"\u001bOD","kf17":"\u001bOE","kf18":"\u001bOF","kf19":"\u001bOG","kf20":"\u001bOH","kf21":"\u001bOI","kf22":"\u001bOJ","kf23":"\u001bNO","kf24":"\u001bNP","kf25":"\u001bNQ","kf26":"\u001bNR","kf27":"\u001bNS","kf28":"\u001bNT","kf29":"\u001bOP","kf30":"\u001bOQ","kf31":"\u001bOR","kf32":"\u001bOS","kf33":"\u001bOw","kf34":"\u001bOx","kf35":"\u001bOy","kf36":"\u001bOm","kf37":"\u001bOt","kf38":"\u001bOu","kf39":"\u001bOv","kf40":"\u001bOl","kf41":"\u001bOq","kf42":"\u001bOr","kf43":"\u001bOs","kf44":"\u001bOp","kf45":"\u001bOn","kf46":"\u001bOM","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b)0\u000e","rmacs":"\u001b(B\u000f","kRIT":"\u001b[ @","kLFT":"\u001b[ A"} -{"name":"att630","cols":80,"lines":60,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bNu","kf16":"\u001bNv","kf17":"\u001bNw","kf18":"\u001bNx","kf19":"\u001bNy","kf20":"\u001bNz","kf21":"\u001bN{","kf22":"\u001bN|","kf23":"\u001bN}","kf24":"\u001bN~","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J"} -{"name":"att630-24","aliases":["5630-24","5630DMD-24","630MTG-24"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bNu","kf16":"\u001bNv","kf17":"\u001bNw","kf18":"\u001bNx","kf19":"\u001bNy","kf20":"\u001bNz","kf21":"\u001bN{","kf22":"\u001bN|","kf23":"\u001bN}","kf24":"\u001bN~","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J"} -{"name":"att6386","aliases":["386at","at386"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[=1C","civis":"\u001b[=C","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kf11":"\u001bOZ","kf12":"\u001bOA","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[Y","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001d","acsc":"``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~","smacs":"\u001b[12m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"att700","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bOC","kf16":"\u001bOD","kf17":"\u001bOE","kf18":"\u001bOF","kf19":"\u001bOG","kf20":"\u001bOH","kf21":"\u001bOI","kf22":"\u001bOJ","kf23":"\u001bNO","kf24":"\u001bNP","kf25":"\u001bNQ","kf26":"\u001bNR","kf27":"\u001bNS","kf28":"\u001bNT","kf29":"\u001bOq","kf30":"\u001bOr","kf31":"\u001bOs","kf32":"\u001bOt","kf33":"\u001bOu","kf34":"\u001bOv","kf35":"\u001bOw","kf36":"\u001bOx","kf37":"\u001bOy","kf38":"\u001bOu","kf39":"\u001bOv","kf40":"\u001bOl","kf41":"\u001bOq","kf42":"\u001bOr","kf43":"\u001bOs","kf44":"\u001bOp","kf45":"\u001bOn","kf46":"\u001bOM","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[24;1H","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[ @","kLFT":"\u001b[ A"} -{"name":"att730","cols":80,"lines":60,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bNu","kf16":"\u001bNv","kf17":"\u001bNw","kf18":"\u001bNx","kf19":"\u001bNy","kf20":"\u001bNz","kf21":"\u001bN{","kf22":"\u001bN|","kf23":"\u001bN}","kf24":"\u001bN~","kf25":"\u001bOC","kf26":"\u001bOD","kf27":"\u001bOE","kf28":"\u001bOF","kf29":"\u001bOG","kf30":"\u001bOH","kf31":"\u001bOI","kf32":"\u001bOJ","kf33":"\u001bNO","kf34":"\u001bNP","kf35":"\u001bNQ","kf36":"\u001bNR","kf37":"\u001bNS","kf38":"\u001bNT","kf39":"\u001bOU","kf40":"\u001bOV","kf41":"\u001bOW","kf42":"\u001bOX","kf43":"\u001bOY","kf44":"\u001bOZ","kf45":"\u001bO[","kf46":"\u001bO ","kf47":"\u001bO]","kf48":"\u001bO^","kich":"\u001b[@","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[ A","kLFT":"\u001b[ @"} -{"name":"att730-24","aliases":["730MTG-24"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bNu","kf16":"\u001bNv","kf17":"\u001bNw","kf18":"\u001bNx","kf19":"\u001bNy","kf20":"\u001bNz","kf21":"\u001bN{","kf22":"\u001bN|","kf23":"\u001bN}","kf24":"\u001bN~","kf25":"\u001bOC","kf26":"\u001bOD","kf27":"\u001bOE","kf28":"\u001bOF","kf29":"\u001bOG","kf30":"\u001bOH","kf31":"\u001bOI","kf32":"\u001bOJ","kf33":"\u001bNO","kf34":"\u001bNP","kf35":"\u001bNQ","kf36":"\u001bNR","kf37":"\u001bNS","kf38":"\u001bNT","kf39":"\u001bOU","kf40":"\u001bOV","kf41":"\u001bOW","kf42":"\u001bOX","kf43":"\u001bOY","kf44":"\u001bOZ","kf45":"\u001bO[","kf46":"\u001bO ","kf47":"\u001bO]","kf48":"\u001bO^","kich":"\u001b[@","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[ A","kLFT":"\u001b[ @"} -{"name":"att730-41","aliases":["730MTG-41"],"cols":80,"lines":41,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bNu","kf16":"\u001bNv","kf17":"\u001bNw","kf18":"\u001bNx","kf19":"\u001bNy","kf20":"\u001bNz","kf21":"\u001bN{","kf22":"\u001bN|","kf23":"\u001bN}","kf24":"\u001bN~","kf25":"\u001bOC","kf26":"\u001bOD","kf27":"\u001bOE","kf28":"\u001bOF","kf29":"\u001bOG","kf30":"\u001bOH","kf31":"\u001bOI","kf32":"\u001bOJ","kf33":"\u001bNO","kf34":"\u001bNP","kf35":"\u001bNQ","kf36":"\u001bNR","kf37":"\u001bNS","kf38":"\u001bNT","kf39":"\u001bOU","kf40":"\u001bOV","kf41":"\u001bOW","kf42":"\u001bOX","kf43":"\u001bOY","kf44":"\u001bOZ","kf45":"\u001bO[","kf46":"\u001bO ","kf47":"\u001bO]","kf48":"\u001bO^","kich":"\u001b[@","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[ A","kLFT":"\u001b[ @"} -{"name":"att7300","aliases":["3b1","pc7300","s4","unixpc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[=0C","civis":"\u001b[=1C","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[9m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kich":"\u001bNj","kdch":"\u001bNf","khome":"\u001b[H","kend":"\u001b0","khlp":"\u001bOm","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001bOk","kclr":"\u001b[J","kprt":"\u001bOz","kcan":"\u001bOw","kRIT":"\u001bNL","kLFT":"\u001bNK","kHOM":"\u001bNM","kEND":"\u001bNN"} -{"name":"att730r","aliases":["730MTGr"],"cols":80,"lines":60,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bNu","kf16":"\u001bNv","kf17":"\u001bNw","kf18":"\u001bNx","kf19":"\u001bNy","kf20":"\u001bNz","kf21":"\u001bN{","kf22":"\u001bN|","kf23":"\u001bN}","kf24":"\u001bN~","kf25":"\u001bOC","kf26":"\u001bOD","kf27":"\u001bOE","kf28":"\u001bOF","kf29":"\u001bOG","kf30":"\u001bOH","kf31":"\u001bOI","kf32":"\u001bOJ","kf33":"\u001bNO","kf34":"\u001bNP","kf35":"\u001bNQ","kf36":"\u001bNR","kf37":"\u001bNS","kf38":"\u001bNT","kf39":"\u001bOU","kf40":"\u001bOV","kf41":"\u001bOW","kf42":"\u001bOX","kf43":"\u001bOY","kf44":"\u001bOZ","kf45":"\u001bO[","kf46":"\u001bO ","kf47":"\u001bO]","kf48":"\u001bO^","kich":"\u001b[@","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[ A","kLFT":"\u001b[ @"} -{"name":"att730r-24","aliases":["730MTGr-24"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bNu","kf16":"\u001bNv","kf17":"\u001bNw","kf18":"\u001bNx","kf19":"\u001bNy","kf20":"\u001bNz","kf21":"\u001bN{","kf22":"\u001bN|","kf23":"\u001bN}","kf24":"\u001bN~","kf25":"\u001bOC","kf26":"\u001bOD","kf27":"\u001bOE","kf28":"\u001bOF","kf29":"\u001bOG","kf30":"\u001bOH","kf31":"\u001bOI","kf32":"\u001bOJ","kf33":"\u001bNO","kf34":"\u001bNP","kf35":"\u001bNQ","kf36":"\u001bNR","kf37":"\u001bNS","kf38":"\u001bNT","kf39":"\u001bOU","kf40":"\u001bOV","kf41":"\u001bOW","kf42":"\u001bOX","kf43":"\u001bOY","kf44":"\u001bOZ","kf45":"\u001bO[","kf46":"\u001bO ","kf47":"\u001bO]","kf48":"\u001bO^","kich":"\u001b[@","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[ A","kLFT":"\u001b[ @"} -{"name":"att730r-41","aliases":["730MTG-41r"],"cols":80,"lines":41,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bNo","kf10":"\u001bNp","kf11":"\u001bNq","kf12":"\u001bNr","kf13":"\u001bNs","kf14":"\u001bNt","kf15":"\u001bNu","kf16":"\u001bNv","kf17":"\u001bNw","kf18":"\u001bNx","kf19":"\u001bNy","kf20":"\u001bNz","kf21":"\u001bN{","kf22":"\u001bN|","kf23":"\u001bN}","kf24":"\u001bN~","kf25":"\u001bOC","kf26":"\u001bOD","kf27":"\u001bOE","kf28":"\u001bOF","kf29":"\u001bOG","kf30":"\u001bOH","kf31":"\u001bOI","kf32":"\u001bOJ","kf33":"\u001bNO","kf34":"\u001bNP","kf35":"\u001bNQ","kf36":"\u001bNR","kf37":"\u001bNS","kf38":"\u001bNT","kf39":"\u001bOU","kf40":"\u001bOV","kf41":"\u001bOW","kf42":"\u001bOX","kf43":"\u001bOY","kf44":"\u001bOZ","kf45":"\u001bO[","kf46":"\u001bO ","kf47":"\u001bO]","kf48":"\u001bO^","kich":"\u001b[@","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[2J","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[ A","kLFT":"\u001b[ @"} -{"name":"avatar","aliases":["avatar1"],"cols":80,"lines":25,"cnorm":"\u0016'\u0001","civis":"\u0016'\u0002","sgr0":"\u0016\u0001\u0007","smul":"\u0016\u0001\u0001","bold":"\u0016\u0001\u0010","blink":"\u0016\u0002","rev":"\u0016\u0001p","cup":"\u0016\u0008%p1%c%p2%c","cub1":"\u0016\u0005","cuu1":"\u0016\u0003","pad":"\u0000","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd"} -{"name":"avatar0","cols":80,"lines":25,"sgr0":"\u0016\u0001\u0007","smul":"\u0016\u0001\u0001","bold":"\u0016\u0001\u0010","blink":"\u0016\u0002","rev":"\u0016\u0001p","cup":"\u0016\u0008%p1%c%p2%c","cub1":"\u0016\u0005","cuu1":"\u0016\u0003","pad":"\u0000","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd"} -{"name":"avatar0+","cols":80,"lines":25,"sgr0":"\u0016\u0001\u0007","smul":"\u0016\u0001\u0001","bold":"\u0016\u0001\u0010","blink":"\u0016\u0002","rev":"\u0016\u0001p","cup":"\u0016\u0008%p1%c%p2%c","cub1":"\u0016\u0005","cuu1":"\u0016\u0003","pad":"\u0000","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd"} -{"name":"avt","aliases":["avt-s","concept-avt"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c38\u003e","smcup":"\u001b[2;25w\u001b2\r","rmcup":"\u001b[2w\u001b2\r\n","cnorm":"\u001b[=119l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[1!{","smkx":"\u001b[1!z\u001b[0;3u","rmkx":"\u001b[!z\u001b[0;2u","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b\u0001\r","kdch":"\u001b\u0002\r","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000f$\u003c1\u003e","rmacs":"\u000e$\u003c1\u003e"} -{"name":"avt-ns","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c38\u003e","smcup":"\u001b[=4l\u001b[1;24w\u001b2\r","rmcup":"\u001b[w\u001b2\r\n","cnorm":"\u001b[=119l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[1!{","smkx":"\u001b[1!z\u001b[0;3u","rmkx":"\u001b[!z\u001b[0;2u","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b\u0001\r","kdch":"\u001b\u0002\r","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000f$\u003c1\u003e","rmacs":"\u000e$\u003c1\u003e"} -{"name":"avt-rv","aliases":["avt-rv-s"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c38\u003e","smcup":"\u001b[2;25w\u001b2\r","rmcup":"\u001b[2w\u001b2\r\n","cnorm":"\u001b[=119l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[1!{","smkx":"\u001b[1!z\u001b[0;3u","rmkx":"\u001b[!z\u001b[0;2u","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b\u0001\r","kdch":"\u001b\u0002\r","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000f$\u003c1\u003e","rmacs":"\u000e$\u003c1\u003e"} -{"name":"avt-rv-ns","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c38\u003e","smcup":"\u001b[=4l\u001b[1;24w\u001b2\r","rmcup":"\u001b[w\u001b2\r\n","cnorm":"\u001b[=119l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[1!{","smkx":"\u001b[1!z\u001b[0;3u","rmkx":"\u001b[!z\u001b[0;2u","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b\u0001\r","kdch":"\u001b\u0002\r","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000f$\u003c1\u003e","rmacs":"\u000e$\u003c1\u003e"} -{"name":"avt-w","aliases":["avt-w-s"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c38\u003e","smcup":"\u001b[H\u001b[1;24;1;132w","rmcup":"\u001b[2w\u001b2\r\n","cnorm":"\u001b[=119l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[1!{","smkx":"\u001b[1!z\u001b[0;3u","rmkx":"\u001b[!z\u001b[0;2u","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b\u0001\r","kdch":"\u001b\u0002\r","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000f$\u003c1\u003e","rmacs":"\u000e$\u003c1\u003e"} -{"name":"avt-w-ns","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c38\u003e","smcup":"\u001b[H\u001b[1;24;1;132w","rmcup":"\u001b[w\u001b2\r\n","cnorm":"\u001b[=119l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[1!{","smkx":"\u001b[1!z\u001b[0;3u","rmkx":"\u001b[!z\u001b[0;2u","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b\u0001\r","kdch":"\u001b\u0002\r","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000f$\u003c1\u003e","rmacs":"\u000e$\u003c1\u003e"} -{"name":"avt-w-rv","aliases":["avt-w-rv-s"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c38\u003e","smcup":"\u001b[H\u001b[1;24;1;132w","rmcup":"\u001b[2w\u001b2\r\n","cnorm":"\u001b[=119l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[1!{","smkx":"\u001b[1!z\u001b[0;3u","rmkx":"\u001b[!z\u001b[0;2u","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b\u0001\r","kdch":"\u001b\u0002\r","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000f$\u003c1\u003e","rmacs":"\u000e$\u003c1\u003e"} -{"name":"avt-w-rv-ns","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c38\u003e","smcup":"\u001b[H\u001b[1;24;1;132w","rmcup":"\u001b[w\u001b2\r\n","cnorm":"\u001b[=119l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[1!{","smkx":"\u001b[1!z\u001b[0;3u","rmkx":"\u001b[!z\u001b[0;2u","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b\u0001\r","kdch":"\u001b\u0002\r","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000f$\u003c1\u003e","rmacs":"\u000e$\u003c1\u003e"} -{"name":"aws","cols":80,"lines":28,"clear":"\u000c","smul":"\u001bAUN","cup":"\u001bC%p2%c%p1%c","cuu1":"\u0001","pad":"\u0000","kbs":"\u0008","kcuu1":"\u0001","kcud1":"\u000b","kcub1":"\u000e","kcuf1":"\u0012","smacs":"\u001bAAN","rmacs":"\u001bAAF"} -{"name":"awsc","cols":80,"lines":24,"clear":"\u000c","smul":"\u001bAC","cup":"\u001bC%p2%c%p1%c","cuu1":"\u0001","pad":"\u0000","kbs":"\u0008","kcuu1":"\u0001","kcud1":"\u000b","kcub1":"\u000e","kcuf1":"\u0012","smacs":"\u001bAAN","rmacs":"\u001bAAF"} -{"name":"bantam","aliases":["pe550","pe6100"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK$\u003c20\u003e","cup":"\u001bX%p1%' '%+%c\u001bY%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000"} -{"name":"basis","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c300/\u003e","sgr0":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"beacon","cols":80,"lines":32,"bell":"\u001bSTART\r\u001b37\r\u001bEND\r$\u003c1\u003e","clear":"\u001bZ$\u003c10\u003e","smcup":"\u001bSTART\r\u001b2,0\r\u001b12\r\u001bEND\r$\u003c10\u003e","sgr0":"\u001bSTART\r\u001b78\r\u001b70,0\r\u001bEND\r$\u003c20\u003e","smul":"\u001bSTART\r\u001b60,1\r\u001bEND\r","blink":"\u001bSTART\r\u001b61,1\r\u001bEND\r","rev":"\u001bSTART\r\u001b59,1\r\u001bEND\r","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c20\u003e","cub1":"\u0008","cuu1":"\u001bU","pad":"\u0000"} -{"name":"beehive","aliases":["bee"],"cols":80,"lines":24,"clear":"\u001bE","sgr0":"\u001bd@","smul":"\u001bd`","cup":"\u001bF%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b\u003e","kclr":"\u001bE"} -{"name":"beterm","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?4h","rmkx":"\u001b[?4l","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[16~","kf7":"\u001b[17~","kf8":"\u001b[18~","kf9":"\u001b[19~","kf10":"\u001b[20~","kf11":"\u001b[21~","kf12":"\u001b[22~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"bg1.25","cols":85,"lines":64,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c150\u003e","sgr0":"\u001b[m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bP","kf2":"\u001bQ","kf3":"\u001bR","kf4":"\u001bS","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"bg1.25nv","cols":85,"lines":64,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c150\u003e","sgr0":"\u001b[m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bP","kf2":"\u001bQ","kf3":"\u001bR","kf4":"\u001bS","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"bg1.25rv","cols":85,"lines":64,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c150\u003e","sgr0":"\u001b[m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bP","kf2":"\u001bQ","kf3":"\u001bR","kf4":"\u001bS","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"bg2.0","aliases":["bg3.10"],"cols":85,"lines":64,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c150\u003e","sgr0":"\u001b[m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"bg2.0rv","aliases":["bg3.10rv"],"cols":85,"lines":64,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c150\u003e","sgr0":"\u001b[m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"bitgraph","aliases":["bg2.0nv","bg3.10nv"],"cols":85,"lines":64,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c150\u003e","sgr0":"\u001b[m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"blit","aliases":["jerq"],"cols":87,"lines":72,"bell":"\u0007","clear":"\u000c","cup":"\u001bY%p2%' '%+%c%p1%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bx","kf2":"\u001by","kf3":"\u001bz","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"bobcat","aliases":["sbobcat"],"cols":128,"lines":47,"clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c6/\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","khome":"\u001bh","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"bq300","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?7l\u001b[?1l\u001b(B","rmcup":"\u001b[?7h","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-8","cols":80,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","smcup":"\ufffd?7l\ufffd?1l\u001b(B","rmcup":"\ufffd?7h","cnorm":"\ufffd?25h","civis":"\ufffd?25l","sgr0":"\ufffd0m\u001b(B","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd5m","rev":"\ufffd7m","rmkx":"\ufffd?1l\u001b\u003e","cup":"\ufffd%i%p1%d;%p2%dH","pad":"\u0000","kbs":"\u0008","kf1":"\ufffdP","kf2":"\ufffdQ","kf3":"\ufffdR","kf4":"\ufffdS","kf6":"\ufffd17~","kf7":"\ufffd18~","kf8":"\ufffd19~","kf9":"\ufffd20~","kf10":"\ufffd21~","kf11":"\ufffd23~","kf12":"\ufffd24~","kf13":"\ufffd25~","kf14":"\ufffd26~","kf15":"\ufffd28~","kf16":"\ufffd29~","kf17":"\ufffd31~","kf18":"\ufffd32~","kf19":"\ufffd33~","kf20":"\ufffd34~","kich":"\ufffd2~","kdch":"\ufffd3~","khlp":"\ufffd28~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-8-pc","aliases":["Q306-8-pc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","smcup":"\ufffd?7l\ufffd?1l\u001b(B","rmcup":"\ufffd?7h","cnorm":"\ufffd?25h","civis":"\ufffd?25l","sgr0":"\ufffd0m\u001b(B","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd5m","rev":"\ufffd7m","rmkx":"\ufffd?1l\u001b\u003e","cup":"\ufffd%i%p1%d;%p2%dH","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd17~","kf2":"\ufffd18~","kf3":"\ufffd19~","kf4":"\ufffd20~","kf5":"\ufffd21~","kf6":"\ufffd23~","kf7":"\ufffd24~","kf8":"\ufffd25~","kf9":"\ufffd26~","kf10":"\ufffd28~","kf11":"\ufffd29~","kf12":"\ufffd31~","kich":"\ufffd2~","kdch":"\ufffd3~","khome":"\ufffd1~","kend":"\ufffd4~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-8-pc-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","smcup":"\ufffd?7l\ufffd?1l\u001b(B","rmcup":"\ufffd?7h","cnorm":"\ufffd?25h","civis":"\ufffd?25l","sgr0":"\ufffd0m\u001b(B","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd5m","rev":"\ufffd7m","rmkx":"\ufffd?1l\u001b\u003e","cup":"\ufffd%i%p1%d;%p2%dH","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd17~","kf2":"\ufffd18~","kf3":"\ufffd19~","kf4":"\ufffd20~","kf5":"\ufffd21~","kf6":"\ufffd23~","kf7":"\ufffd24~","kf8":"\ufffd25~","kf9":"\ufffd26~","kf10":"\ufffd28~","kf11":"\ufffd29~","kf12":"\ufffd31~","kich":"\ufffd2~","kdch":"\ufffd3~","khome":"\ufffd1~","kend":"\ufffd4~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-8-pc-w","cols":132,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","smcup":"\ufffd?7l\ufffd?1l\u001b(B","rmcup":"\ufffd?7h","cnorm":"\ufffd?25h","civis":"\ufffd?25l","sgr0":"\ufffd0m\u001b(B","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd5m","rev":"\ufffd7m","rmkx":"\ufffd?1l\u001b\u003e","cup":"\ufffd%i%p1%d;%p2%dH","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd17~","kf2":"\ufffd18~","kf3":"\ufffd19~","kf4":"\ufffd20~","kf5":"\ufffd21~","kf6":"\ufffd23~","kf7":"\ufffd24~","kf8":"\ufffd25~","kf9":"\ufffd26~","kf10":"\ufffd28~","kf11":"\ufffd29~","kf12":"\ufffd31~","kich":"\ufffd2~","kdch":"\ufffd3~","khome":"\ufffd1~","kend":"\ufffd4~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-8-pc-w-rv","cols":132,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","smcup":"\ufffd?7l\ufffd?1l\u001b(B","rmcup":"\ufffd?7h","cnorm":"\ufffd?25h","civis":"\ufffd?25l","sgr0":"\ufffd0m\u001b(B","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd5m","rev":"\ufffd7m","rmkx":"\ufffd?1l\u001b\u003e","cup":"\ufffd%i%p1%d;%p2%dH","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd17~","kf2":"\ufffd18~","kf3":"\ufffd19~","kf4":"\ufffd20~","kf5":"\ufffd21~","kf6":"\ufffd23~","kf7":"\ufffd24~","kf8":"\ufffd25~","kf9":"\ufffd26~","kf10":"\ufffd28~","kf11":"\ufffd29~","kf12":"\ufffd31~","kich":"\ufffd2~","kdch":"\ufffd3~","khome":"\ufffd1~","kend":"\ufffd4~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-8rv","cols":80,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","smcup":"\ufffd?7l\ufffd?1l\u001b(B","rmcup":"\ufffd?7h","cnorm":"\ufffd?25h","civis":"\ufffd?25l","sgr0":"\ufffd0m\u001b(B","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd5m","rev":"\ufffd7m","rmkx":"\ufffd?1l\u001b\u003e","cup":"\ufffd%i%p1%d;%p2%dH","pad":"\u0000","kbs":"\u0008","kf1":"\ufffdP","kf2":"\ufffdQ","kf3":"\ufffdR","kf4":"\ufffdS","kf6":"\ufffd17~","kf7":"\ufffd18~","kf8":"\ufffd19~","kf9":"\ufffd20~","kf10":"\ufffd21~","kf11":"\ufffd23~","kf12":"\ufffd24~","kf13":"\ufffd25~","kf14":"\ufffd26~","kf15":"\ufffd28~","kf16":"\ufffd29~","kf17":"\ufffd31~","kf18":"\ufffd32~","kf19":"\ufffd33~","kf20":"\ufffd34~","kich":"\ufffd2~","kdch":"\ufffd3~","khlp":"\ufffd28~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-8w","cols":132,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","smcup":"\ufffd?7l\ufffd?1l\u001b(B","rmcup":"\ufffd?7h","cnorm":"\ufffd?25h","civis":"\ufffd?25l","sgr0":"\ufffd0m\u001b(B","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd5m","rev":"\ufffd7m","rmkx":"\ufffd?1l\u001b\u003e","cup":"\ufffd%i%p1%d;%p2%dH","pad":"\u0000","kbs":"\u0008","kf1":"\ufffdP","kf2":"\ufffdQ","kf3":"\ufffdR","kf4":"\ufffdS","kf6":"\ufffd17~","kf7":"\ufffd18~","kf8":"\ufffd19~","kf9":"\ufffd20~","kf10":"\ufffd21~","kf11":"\ufffd23~","kf12":"\ufffd24~","kf13":"\ufffd25~","kf14":"\ufffd26~","kf15":"\ufffd28~","kf16":"\ufffd29~","kf17":"\ufffd31~","kf18":"\ufffd32~","kf19":"\ufffd33~","kf20":"\ufffd34~","kich":"\ufffd2~","kdch":"\ufffd3~","khlp":"\ufffd28~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-pc","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?7l\u001b[?1l\u001b(B","rmcup":"\u001b[?7h","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-pc-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?7l\u001b[?1l\u001b(B","rmcup":"\u001b[?7h","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-pc-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?7l\u001b[?1l\u001b(B","rmcup":"\u001b[?7h","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-pc-w-rv","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?7l\u001b[?1l\u001b(B","rmcup":"\u001b[?7h","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?7l\u001b[?1l\u001b(B","rmcup":"\u001b[?7h","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?7l\u001b[?1l\u001b(B","rmcup":"\u001b[?7h","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-w-8rv","cols":132,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","smcup":"\ufffd?7l\ufffd?1l\u001b(B","rmcup":"\ufffd?7h","cnorm":"\ufffd?25h","civis":"\ufffd?25l","sgr0":"\ufffd0m\u001b(B","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd5m","rev":"\ufffd7m","rmkx":"\ufffd?1l\u001b\u003e","cup":"\ufffd%i%p1%d;%p2%dH","pad":"\u0000","kbs":"\u0008","kf1":"\ufffdP","kf2":"\ufffdQ","kf3":"\ufffdR","kf4":"\ufffdS","kf6":"\ufffd17~","kf7":"\ufffd18~","kf8":"\ufffd19~","kf9":"\ufffd20~","kf10":"\ufffd21~","kf11":"\ufffd23~","kf12":"\ufffd24~","kf13":"\ufffd25~","kf14":"\ufffd26~","kf15":"\ufffd28~","kf16":"\ufffd29~","kf17":"\ufffd31~","kf18":"\ufffd32~","kf19":"\ufffd33~","kf20":"\ufffd34~","kich":"\ufffd2~","kdch":"\ufffd3~","khlp":"\ufffd28~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"bq300-w-rv","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?7l\u001b[?1l\u001b(B","rmcup":"\u001b[?7h","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b(B\u001b)0"} -{"name":"bsdos-pc","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001bc","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[L","khome":"\u001b[H","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"bsdos-pc-m","aliases":["bsdos-pc-mono"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001bc","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[L","khome":"\u001b[H","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"bsdos-pc-nobold","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001bc","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[L","khome":"\u001b[H","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"bsdos-ppc","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001bc","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[L","khome":"\u001b[H","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"bsdos-sparc","cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"c100","aliases":["c100-4p","c104","concept","concept100"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b?\u001b\u0005$\u003c2*\u003e","smcup":"\u001bU\u001bv 8p\u001bp\r\u001b\u0015$\u003c16\u003e","rmcup":"\u001bv $\u003c6\u003e\u001bp\r\n","sgr0":"\u001bN@","smul":"\u001bG","blink":"\u001bC","rev":"\u001bD","dim":"\u001bE","smkx":"\u001bX","rmkx":"\u001bx","cup":"\u001ba%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001b;","pad":"\u0000","kbs":"\u0008","kf1":"\u001b5","kf2":"\u001b6","kf3":"\u001b7","kf4":"\u001b8","kf5":"\u001b9","kf6":"\u001b:a","kf7":"\u001b:b","kf8":"\u001b:c","kich":"\u001b\u0010","kdch":"\u001b\u0011","khome":"\u001b?","kpp":"\u001b.","knp":"\u001b-","kcuu1":"\u001b;","kcud1":"\u001b\u003c","kcub1":"\u001b\u003e","kcuf1":"\u001b=","kcbt":"\u001b'"} -{"name":"c100-rv","aliases":["c100-rv-4p","concept100-rv"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b?\u001b\u0005$\u003c2*\u003e","smcup":"\u001bU\u001bv 8p\u001bp\r\u001b\u0015$\u003c16\u003e","rmcup":"\u001bv $\u003c6\u003e\u001bp\r\n","sgr0":"\u001bN@","smul":"\u001bG","blink":"\u001bC","rev":"\u001bD","dim":"\u001bE","smkx":"\u001bX","rmkx":"\u001bx","cup":"\u001ba%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001b;","pad":"\u0000","kbs":"\u0008","kf1":"\u001b5","kf2":"\u001b6","kf3":"\u001b7","kf4":"\u001b8","kf5":"\u001b9","kf6":"\u001b:a","kf7":"\u001b:b","kf8":"\u001b:c","kich":"\u001b\u0010","kdch":"\u001b\u0011","khome":"\u001b?","kpp":"\u001b.","knp":"\u001b-","kcuu1":"\u001b;","kcud1":"\u001b\u003c","kcub1":"\u001b\u003e","kcuf1":"\u001b=","kcbt":"\u001b'"} -{"name":"c108","aliases":["c108-8p","concept108","concept108-8p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b?\u001b\u0005$\u003c2*\u003e","smcup":"\u001bU\u001bv 8p\u001bp\r\u001b\u0015","rmcup":"\u001bv \u0001p\u001bp\r\n","cnorm":"\u001bw","sgr0":"\u001bN@","smul":"\u001bG","blink":"\u001bC","rev":"\u001bD","dim":"\u001bE","smkx":"\u001bX","rmkx":"\u001bx","cup":"\u001ba%p1%?%p1%'_'%\u003e%t\u0001%'`'%-%;%' '%+%c%p2%?%p2%'_'%\u003e%t\u0001%'`'%-%;%' '%+%c","cub1":"\u0008","cuu1":"\u001b;","pad":"\u0000","kbs":"\u0008","kf1":"\u001b5","kf2":"\u001b6","kf3":"\u001b7","kf4":"\u001b8","kf5":"\u001b9","kf6":"\u001b:a","kf7":"\u001b:b","kf8":"\u001b:c","kich":"\u001b\u0010","kdch":"\u001b\u0011","khome":"\u001b?","kpp":"\u001b.","knp":"\u001b-","kcuu1":"\u001b;","kcud1":"\u001b\u003c","kcub1":"\u001b\u003e","kcuf1":"\u001b=","kcbt":"\u001b'","acsc":"jEkTl\\mMqLxU","smacs":"\u001bj!","rmacs":"\u001bj "} -{"name":"c108-4p","aliases":["concept108-4p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b?\u001b\u0005$\u003c2*\u003e","smcup":"\u001bU\u001bv 8p\u001bp\r\u001b\u0015","rmcup":"\u001bv \u0001 p\u001bp\r\n","cnorm":"\u001bw","sgr0":"\u001bN@","smul":"\u001bG","blink":"\u001bC","rev":"\u001bD","dim":"\u001bE","smkx":"\u001bX","rmkx":"\u001bx","cup":"\u001ba%p1%?%p1%'_'%\u003e%t\u0001%'`'%-%;%' '%+%c%p2%?%p2%'_'%\u003e%t\u0001%'`'%-%;%' '%+%c","cub1":"\u0008","cuu1":"\u001b;","pad":"\u0000","kbs":"\u0008","kf1":"\u001b5","kf2":"\u001b6","kf3":"\u001b7","kf4":"\u001b8","kf5":"\u001b9","kf6":"\u001b:a","kf7":"\u001b:b","kf8":"\u001b:c","kich":"\u001b\u0010","kdch":"\u001b\u0011","khome":"\u001b?","kpp":"\u001b.","knp":"\u001b-","kcuu1":"\u001b;","kcud1":"\u001b\u003c","kcub1":"\u001b\u003e","kcuf1":"\u001b=","kcbt":"\u001b'","acsc":"jEkTl\\mMqLxU","smacs":"\u001bj!","rmacs":"\u001bj "} -{"name":"c108-rv","aliases":["c108-rv-8p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b?\u001b\u0005$\u003c2*\u003e","smcup":"\u001bU\u001bv 8p\u001bp\r","rmcup":"\u001bv \u0002 p\u001bp\r\n","cnorm":"\u001bw","sgr0":"\u001bN@","smul":"\u001bG","blink":"\u001bC","rev":"\u001bD","dim":"\u001bE","smkx":"\u001bX","rmkx":"\u001bx","cup":"\u001ba%p1%?%p1%'_'%\u003e%t\u0001%'`'%-%;%' '%+%c%p2%?%p2%'_'%\u003e%t\u0001%'`'%-%;%' '%+%c","cub1":"\u0008","cuu1":"\u001b;","pad":"\u0000","kbs":"\u0008","kf1":"\u001b5","kf2":"\u001b6","kf3":"\u001b7","kf4":"\u001b8","kf5":"\u001b9","kf6":"\u001b:a","kf7":"\u001b:b","kf8":"\u001b:c","kich":"\u001b\u0010","kdch":"\u001b\u0011","khome":"\u001b?","kpp":"\u001b.","knp":"\u001b-","kcuu1":"\u001b;","kcud1":"\u001b\u003c","kcub1":"\u001b\u003e","kcuf1":"\u001b=","kcbt":"\u001b'","acsc":"jEkTl\\mMqLxU","smacs":"\u001bj!","rmacs":"\u001bj "} -{"name":"c108-rv-4p","aliases":["concept108rv4p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b?\u001b\u0005$\u003c2*\u003e","smcup":"\u001bU\u001bv 8p\u001bp\r\u001b\u0015","rmcup":"\u001bv \u0001 p\u001bp\r\n","cnorm":"\u001bw","sgr0":"\u001bN@","smul":"\u001bG","blink":"\u001bC","rev":"\u001bD","dim":"\u001bE","smkx":"\u001bX","rmkx":"\u001bx","cup":"\u001ba%p1%?%p1%'_'%\u003e%t\u0001%'`'%-%;%' '%+%c%p2%?%p2%'_'%\u003e%t\u0001%'`'%-%;%' '%+%c","cub1":"\u0008","cuu1":"\u001b;","pad":"\u0000","kbs":"\u0008","kf1":"\u001b5","kf2":"\u001b6","kf3":"\u001b7","kf4":"\u001b8","kf5":"\u001b9","kf6":"\u001b:a","kf7":"\u001b:b","kf8":"\u001b:c","kich":"\u001b\u0010","kdch":"\u001b\u0011","khome":"\u001b?","kpp":"\u001b.","knp":"\u001b-","kcuu1":"\u001b;","kcud1":"\u001b\u003c","kcub1":"\u001b\u003e","kcuf1":"\u001b=","kcbt":"\u001b'","acsc":"jEkTl\\mMqLxU","smacs":"\u001bj!","rmacs":"\u001bj "} -{"name":"c108-w","aliases":["c108-w-8p","concept108-w-8","concept108-w8p"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b?\u001b\u0005$\u003c2*\u003e","smcup":"\u001bU\u001bv 8\u0001D\u001bp\r","rmcup":"\u001bv \u00010\u0001D\u001bp\r\n","cnorm":"\u001bw","sgr0":"\u001bN@","smul":"\u001bG","blink":"\u001bC","rev":"\u001bD","dim":"\u001bE","smkx":"\u001bX","rmkx":"\u001bx","cup":"\u001ba%p1%?%p1%'_'%\u003e%t\u0001%'`'%-%;%' '%+%c%p2%?%p2%'_'%\u003e%t\u0001%'`'%-%;%' '%+%c","cub1":"\u0008","cuu1":"\u001b;","pad":"\u0000","kbs":"\u0008","kf1":"\u001b5","kf2":"\u001b6","kf3":"\u001b7","kf4":"\u001b8","kf5":"\u001b9","kf6":"\u001b:a","kf7":"\u001b:b","kf8":"\u001b:c","kich":"\u001b\u0010","kdch":"\u001b\u0011","khome":"\u001b?","kpp":"\u001b.","knp":"\u001b-","kcuu1":"\u001b;","kcud1":"\u001b\u003c","kcub1":"\u001b\u003e","kcuf1":"\u001b=","kcbt":"\u001b'","acsc":"jEkTl\\mMqLxU","smacs":"\u001bj!","rmacs":"\u001bj "} -{"name":"ca22851","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c8\u003e","cup":"\u0002%i%p1%c%p2%c","cub1":"\u0015","cuu1":"\u0016","pad":"\u0000","khome":"\u001e","kcuu1":"\u0016","kcud1":"\u0017","kcub1":"\u0015"} -{"name":"cbblit","aliases":["fixterm"],"cols":88,"lines":72,"bell":"\u0007","clear":"\u000c","smul":"\u001bU\"","cup":"\u001bY%p2%' '%+%c%p1%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bx","kf2":"\u001by","kf3":"\u001bz","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"cbunix","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bL","smul":"\u001ba\u0001","cup":"\u001bG%p2%c%p1%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","khome":"\u001bE","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"cci","aliases":["cci1","z8001","zen8001"],"cols":80,"lines":24,"clear":"\u001bH\u001bJ","cnorm":"\u001bP","sgr0":"\u001bM ","smul":"\u001bM0","blink":"\u001bM\"","rev":"\u001bM$","dim":"\u001bM!","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"cdc456","cols":80,"lines":24,"bell":"\u0007","clear":"\u0019\u0018","cup":"\u001b1%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000"} -{"name":"cdc721","cols":80,"lines":24,"clear":"\u000c","cup":"\u0002%p2%' '%+%c%p1%' '%+%c","cuu1":"\u0017","pad":"\u0000","khome":"\u0019","kcuu1":"\u0017","kcud1":"\n","kcub1":"\u0008","kcuf1":"\t"} -{"name":"cdc721-esc","cols":80,"lines":30,"bell":"\u0007","clear":"\u000c","sgr0":"\u000f\u0015\u001d\u001eE\u001e\u0012\\","smul":"\u001c","blink":"\u000e","rev":"\u001eD","dim":"\u001c","smkx":"\u001e\u0012k","rmkx":"\u001e\u0012l","cup":"\u0002%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u0017","pad":"\u0000","kbs":"\u0008","kf1":"\u001er","kf2":"\u001es","kf3":"\u001et","kf4":"\u001eu","kf5":"\u001ev","kf6":"\u001ew","kf7":"\u001ex","kf8":"\u001ey","kf9":"\u001ez","khome":"\u0019","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0008","kcuf1":"\u0018"} -{"name":"cdc721ll","cols":132,"lines":24,"clear":"\u000c","cup":"\u0002%p2%' '%+%c%p1%' '%+%c","cuu1":"\u0017","pad":"\u0000","khome":"\u0019","kcuu1":"\u0017","kcud1":"\n","kcub1":"\u0008","kcuf1":"\t"} -{"name":"cdc752","cols":80,"lines":24,"bell":"\u0007","clear":"\u0018\u001b1 ","cup":"\u001b1%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000"} -{"name":"cdc756","cols":80,"lines":24,"bell":"\u0007","clear":"\u0019\u0018","cup":"\u001b1%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","kf1":"\u001bB","kf2":"\u001bC","kf3":"\u001bD","kf4":"\u001bE","kf5":"\u001bF","kf6":"\u001bG","kf7":"\u001bH","kf8":"\u001ba","kf9":"\u001bb","kich":"\u001bK","kdch":"\u001bI","khome":"\u0019","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0015"} -{"name":"cg7900","aliases":["chromatics"],"cols":80,"lines":40,"bell":"\u0007","clear":"\u000c","smcup":"\u0001P0\u0001O1\u0001R1\u0001C4,\u0001c0,\u000c\u0001M0,42,WARNING DOUBLE ENTER ESCAPE and \u0015\u0001C1,\u0001c2,\u0001W0,0,79,39,","rmcup":"\u0001W0,40,85,48,\u000c\u0001W0,0,85,48,\u0001M0,40,","cup":"\u0001M%p2%d,%p1%d,","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"cit101","aliases":["citc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[V\u001b8","sgr0":"\u001b[m","smul":"\u001b[4m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"cit101e","cols":80,"lines":24,"clear":"\u001b[H\u001b[J","smul":"\u001b[4m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%2d;%p2%2dH","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOm","kf6":"\u001bOl","kf7":"\u001bOM","kf8":"\u001bOn","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000e","rmacs":"\u000f"} -{"name":"cit101e-132","cols":132,"lines":24,"clear":"\u001b[H\u001b[J","smul":"\u001b[4m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%2d;%p2%2dH","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOm","kf6":"\u001bOl","kf7":"\u001bOM","kf8":"\u001bOn","kcuu1":"\u001b[A","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001b[C","smacs":"\u000e","rmacs":"\u000f"} -{"name":"cit101e-n","cols":80,"lines":24,"clear":"\u001b[H\u001b[J","smul":"\u001b[4m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%2d;%p2%2dH","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOm","kf6":"\u001bOl","kf7":"\u001bOM","kf8":"\u001bOn","kcuu1":"\u001b[A","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001b[C","smacs":"\u000e","rmacs":"\u000f"} -{"name":"cit101e-n132","cols":132,"lines":24,"clear":"\u001b[H\u001b[J","smul":"\u001b[4m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%2d;%p2%2dH","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOm","kf6":"\u001bOl","kf7":"\u001bOM","kf8":"\u001bOn","kcuu1":"\u001b[A","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001b[C","smacs":"\u000e","rmacs":"\u000f"} -{"name":"cit101e-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[\u003e5g\u001b[?7h\u001b[?5h","cnorm":"\u001b[0;3;4v","civis":"\u001b[1v","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"cit500","cols":80,"lines":64,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOQ","kf2":"\u001bOR","kf3":"\u001bOS","kf4":"\u001bOU","kf5":"\u001bOV","kf6":"\u001bOW","kf7":"\u001bOX","kf8":"\u001bOY","kf9":"\u001bOZ","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","smacs":"\u000e","rmacs":"\u000f"} -{"name":"cit80","aliases":["cit-80"],"cols":80,"lines":24,"clear":"\u001b[H\u001bJ","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%2d;%p2%2dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"coco3","aliases":["os9LII"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c5*/\u003e","cnorm":"\u0005!","civis":"\u0005 ","sgr0":"\u001f!\u001b:\ufffd","smul":"\u001f\"","bold":"\u001b:\u0001","blink":"\u001f\"","rev":"\u001f ","cup":"\u0002%p2%' '%+%c%p1%' '%+%c$\u003c2/\u003e","cub1":"\u0008","cuu1":"\t","pad":"\u0000","kcuu1":"\u000c","kcud1":"\n","kcub1":"\u0008","kcuf1":"\t"} -{"name":"color_xterm","aliases":["cx","cx100"],"cols":80,"lines":65,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1;41s\u001b[?1;41h\u001b=","rmcup":"\u001b\u003e\u001b[?41;1r","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"commodore","aliases":["b-128"],"cols":80,"lines":24,"clear":"\u001b\u0006$\u003c10/\u003e","cup":"\u001b\u000b%p1%2d,%p2%2d,$\u003c20/\u003e","cuu1":"\u0010","pad":"\u0000","khome":"\u001b\u0005","kcuu1":"\u0010","kcud1":"\n","kcub1":"\u0002","kcuf1":"\u0006"} -{"name":"cons25","aliases":["ansi80x25","ansis"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons25-m","aliases":["ansi80x25-mono","ansis-mono"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"cons25l1","aliases":["cons25-iso8859"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+\ufffd,\ufffd-\u0018.\u0019`\ufffda\ufffdf\ufffdg\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdp\ufffdq\ufffdr\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons25l1-m","aliases":["cons25-iso-m"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+\ufffd,\ufffd-\u0018.\u0019`\ufffda\ufffdf\ufffdg\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdp\ufffdq\ufffdr\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"cons25r","aliases":["cons25-koi8-r","ibmpc3r","pc3r"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons25r-m","aliases":["cons25-koi8r-m","ibmpc3r-mono","pc3r-m"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"cons25w","aliases":["ansi80x25-raw","ansiw"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons30","aliases":["ansi80x30"],"cols":80,"lines":30,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons30-m","aliases":["ansi80x30-mono"],"cols":80,"lines":30,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"cons43","aliases":["ansi80x43"],"cols":80,"lines":43,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons43-m","aliases":["ansi80x43-mono"],"cols":80,"lines":43,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"cons50","aliases":["ansi80x50","ansil"],"cols":80,"lines":50,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons50-m","aliases":["ansi80x50-mono","ansil-mono"],"cols":80,"lines":50,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"cons50l1","aliases":["cons50-iso8859"],"cols":80,"lines":50,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+\ufffd,\ufffd-\u0018.\u0019`\ufffda\ufffdf\ufffdg\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdp\ufffdq\ufffdr\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons50l1-m","aliases":["cons50-iso-m"],"cols":80,"lines":50,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+\ufffd,\ufffd-\u0018.\u0019`\ufffda\ufffdf\ufffdg\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdp\ufffdq\ufffdr\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"cons50r","aliases":["cons50-koi8r"],"cols":80,"lines":50,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons50r-m","aliases":["cons50-koi8r-m"],"cols":80,"lines":50,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"cons60","aliases":["ansi80x60"],"cols":80,"lines":60,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons60-m","aliases":["ansi80x60-mono"],"cols":80,"lines":60,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"cons60l1","aliases":["cons60-iso"],"cols":80,"lines":60,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+\ufffd,\ufffd-\u0018.\u0019`\ufffda\ufffdf\ufffdg\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdp\ufffdq\ufffdr\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons60l1-m","aliases":["cons60-iso-m"],"cols":80,"lines":60,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+\ufffd,\ufffd-\u0018.\u0019`\ufffda\ufffdf\ufffdg\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdp\ufffdq\ufffdr\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"cons60r","aliases":["cons60-koi8r"],"cols":80,"lines":60,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cons60r-m","aliases":["cons60-koi8r-m"],"cols":80,"lines":60,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[=0C","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[30;1m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdh\ufffdi\u0015j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd~\ufffd"} -{"name":"contel300","aliases":["c300","contel320"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001b!\ufffd","cup":"\u001bX%p1%' '%+%c\u001bY%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bRA","kf2":"\u001bRB","kf3":"\u001bRC","kf4":"\u001bRD","kf5":"\u001bRE","kf6":"\u001bRF","kf7":"\u001bRG","kf8":"\u001bRH","kf9":"\u001bRI"} -{"name":"contel301","aliases":["c301","c321","contel321"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001b!\ufffd","cup":"\u001bX%p1%' '%+%c\u001bY%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bRA","kf2":"\u001bRB","kf3":"\u001bRC","kf4":"\u001bRD","kf5":"\u001bRE","kf6":"\u001bRF","kf7":"\u001bRG","kf8":"\u001bRH","kf9":"\u001bRI"} -{"name":"cops10","aliases":["cops","cops-10"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u0018$\u003c30/\u003e","cup":"\u0010%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","khome":"\u0019","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"crt","aliases":["crt-vt220"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cs10","aliases":["colorscan"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%02d;%p2%02dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"cs10-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%02d;%p2%03dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ct8500","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b\u0005","sgr0":"\u001b ","smul":"\u001b!","cup":"\u001b|%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bR","pad":"\u0000"} -{"name":"ctrm","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@%{0}%PA%{0}%PB%{0}%PH","smul":"\u001b\u0026dD","bold":"%?%gH%{0}%=%t\u001b\u0026dH%{1}%PH%;","blink":"\u001b\u0026dA%{1}%PA","rev":"%?%gB%{0}%=%t\u001b\u0026dB%{1}%PB%;","smkx":"\u001b\u0026jB","rmkx":"\u001b\u0026jA","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","khome":"\u001bp\r","kcuu1":"\u001bt\r","kcud1":"\u001bw\r","kcub1":"\u001bu\r","kcuf1":"\u001bv\r"} -{"name":"cyb110","aliases":["mdl110"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u0018$\u003c70\u003e","cup":"\u0010%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000"} -{"name":"cyb83","aliases":["xl83"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c62\u003e","cup":"\u0017%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000e","pad":"\u0000","kcuu1":"\u000e","kcud1":"\n","kcub1":"\u0008","kcuf1":"\t"} -{"name":"cygwin","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cygwinB19","cols":80,"lines":25,"colors":8,"clear":"\u001b[2J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"cygwinDBG","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"d132","aliases":["datagraphix"],"cols":80,"lines":30,"bell":"\u0007","clear":"\u000c","cnorm":"\u001bm\u001bn","cup":"\u001b8%i%p1%3d%p2%3d","cub1":"\u0008","cuu1":"\u001bK","pad":"\u0000","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"d200","aliases":["d200-dg"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u000f\u0015\u001d\u001eE","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d210","aliases":["d214"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i"} -{"name":"d210-dg","aliases":["d214-dg"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u000f\u0015\u001d\u001eE","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d211","aliases":["d215"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\ufffd001z","kf2":"\ufffd002z","kf3":"\ufffd003z","kf4":"\ufffd004z","kf5":"\ufffd005z","kf6":"\ufffd006z","kf7":"\ufffd007z","kf8":"\ufffd008z","kf9":"\ufffd009z","kf10":"\ufffd010z","kf11":"\ufffd011z","kf12":"\ufffd012z","kf13":"\ufffd013z","kf14":"\ufffd014z","kf15":"\ufffd000z","kf16":"\ufffd101z","kf17":"\ufffd102z","kf18":"\ufffd103z","kf19":"\ufffd104z","kf20":"\ufffd105z","kf21":"\ufffd106z","kf22":"\ufffd107z","kf23":"\ufffd108z","kf24":"\ufffd109z","kf25":"\ufffd110z","kf26":"\ufffd111z","kf27":"\ufffd112z","kf28":"\ufffd113z","kf29":"\ufffd114z","kf30":"\ufffd100z","kf31":"\ufffd201z","kf32":"\ufffd202z","kf33":"\ufffd203z","kf34":"\ufffd204z","kf35":"\ufffd205z","kf36":"\ufffd206z","kf37":"\ufffd207z","kf38":"\ufffd208z","kf39":"\ufffd209z","kf40":"\ufffd210z","kf41":"\ufffd211z","kf42":"\ufffd212z","kf43":"\ufffd213z","kf44":"\ufffd214z","kf45":"\ufffd200z","kf46":"\ufffd301z","kf47":"\ufffd302z","kf48":"\ufffd303z","kf49":"\ufffd304z","kf50":"\ufffd305z","kf51":"\ufffd306z","kf52":"\ufffd307z","kf53":"\ufffd308z","kf54":"\ufffd309z","kf55":"\ufffd310z","kf56":"\ufffd311z","kf57":"\ufffd312z","kf58":"\ufffd313z","kf59":"\ufffd314z","kf60":"\ufffd300z","khome":"\ufffdH","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kclr":"\ufffd2J","kprt":"\ufffdi"} -{"name":"d211-7b","aliases":["d215-7b"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i"} -{"name":"d211-dg","aliases":["d215-dg"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u000f\u0015\u001d\u001eE","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d216-dg","aliases":["d216+dg","d216e+dg","d216e-dg","d217-dg"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u000f\u0015\u001d\u001eE","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d216-unix","aliases":["d216+","d216e+","d216e-unix"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001ePH","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d216-unix-25","aliases":["d216+25"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001ePH","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d217-unix","cols":80,"lines":24,"bell":"\u0007","clear":"\u001ePH","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d217-unix-25","cols":80,"lines":25,"bell":"\u0007","clear":"\u001ePH","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d220","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u001b)4\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m","setbg":"\u001b[4%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\ufffd001z","kf2":"\ufffd002z","kf3":"\ufffd003z","kf4":"\ufffd004z","kf5":"\ufffd005z","kf6":"\ufffd006z","kf7":"\ufffd007z","kf8":"\ufffd008z","kf9":"\ufffd009z","kf10":"\ufffd010z","kf11":"\ufffd011z","kf12":"\ufffd012z","kf13":"\ufffd013z","kf14":"\ufffd014z","kf15":"\ufffd000z","kf16":"\ufffd101z","kf17":"\ufffd102z","kf18":"\ufffd103z","kf19":"\ufffd104z","kf20":"\ufffd105z","kf21":"\ufffd106z","kf22":"\ufffd107z","kf23":"\ufffd108z","kf24":"\ufffd109z","kf25":"\ufffd110z","kf26":"\ufffd111z","kf27":"\ufffd112z","kf28":"\ufffd113z","kf29":"\ufffd114z","kf30":"\ufffd100z","kf31":"\ufffd201z","kf32":"\ufffd202z","kf33":"\ufffd203z","kf34":"\ufffd204z","kf35":"\ufffd205z","kf36":"\ufffd206z","kf37":"\ufffd207z","kf38":"\ufffd208z","kf39":"\ufffd209z","kf40":"\ufffd210z","kf41":"\ufffd211z","kf42":"\ufffd212z","kf43":"\ufffd213z","kf44":"\ufffd214z","kf45":"\ufffd200z","kf46":"\ufffd301z","kf47":"\ufffd302z","kf48":"\ufffd303z","kf49":"\ufffd304z","kf50":"\ufffd305z","kf51":"\ufffd306z","kf52":"\ufffd307z","kf53":"\ufffd308z","kf54":"\ufffd309z","kf55":"\ufffd310z","kf56":"\ufffd311z","kf57":"\ufffd312z","kf58":"\ufffd313z","kf59":"\ufffd314z","kf60":"\ufffd300z","khome":"\ufffdH","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kclr":"\ufffd2J","kprt":"\ufffdi","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001b)6\u000e","rmacs":"\u001b)4\u000f","_setfgbg":"\u001b[3%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;;4%p2%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m"} -{"name":"d220-7b","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m","setbg":"\u001b[4%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)6","_setfgbg":"\u001b[3%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;;4%p2%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m"} -{"name":"d220-dg","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u000c","cnorm":"\u001eFQ2","civis":"\u001eFQ0","sgr0":"\u000f\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","setaf":"\u001eA%p1%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%'0'%+%c","setbg":"\u001eB%p1%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%'0'%+%c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d230c","aliases":["d230"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[50m\u001b)4\u000f","smul":"\u001b[4;50m","bold":"\u001b[4;7;50m","blink":"\u001b[5;50m","rev":"\u001b[7;50m","dim":"\u001b[2;50m","smkx":"\u001b[2;0v","rmkx":"\u001b[2;1v","setaf":"\u001b[3%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m","setbg":"\u001b[4%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001b)6\u000e","rmacs":"\u001b)4\u000f","_setfgbg":"\u001b[3%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;;4%p2%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m"} -{"name":"d230c-dg","aliases":["d230-dg"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u000c","cnorm":"\u001eFQ2","civis":"\u001eFQ0","sgr0":"\u000f\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","setaf":"\u001eA%p1%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%'0'%+%c","setbg":"\u001eB%p1%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%'0'%+%c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d400","aliases":["d400-dg","d450","d450-dg"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001eFQ2","civis":"\u001eFQ0","sgr0":"\u000f\u0015\u001d\u001eE\u001eO","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eN","rmacs":"\u001eO","enacs":"\u001eN\u001eFS11\u001eO","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d410","aliases":["d411","d460","d461"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u001b)4\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\ufffd001z","kf2":"\ufffd002z","kf3":"\ufffd003z","kf4":"\ufffd004z","kf5":"\ufffd005z","kf6":"\ufffd006z","kf7":"\ufffd007z","kf8":"\ufffd008z","kf9":"\ufffd009z","kf10":"\ufffd010z","kf11":"\ufffd011z","kf12":"\ufffd012z","kf13":"\ufffd013z","kf14":"\ufffd014z","kf15":"\ufffd000z","kf16":"\ufffd101z","kf17":"\ufffd102z","kf18":"\ufffd103z","kf19":"\ufffd104z","kf20":"\ufffd105z","kf21":"\ufffd106z","kf22":"\ufffd107z","kf23":"\ufffd108z","kf24":"\ufffd109z","kf25":"\ufffd110z","kf26":"\ufffd111z","kf27":"\ufffd112z","kf28":"\ufffd113z","kf29":"\ufffd114z","kf30":"\ufffd100z","kf31":"\ufffd201z","kf32":"\ufffd202z","kf33":"\ufffd203z","kf34":"\ufffd204z","kf35":"\ufffd205z","kf36":"\ufffd206z","kf37":"\ufffd207z","kf38":"\ufffd208z","kf39":"\ufffd209z","kf40":"\ufffd210z","kf41":"\ufffd211z","kf42":"\ufffd212z","kf43":"\ufffd213z","kf44":"\ufffd214z","kf45":"\ufffd200z","kf46":"\ufffd301z","kf47":"\ufffd302z","kf48":"\ufffd303z","kf49":"\ufffd304z","kf50":"\ufffd305z","kf51":"\ufffd306z","kf52":"\ufffd307z","kf53":"\ufffd308z","kf54":"\ufffd309z","kf55":"\ufffd310z","kf56":"\ufffd311z","kf57":"\ufffd312z","kf58":"\ufffd313z","kf59":"\ufffd314z","kf60":"\ufffd300z","khome":"\ufffdH","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kclr":"\ufffd2J","kprt":"\ufffdi","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001b)6\u000e","rmacs":"\u001b)4\u000f"} -{"name":"d410-7b","aliases":["d411-7b","d460-7b","d461-7b"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)6"} -{"name":"d410-7b-w","aliases":["d411-7b-w","d460-7b-w","d461-7b-w"],"cols":126,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)6"} -{"name":"d410-dg","aliases":["d411-dg","d460-dg","d461-dg"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001eFQ2","civis":"\u001eFQ0","sgr0":"\u000f\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d410-w","aliases":["d411-w","d460-w","d461-w"],"cols":126,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u001b)4\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\ufffd001z","kf2":"\ufffd002z","kf3":"\ufffd003z","kf4":"\ufffd004z","kf5":"\ufffd005z","kf6":"\ufffd006z","kf7":"\ufffd007z","kf8":"\ufffd008z","kf9":"\ufffd009z","kf10":"\ufffd010z","kf11":"\ufffd011z","kf12":"\ufffd012z","kf13":"\ufffd013z","kf14":"\ufffd014z","kf15":"\ufffd000z","kf16":"\ufffd101z","kf17":"\ufffd102z","kf18":"\ufffd103z","kf19":"\ufffd104z","kf20":"\ufffd105z","kf21":"\ufffd106z","kf22":"\ufffd107z","kf23":"\ufffd108z","kf24":"\ufffd109z","kf25":"\ufffd110z","kf26":"\ufffd111z","kf27":"\ufffd112z","kf28":"\ufffd113z","kf29":"\ufffd114z","kf30":"\ufffd100z","kf31":"\ufffd201z","kf32":"\ufffd202z","kf33":"\ufffd203z","kf34":"\ufffd204z","kf35":"\ufffd205z","kf36":"\ufffd206z","kf37":"\ufffd207z","kf38":"\ufffd208z","kf39":"\ufffd209z","kf40":"\ufffd210z","kf41":"\ufffd211z","kf42":"\ufffd212z","kf43":"\ufffd213z","kf44":"\ufffd214z","kf45":"\ufffd200z","kf46":"\ufffd301z","kf47":"\ufffd302z","kf48":"\ufffd303z","kf49":"\ufffd304z","kf50":"\ufffd305z","kf51":"\ufffd306z","kf52":"\ufffd307z","kf53":"\ufffd308z","kf54":"\ufffd309z","kf55":"\ufffd310z","kf56":"\ufffd311z","kf57":"\ufffd312z","kf58":"\ufffd313z","kf59":"\ufffd314z","kf60":"\ufffd300z","khome":"\ufffdH","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kclr":"\ufffd2J","kprt":"\ufffdi","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001b)6\u000e","rmacs":"\u001b)4\u000f"} -{"name":"d412-dg","aliases":["d412+dg","d413-dg","d462+dg","d462-dg","d462e-dg","d463-dg"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001eFQ2","civis":"\u001eFQ0","sgr0":"\u000f\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d412-unix","aliases":["d412+","d462+","d462-unix"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d412-unix-25","aliases":["d412+25","d462+25","d462-unix-25"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d412-unix-s","aliases":["d412+s","d462+s","d462-unix-s"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFG\u001ePH","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d412-unix-sr","aliases":["d412+sr","d462+sr","d462-unix-sr"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d412-unix-w","aliases":["d412+w","d462+w","d462-unix-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d413-unix","aliases":["d463-unix"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d413-unix-25","aliases":["d463-unix-25"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d413-unix-s","aliases":["d463-unix-s"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFG\u001ePH","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d413-unix-sr","aliases":["d463-unix-sr"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d413-unix-w","aliases":["d463-unix-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d414-unix","aliases":["d464-unix"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d414-unix-25","aliases":["d464-unix-25"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d414-unix-s","aliases":["d464-unix-s"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFG\u001ePH","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d414-unix-sr","aliases":["d464-unix-sr"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d414-unix-w","aliases":["d464-unix-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d430c-dg","aliases":["d430-dg"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u000c","cnorm":"\u001eFQ2","civis":"\u001eFQ0","sgr0":"\u000f\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","setaf":"\u001eA%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","setbg":"\u001eB%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d430c-dg-ccc","aliases":["d430-dg-ccc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001eFQ2","civis":"\u001eFQ0","sgr0":"\u000f\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d430c-unix","aliases":["d430-unix"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","setaf":"\u001eA%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","setbg":"\u001eB%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d430c-unix-25","aliases":["d430-unix-25"],"cols":80,"lines":25,"colors":16,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","setaf":"\u001eA%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","setbg":"\u001eB%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d430c-unix-25-ccc","aliases":["d430-unix-25-ccc"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d430c-unix-ccc","aliases":["d430-unix-ccc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d430c-unix-s","aliases":["d430-unix-s"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001eFG\u001ePH","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","setaf":"\u001eA%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","setbg":"\u001eB%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d430c-unix-s-ccc","aliases":["d430-unix-s-ccc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFG\u001ePH","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d430c-unix-sr","aliases":["d430-unix-sr"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","setaf":"\u001eA%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","setbg":"\u001eB%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d430c-unix-sr-ccc","aliases":["d430-unix-sr-ccc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d430c-unix-w","aliases":["d430-unix-w"],"cols":132,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","setaf":"\u001eA%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","setbg":"\u001eB%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d430c-unix-w-ccc","aliases":["d430-unix-w-ccc"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001eFE","cnorm":"\u001eFQ5","civis":"\u001eFQ0","sgr0":"\u001ePJ\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u001ePI","rev":"\u001eD","dim":"\u001c","cup":"\u001eFP%p2%2.2X%p1%2.2X","cub1":"\u001ePD","cuu1":"\u001ePA","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u001ePF","kcuu1":"\u001ePA","kcud1":"\u001ePB","kcub1":"\u001ePD","kcuf1":"\u001ePC","kclr":"\u001ePH","kprt":"\u001eP0","acsc":"aj$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001ePc","kLFT":"\u001ePd","kHOM":"\u001ePf"} -{"name":"d470c","aliases":["d470"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u001b)4\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%e\u003c%p1%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%e=%p1%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\ufffd001z","kf2":"\ufffd002z","kf3":"\ufffd003z","kf4":"\ufffd004z","kf5":"\ufffd005z","kf6":"\ufffd006z","kf7":"\ufffd007z","kf8":"\ufffd008z","kf9":"\ufffd009z","kf10":"\ufffd010z","kf11":"\ufffd011z","kf12":"\ufffd012z","kf13":"\ufffd013z","kf14":"\ufffd014z","kf15":"\ufffd000z","kf16":"\ufffd101z","kf17":"\ufffd102z","kf18":"\ufffd103z","kf19":"\ufffd104z","kf20":"\ufffd105z","kf21":"\ufffd106z","kf22":"\ufffd107z","kf23":"\ufffd108z","kf24":"\ufffd109z","kf25":"\ufffd110z","kf26":"\ufffd111z","kf27":"\ufffd112z","kf28":"\ufffd113z","kf29":"\ufffd114z","kf30":"\ufffd100z","kf31":"\ufffd201z","kf32":"\ufffd202z","kf33":"\ufffd203z","kf34":"\ufffd204z","kf35":"\ufffd205z","kf36":"\ufffd206z","kf37":"\ufffd207z","kf38":"\ufffd208z","kf39":"\ufffd209z","kf40":"\ufffd210z","kf41":"\ufffd211z","kf42":"\ufffd212z","kf43":"\ufffd213z","kf44":"\ufffd214z","kf45":"\ufffd200z","kf46":"\ufffd301z","kf47":"\ufffd302z","kf48":"\ufffd303z","kf49":"\ufffd304z","kf50":"\ufffd305z","kf51":"\ufffd306z","kf52":"\ufffd307z","kf53":"\ufffd308z","kf54":"\ufffd309z","kf55":"\ufffd310z","kf56":"\ufffd311z","kf57":"\ufffd312z","kf58":"\ufffd313z","kf59":"\ufffd314z","kf60":"\ufffd300z","khome":"\ufffdH","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kclr":"\ufffd2J","kprt":"\ufffdi","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001b)6\u000e","rmacs":"\u001b)4\u000f","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%e\u003c%p1%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;;%?%p2%{8}%\u003c%t4%p2%e=%p2%{2}%\u0026%?%p2%{1}%\u0026%t%{4}%|%;%?%p2%{4}%\u0026%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m"} -{"name":"d470c-7b","aliases":["d470-7b"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%e\u003c%p1%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%e=%p1%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)6","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%e\u003c%p1%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;;%?%p2%{8}%\u003c%t4%p2%e=%p2%{2}%\u0026%?%p2%{1}%\u0026%t%{4}%|%;%?%p2%{4}%\u0026%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m"} -{"name":"d470c-dg","aliases":["d470-dg"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u000c","cnorm":"\u001eFQ2","civis":"\u001eFQ0","sgr0":"\u000f\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","setaf":"\u001eA%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","setbg":"\u001eB%p1%?%p1%{8}%\u003c%t%{2}%\u0026%?%p1%{1}%\u0026%t%{4}%|%;%?%p1%{4}%\u0026%t%{1}%|%;%;%'0'%+%c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d555","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u001b)4\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\ufffd001z","kf2":"\ufffd002z","kf3":"\ufffd003z","kf4":"\ufffd004z","kf5":"\ufffd005z","kf6":"\ufffd006z","kf7":"\ufffd007z","kf8":"\ufffd008z","kf9":"\ufffd009z","kf10":"\ufffd010z","kf11":"\ufffd011z","kf12":"\ufffd012z","kf13":"\ufffd013z","kf14":"\ufffd014z","kf15":"\ufffd000z","kf16":"\ufffd101z","kf17":"\ufffd102z","kf18":"\ufffd103z","kf19":"\ufffd104z","kf20":"\ufffd105z","kf21":"\ufffd106z","kf22":"\ufffd107z","kf23":"\ufffd108z","kf24":"\ufffd109z","kf25":"\ufffd110z","kf26":"\ufffd111z","kf27":"\ufffd112z","kf28":"\ufffd113z","kf29":"\ufffd114z","kf30":"\ufffd100z","kf31":"\ufffd201z","kf32":"\ufffd202z","kf33":"\ufffd203z","kf34":"\ufffd204z","kf35":"\ufffd205z","kf36":"\ufffd206z","kf37":"\ufffd207z","kf38":"\ufffd208z","kf39":"\ufffd209z","kf40":"\ufffd210z","kf41":"\ufffd211z","kf42":"\ufffd212z","kf43":"\ufffd213z","kf44":"\ufffd214z","kf45":"\ufffd200z","kf46":"\ufffd301z","kf47":"\ufffd302z","kf48":"\ufffd303z","kf49":"\ufffd304z","kf50":"\ufffd305z","kf51":"\ufffd306z","kf52":"\ufffd307z","kf53":"\ufffd308z","kf54":"\ufffd309z","kf55":"\ufffd310z","kf56":"\ufffd311z","kf57":"\ufffd312z","kf58":"\ufffd313z","kf59":"\ufffd314z","kf60":"\ufffd300z","khome":"\ufffdH","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kclr":"\ufffd2J","kprt":"\ufffdi","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001b)6\u000e","rmacs":"\u001b)4\u000f"} -{"name":"d555-7b","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)6"} -{"name":"d555-7b-w","cols":126,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)6"} -{"name":"d555-dg","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001eFQ2","civis":"\u001eFQ0","sgr0":"\u000f\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d555-w","cols":126,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u001b)4\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\ufffd001z","kf2":"\ufffd002z","kf3":"\ufffd003z","kf4":"\ufffd004z","kf5":"\ufffd005z","kf6":"\ufffd006z","kf7":"\ufffd007z","kf8":"\ufffd008z","kf9":"\ufffd009z","kf10":"\ufffd010z","kf11":"\ufffd011z","kf12":"\ufffd012z","kf13":"\ufffd013z","kf14":"\ufffd014z","kf15":"\ufffd000z","kf16":"\ufffd101z","kf17":"\ufffd102z","kf18":"\ufffd103z","kf19":"\ufffd104z","kf20":"\ufffd105z","kf21":"\ufffd106z","kf22":"\ufffd107z","kf23":"\ufffd108z","kf24":"\ufffd109z","kf25":"\ufffd110z","kf26":"\ufffd111z","kf27":"\ufffd112z","kf28":"\ufffd113z","kf29":"\ufffd114z","kf30":"\ufffd100z","kf31":"\ufffd201z","kf32":"\ufffd202z","kf33":"\ufffd203z","kf34":"\ufffd204z","kf35":"\ufffd205z","kf36":"\ufffd206z","kf37":"\ufffd207z","kf38":"\ufffd208z","kf39":"\ufffd209z","kf40":"\ufffd210z","kf41":"\ufffd211z","kf42":"\ufffd212z","kf43":"\ufffd213z","kf44":"\ufffd214z","kf45":"\ufffd200z","kf46":"\ufffd301z","kf47":"\ufffd302z","kf48":"\ufffd303z","kf49":"\ufffd304z","kf50":"\ufffd305z","kf51":"\ufffd306z","kf52":"\ufffd307z","kf53":"\ufffd308z","kf54":"\ufffd309z","kf55":"\ufffd310z","kf56":"\ufffd311z","kf57":"\ufffd312z","kf58":"\ufffd313z","kf59":"\ufffd314z","kf60":"\ufffd300z","khome":"\ufffdH","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kclr":"\ufffd2J","kprt":"\ufffdi","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001b)6\u000e","rmacs":"\u001b)4\u000f"} -{"name":"d577","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u001b)4\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\ufffd001z","kf2":"\ufffd002z","kf3":"\ufffd003z","kf4":"\ufffd004z","kf5":"\ufffd005z","kf6":"\ufffd006z","kf7":"\ufffd007z","kf8":"\ufffd008z","kf9":"\ufffd009z","kf10":"\ufffd010z","kf11":"\ufffd011z","kf12":"\ufffd012z","kf13":"\ufffd013z","kf14":"\ufffd014z","kf15":"\ufffd000z","kf16":"\ufffd101z","kf17":"\ufffd102z","kf18":"\ufffd103z","kf19":"\ufffd104z","kf20":"\ufffd105z","kf21":"\ufffd106z","kf22":"\ufffd107z","kf23":"\ufffd108z","kf24":"\ufffd109z","kf25":"\ufffd110z","kf26":"\ufffd111z","kf27":"\ufffd112z","kf28":"\ufffd113z","kf29":"\ufffd114z","kf30":"\ufffd100z","kf31":"\ufffd201z","kf32":"\ufffd202z","kf33":"\ufffd203z","kf34":"\ufffd204z","kf35":"\ufffd205z","kf36":"\ufffd206z","kf37":"\ufffd207z","kf38":"\ufffd208z","kf39":"\ufffd209z","kf40":"\ufffd210z","kf41":"\ufffd211z","kf42":"\ufffd212z","kf43":"\ufffd213z","kf44":"\ufffd214z","kf45":"\ufffd200z","kf46":"\ufffd301z","kf47":"\ufffd302z","kf48":"\ufffd303z","kf49":"\ufffd304z","kf50":"\ufffd305z","kf51":"\ufffd306z","kf52":"\ufffd307z","kf53":"\ufffd308z","kf54":"\ufffd309z","kf55":"\ufffd310z","kf56":"\ufffd311z","kf57":"\ufffd312z","kf58":"\ufffd313z","kf59":"\ufffd314z","kf60":"\ufffd300z","khome":"\ufffdH","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kclr":"\ufffd2J","kprt":"\ufffdi","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001b)6\u000e","rmacs":"\u001b)4\u000f"} -{"name":"d577-7b","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)6"} -{"name":"d577-7b-w","cols":126,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)6"} -{"name":"d577-dg","aliases":["d578-dg"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001eFQ2","civis":"\u001eFQ0","sgr0":"\u000f\u0015\u001d\u001eE\u001eFS00","smul":"\u0014","bold":"\u001eD\u0014","blink":"\u000e","rev":"\u001eD","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001e|","kf13":"\u001e}","kf14":"\u001e~","kf15":"\u001ep","kf16":"\u001ea","kf17":"\u001eb","kf18":"\u001ec","kf19":"\u001ed","kf20":"\u001ee","kf21":"\u001ef","kf22":"\u001eg","kf23":"\u001eh","kf24":"\u001ei","kf25":"\u001ej","kf26":"\u001ek","kf27":"\u001el","kf28":"\u001em","kf29":"\u001en","kf30":"\u001e`","kf31":"\u001e1","kf32":"\u001e2","kf33":"\u001e3","kf34":"\u001e4","kf35":"\u001e5","kf36":"\u001e6","kf37":"\u001e7","kf38":"\u001e8","kf39":"\u001e9","kf40":"\u001e:","kf41":"\u001e;","kf42":"\u001e\u003c","kf43":"\u001e=","kf44":"\u001e\u003e","kf45":"\u001e0","kf46":"\u001e!","kf47":"\u001e\"","kf48":"\u001e#","kf49":"\u001e$","kf50":"\u001e%%","kf51":"\u001e\u0026","kf52":"\u001e'","kf53":"\u001e(","kf54":"\u001e)","kf55":"\u001e*","kf56":"\u001e+","kf57":"\u001e,","kf58":"\u001e-","kf59":"\u001e.","kf60":"\u001e ","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001eFS11","rmacs":"\u001eFS00","kRIT":"\u001e\u0018","kLFT":"\u001e\u0019","kHOM":"\u001e\u0008"} -{"name":"d577-w","cols":126,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u001b)4\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\ufffd001z","kf2":"\ufffd002z","kf3":"\ufffd003z","kf4":"\ufffd004z","kf5":"\ufffd005z","kf6":"\ufffd006z","kf7":"\ufffd007z","kf8":"\ufffd008z","kf9":"\ufffd009z","kf10":"\ufffd010z","kf11":"\ufffd011z","kf12":"\ufffd012z","kf13":"\ufffd013z","kf14":"\ufffd014z","kf15":"\ufffd000z","kf16":"\ufffd101z","kf17":"\ufffd102z","kf18":"\ufffd103z","kf19":"\ufffd104z","kf20":"\ufffd105z","kf21":"\ufffd106z","kf22":"\ufffd107z","kf23":"\ufffd108z","kf24":"\ufffd109z","kf25":"\ufffd110z","kf26":"\ufffd111z","kf27":"\ufffd112z","kf28":"\ufffd113z","kf29":"\ufffd114z","kf30":"\ufffd100z","kf31":"\ufffd201z","kf32":"\ufffd202z","kf33":"\ufffd203z","kf34":"\ufffd204z","kf35":"\ufffd205z","kf36":"\ufffd206z","kf37":"\ufffd207z","kf38":"\ufffd208z","kf39":"\ufffd209z","kf40":"\ufffd210z","kf41":"\ufffd211z","kf42":"\ufffd212z","kf43":"\ufffd213z","kf44":"\ufffd214z","kf45":"\ufffd200z","kf46":"\ufffd301z","kf47":"\ufffd302z","kf48":"\ufffd303z","kf49":"\ufffd304z","kf50":"\ufffd305z","kf51":"\ufffd306z","kf52":"\ufffd307z","kf53":"\ufffd308z","kf54":"\ufffd309z","kf55":"\ufffd310z","kf56":"\ufffd311z","kf57":"\ufffd312z","kf58":"\ufffd313z","kf59":"\ufffd314z","kf60":"\ufffd300z","khome":"\ufffdH","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kclr":"\ufffd2J","kprt":"\ufffdi","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001b)6\u000e","rmacs":"\u001b)4\u000f"} -{"name":"d578","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u001b)4\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\ufffd001z","kf2":"\ufffd002z","kf3":"\ufffd003z","kf4":"\ufffd004z","kf5":"\ufffd005z","kf6":"\ufffd006z","kf7":"\ufffd007z","kf8":"\ufffd008z","kf9":"\ufffd009z","kf10":"\ufffd010z","kf11":"\ufffd011z","kf12":"\ufffd012z","kf13":"\ufffd013z","kf14":"\ufffd014z","kf15":"\ufffd000z","kf16":"\ufffd101z","kf17":"\ufffd102z","kf18":"\ufffd103z","kf19":"\ufffd104z","kf20":"\ufffd105z","kf21":"\ufffd106z","kf22":"\ufffd107z","kf23":"\ufffd108z","kf24":"\ufffd109z","kf25":"\ufffd110z","kf26":"\ufffd111z","kf27":"\ufffd112z","kf28":"\ufffd113z","kf29":"\ufffd114z","kf30":"\ufffd100z","kf31":"\ufffd201z","kf32":"\ufffd202z","kf33":"\ufffd203z","kf34":"\ufffd204z","kf35":"\ufffd205z","kf36":"\ufffd206z","kf37":"\ufffd207z","kf38":"\ufffd208z","kf39":"\ufffd209z","kf40":"\ufffd210z","kf41":"\ufffd211z","kf42":"\ufffd212z","kf43":"\ufffd213z","kf44":"\ufffd214z","kf45":"\ufffd200z","kf46":"\ufffd301z","kf47":"\ufffd302z","kf48":"\ufffd303z","kf49":"\ufffd304z","kf50":"\ufffd305z","kf51":"\ufffd306z","kf52":"\ufffd307z","kf53":"\ufffd308z","kf54":"\ufffd309z","kf55":"\ufffd310z","kf56":"\ufffd311z","kf57":"\ufffd312z","kf58":"\ufffd313z","kf59":"\ufffd314z","kf60":"\ufffd300z","khome":"\ufffdH","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kclr":"\ufffd2J","kprt":"\ufffdi","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u001b)6\u000e","rmacs":"\u001b)4\u000f"} -{"name":"d578-7b","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[3;2v","civis":"\u001b[3;0v","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[4;7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[001z","kf2":"\u001b[002z","kf3":"\u001b[003z","kf4":"\u001b[004z","kf5":"\u001b[005z","kf6":"\u001b[006z","kf7":"\u001b[007z","kf8":"\u001b[008z","kf9":"\u001b[009z","kf10":"\u001b[010z","kf11":"\u001b[011z","kf12":"\u001b[012z","kf13":"\u001b[013z","kf14":"\u001b[014z","kf15":"\u001b[000z","kf16":"\u001b[101z","kf17":"\u001b[102z","kf18":"\u001b[103z","kf19":"\u001b[104z","kf20":"\u001b[105z","kf21":"\u001b[106z","kf22":"\u001b[107z","kf23":"\u001b[108z","kf24":"\u001b[109z","kf25":"\u001b[110z","kf26":"\u001b[111z","kf27":"\u001b[112z","kf28":"\u001b[113z","kf29":"\u001b[114z","kf30":"\u001b[100z","kf31":"\u001b[201z","kf32":"\u001b[202z","kf33":"\u001b[203z","kf34":"\u001b[204z","kf35":"\u001b[205z","kf36":"\u001b[206z","kf37":"\u001b[207z","kf38":"\u001b[208z","kf39":"\u001b[209z","kf40":"\u001b[210z","kf41":"\u001b[211z","kf42":"\u001b[212z","kf43":"\u001b[213z","kf44":"\u001b[214z","kf45":"\u001b[200z","kf46":"\u001b[301z","kf47":"\u001b[302z","kf48":"\u001b[303z","kf49":"\u001b[304z","kf50":"\u001b[305z","kf51":"\u001b[306z","kf52":"\u001b[307z","kf53":"\u001b[308z","kf54":"\u001b[309z","kf55":"\u001b[310z","kf56":"\u001b[311z","kf57":"\u001b[312z","kf58":"\u001b[313z","kf59":"\u001b[314z","kf60":"\u001b[300z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","kprt":"\u001b[i","acsc":"j$k\"l!m#n)q+t'u\u0026v(w%x*","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)6"} -{"name":"d800","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[1;1H\u001b[2J","cnorm":"\u001b[\u003e12h","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~","smacs":"\u001b[1m","rmacs":"\u001b[m"} -{"name":"ddr","aliases":["ddr3180","rebus3180"],"cols":80,"lines":24,"clear":"\u001b[H\u001b[2J$\u003c50/\u003e","sgr0":"\u001b[m$\u003c2/\u003e","smul":"\u001b[4m$\u003c2/\u003e","bold":"\u001b[1m$\u003c2/\u003e","blink":"\u001b[5m$\u003c2/\u003e","rev":"\u001b[7m$\u003c2/\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5/\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2/\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"dec-vt100","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"dec-vt220","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0"} -{"name":"decansi","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"delta","aliases":["dd5000"],"cols":80,"lines":27,"bell":"\u0007","clear":"\u000eR","cup":"\u000f%p1%p1%{16}%m%{2}%*%-%'9'%+%c%p2%p2%{16}%m%{2}%*%-%'9'%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000"} -{"name":"dg-generic","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u000f\u0015\u001d","smul":"\u0014","blink":"\u000e","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001ea","kf13":"\u001eb","kf14":"\u001ec","kf15":"\u001ed","kf16":"\u001ee","kf17":"\u001ef","kf18":"\u001eg","kf19":"\u001eh","kf20":"\u001ei","kf21":"\u001ej","kf22":"\u001ek","kf23":"\u001e1","kf24":"\u001e2","kf25":"\u001e3","kf26":"\u001e4","kf27":"\u001e5","kf28":"\u001e6","kf29":"\u001e7","kf30":"\u001e8","kf31":"\u001e9","kf32":"\u001e:","kf33":"\u001e;","kf34":"\u001e!","kf35":"\u001e\"","kf36":"\u001e#","kf37":"\u001e$","kf38":"\u001e%%","kf39":"\u001e\u0026","kf40":"\u001e'","kf41":"\u001e(","kf42":"\u001e)","kf43":"\u001e*","kf44":"\u001e+","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c"} -{"name":"dg200","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","smul":"\u0014","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018"} -{"name":"dg210","aliases":["dg-ansi"],"cols":80,"lines":24,"clear":"\u001b[2J","smul":"\u001b[4;m","cup":"\u001b[%i%p1%d;%p2%dH","cuu1":"\u001b[A","pad":"\u0000","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"dg211","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","smcup":"\u000c\u0012","rmcup":"\u000c","cnorm":"\u000c","smul":"\u0014","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kbs":"\u0019","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018"} -{"name":"dg450","aliases":["dg6134"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","smul":"\u0014","cup":"\u0010%p2%c%p1%c","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018"} -{"name":"dg460-ansi","cols":80,"lines":24,"clear":"\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%2d;%p2%2dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u001b[D","kf1":"\u001b[002z","kf2":"\u001b[003z","kf3":"\u001b[004z","kf4":"\u001b[005z","kf5":"\u001b[006z","kf6":"\u001b[007z","kf7":"\u001b[008z","kf8":"\u001b[009z","kf9":"\u001b[010z","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"dg6053","aliases":["6053","6053-dg","605x","605x-dg","d2","d2-dg","dg605x"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u000f\u0015\u001d","smul":"\u0014","blink":"\u000e","dim":"\u001c","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kf1":"\u001eq","kf2":"\u001er","kf3":"\u001es","kf4":"\u001et","kf5":"\u001eu","kf6":"\u001ev","kf7":"\u001ew","kf8":"\u001ex","kf9":"\u001ey","kf10":"\u001ez","kf11":"\u001e{","kf12":"\u001ea","kf13":"\u001eb","kf14":"\u001ec","kf15":"\u001ed","kf16":"\u001ee","kf17":"\u001ef","kf18":"\u001eg","kf19":"\u001eh","kf20":"\u001ei","kf21":"\u001ej","kf22":"\u001ek","kf23":"\u001e1","kf24":"\u001e2","kf25":"\u001e3","kf26":"\u001e4","kf27":"\u001e5","kf28":"\u001e6","kf29":"\u001e7","kf30":"\u001e8","kf31":"\u001e9","kf32":"\u001e:","kf33":"\u001e;","kf34":"\u001e!","kf35":"\u001e\"","kf36":"\u001e#","kf37":"\u001e$","kf38":"\u001e%%","kf39":"\u001e\u0026","kf40":"\u001e'","kf41":"\u001e(","kf42":"\u001e)","kf43":"\u001e*","kf44":"\u001e+","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018","kclr":"\u000c"} -{"name":"dg6053-old","aliases":["dg100"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","smcup":"\u000c\u0012","rmcup":"\u000c","cnorm":"\u000c","smul":"\u0014","cup":"\u0010%p2%c%p1%c","cub1":"\u0019","cuu1":"\u0017","pad":"\u0000","kbs":"\u0019","kf1":"\u001er","kf2":"\u001es","kf3":"\u001et","kf4":"\u001eu","kf5":"\u001ev","kf6":"\u001ew","kf7":"\u001ex","kf8":"\u001ey","kf9":"\u001ez","khome":"\u0008","kcuu1":"\u0017","kcud1":"\u001a","kcub1":"\u0019","kcuf1":"\u0018"} -{"name":"djgpp","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[v","civis":"\u001b[1v","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"djgpp204","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[v","civis":"\u001b[1v","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"dku7003","cols":80,"lines":25,"clear":"\u001d\u001f","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[7m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0019","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u001d","kcuu1":"\u001a","kcud1":"\u000b","kcub1":"\u0019","kcuf1":"\u0018"} -{"name":"dku7003-dumb","cols":80,"lines":25,"clear":"\u001d\u001f","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0019","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u001d","kcuu1":"\u001a","kcud1":"\u000b","kcub1":"\u0019","kcuf1":"\u0018"} -{"name":"dku7202","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[?\u003eh\u001bPY99:98\u001b\\","rmcup":"\u001b[0;98v\u001b[2J\u001b[v","cnorm":"\u001b[r","civis":"\u001b[1r","sgr0":"\u001b[m\u000f","smul":"\u001b[0;2m","blink":"\u001b[0;2;4m","rev":"\u001b[0;7m","dim":"\u001b[0;5m","cup":"\u001b[%i%p1%d;%p2%df","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[1u\u0017","kf2":"\u001b[2u\u0017","kf3":"\u001b[3u\u0017","kf4":"\u001b[4u\u0017","kf5":"\u001b[5u\u0017","kf6":"\u001b[6u\u0017","kf7":"\u001b[7u\u0017","kf8":"\u001b[8u\u0017","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggj)k,l\u0026m#n/ooppq*rrsst'u-v+w.x%yyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"dm1520","aliases":["dm1521"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001f","pad":"\u0000","khome":"\u0019","kcuu1":"\u001f","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001c"} -{"name":"dm2500","aliases":["datamedia2500"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001e\u001e","cup":"\u000c%p2%'`'%^%c%p1%'`'%^%c","cub1":"\u0008","cuu1":"\u001a","pad":"\ufffd"} -{"name":"dm3025","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bM$\u003c2\u003e","cup":"\u001bY%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000"} -{"name":"dm3045","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bM$\u003c2\u003e","cup":"\u001bY%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kf9":"\u001bx\r","khome":"\u001bH","kcuu1":"\u001bA","kcuf1":"\u001bC"} -{"name":"dm80","aliases":["dmdt80","dt80"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"dm80w","aliases":["dmdt80w","dt80w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50/\u003e","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5/\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c5/\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"dmchat","cols":80,"lines":24,"bell":"\u0007","clear":"\u001e\u001e","cup":"\u000c%p2%'`'%^%c%p1%'`'%^%c","cub1":"\u0008","cuu1":"\u001a","pad":"\ufffd"} -{"name":"dmterm","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bj","cnorm":"\u001bG6","civis":"\u001bG5","sgr0":"\u001bG0","rev":"\u001bG4","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\u001b2","kf2":"\u001b3","kf3":"\u001b4","kf4":"\u001b5","kf5":"\u001b6","kf6":"\u001b7","kf7":"\u001b8","kf8":"\u001b9","kf9":"\u001b0","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"dp8242","cols":80,"lines":25,"bell":"\u0007","clear":"\u0015\u001b\u0004\u0017\u0018","cnorm":"\u0018","civis":"\u0019","smul":"\u001b\u0006","cup":"\t%p2%'\ufffd'%+%c%p1%'\ufffd'%+%c","cub1":"\u0008","pad":"\u0000","kbs":"\u0008","kf1":"\u0007\u001be","kf2":"\t\u001bd","kf3":"\n\u001bc","kf4":"\n\u001bb","kf5":"\u0013\u001ba","kf6":"\u001bO\u001be","kf7":"\u001bN\u001bd","kf8":"\u001bM\u001bc","kf9":"\u001bL\u001bb","kf10":"\u001bK\u001ba","kcuu1":"\u0005","kcud1":"\u0002","kcub1":"\u0004","kcuf1":"\u0006"} -{"name":"dt100","aliases":["dt-100"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u0008\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[?3i","kf2":"\u001b[2i","kf3":"\u001b[@","kf4":"\u001b[M","kf5":"\u001b[17~","kf6":"\u001b[18~","kf7":"\u001b[19~","kf8":"\u001b[20~","kf9":"\u001b[21~","kf10":"\u001b[?5i","khome":"\u001b[H","kpp":"\u001b[28~","knp":"\u001b[29~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"jjkkllmmnnqqttuuvvwwxx","smacs":"\u000e","rmacs":"\u000f"} -{"name":"dt100w","aliases":["dt-100w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u0008\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[?3i","kf2":"\u001b[2i","kf3":"\u001b[@","kf4":"\u001b[M","kf5":"\u001b[17~","kf6":"\u001b[18~","kf7":"\u001b[19~","kf8":"\u001b[20~","kf9":"\u001b[21~","kf10":"\u001b[?5i","khome":"\u001b[H","kpp":"\u001b[28~","knp":"\u001b[29~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"jjkkllmmnnqqttuuvvwwxx","smacs":"\u000e","rmacs":"\u000f"} -{"name":"dt110","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u0008\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[0A","pad":"\u0000","kf1":"\u001b[1~","kf2":"\u001b[2~","kf3":"\u001b[3~","kf4":"\u001b[4~","kf5":"\u001b[5~","kf6":"\u001b[6~","kf7":"\u001b[7~","kf8":"\u001b[8~","kf9":"\u001b[9~","kf10":"\u001b[10~","kich":"\u001b[@","khome":"\u001b[G","kend":"\u001b[K","kpp":"\u001b[25~","knp":"\u001b[26~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"jjkkllmmnnqqttuuvvwwxx","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"dt80-sas","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u0018","rev":"\u001b$2\u0004","cup":"\u001b=%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001f","pad":"\u0000","khome":"\u0019","kcuu1":"\u001f","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001c","kclr":"\u000c","acsc":"``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"dtc382","cols":80,"lines":24,"bell":"\u0007","clear":"\u0010\u001d$\u003c20\u003e","smcup":"\u0010\u001d$\u003c20\u003e","cnorm":"\u0010b","smul":"\u0010 \u0010","cup":"\u0010\u0011%p2%c%p1%c","cub1":"\u0008","cuu1":"\u0010\u000c","pad":""} -{"name":"dtterm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"dwk","aliases":["dwk-vt"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001bX","rev":"\u001bT","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"","kf1":"\u001bf1","kf2":"\u001bf2","kf3":"\u001bf3","kf4":"\u001bf4","kf5":"\u001bf5","kf6":"\u001bf6","kf7":"\u001bf7","kf8":"\u001bf8","kf9":"\u001bf9","kf10":"\u001bf0","kich":"\u001bd","kdch":"\u001be","kpp":"\u001bg","knp":"\u001bh","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"+^,Q-S.M0`+a:f'g#h#i#jXkClJmFnNo~qUs_tEuPv\\wKxW~_","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"elks","cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"elks-ansi","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"elks-vt52","cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"emu","cols":80,"lines":24,"colors":15,"bell":"\u0007","clear":"\u001bP\u001bE0;0;","cnorm":"\u001ba","civis":"\u001bZ","sgr0":"\u001bS","smul":"\u001bV","bold":"\u001bU","blink":"\u001bW","rev":"\u001bT","setaf":"\u001br%i%p1%d;","setbg":"\u001bs%i%p1%d;","cup":"\u001bE%p1%d;%p2%d;","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF01","kf2":"\u001bF02","kf3":"\u001bF03","kf4":"\u001bF04","kf5":"\u001bF05","kf6":"\u001bF06","kf7":"\u001bF07","kf8":"\u001bF08","kf9":"\u001bF09","kf10":"\u001bF10","kf11":"\u001bF11","kf12":"\u001bF12","kf13":"\u001bF13","kf14":"\u001bF14","kf15":"\u001bF15","kf16":"\u001bF16","kf17":"\u001bF17","kf18":"\u001bF18","kf19":"\u001bF19","kf20":"\u001bF20","kich":"\u001bins","kdch":"","kpp":"\u001bprior","knp":"\u001bnext","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bC","kcuf1":"\u001bD","acsc":"61a\ufffdf\ufffdg2j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdq\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd~\ufffd"} -{"name":"emu-220","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","smcup":"\u001b[?1l\u001b=","rmcup":"\u001b\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[0;4m","bold":"\u001b[0;1m","blink":"\u001b[0;5m","rev":"\u001b[0;7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[1D","cuu1":"\u001b[1A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOq","kf2":"\u001bOr","kf3":"\u001bOs","kf4":"\u001bOt","kf5":"\u001bOu","kf6":"\u001bOv","kf7":"\u001bOw","kf8":"\u001bOx","kf9":"\u001bOy","kf10":"\u001bOl","kf11":"\u001bOm","kf12":"\u001bOn","kf13":"\u001bOP","kf14":"\u001bOQ","kf15":"\u001bOR","kf16":"\u001bOS","kf26":"\u001b[17~","kf27":"\u001b[18~","kf28":"\u001b[19~","kf29":"\u001b[20~","kf30":"\u001b[21~","kf34":"\u001b[26~","kf37":"\u001b[31~","kf38":"\u001b[32~","kf39":"\u001b[33~","kf40":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"emx-base","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[2J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd;","kf2":"\ufffd\u003c","kf3":"\ufffd=","kf4":"\ufffd\u003e","kf5":"\ufffd?","kf6":"\ufffd@","kf7":"\ufffdA","kf8":"\ufffdB","kf9":"\ufffdC","kf10":"\ufffdD","kf11":"\ufffd\ufffd","kf12":"\ufffd\ufffd","kf13":"\ufffdT","kf14":"\ufffdU","kf15":"\ufffdV","kf16":"\ufffdW","kf17":"\ufffdX","kf18":"\ufffdY","kf19":"\ufffdZ","kf20":"\ufffd[","kf21":"\ufffd\\","kf22":"\ufffd]","kf23":"\ufffd\ufffd","kf24":"\ufffd\ufffd","kf25":"\ufffd^","kf26":"\ufffd_","kf27":"\ufffd`","kf28":"\ufffda","kf29":"\ufffdb","kf30":"\ufffdc","kf31":"\ufffdd","kf32":"\ufffde","kf33":"\ufffdf","kf34":"\ufffdg","kf35":"\ufffd\ufffd","kf36":"\ufffd\ufffd","kf37":"\ufffdh","kf38":"\ufffdi","kf39":"\ufffdj","kf40":"\ufffdk","kf41":"\ufffdl","kf42":"\ufffdm","kf43":"\ufffdn","kf44":"\ufffdo","kf45":"\ufffdp","kf46":"\ufffdq","kf47":"\ufffd\ufffd","kf48":"\ufffd\ufffd","kich":"\ufffdR","kdch":"\ufffdS","khome":"\ufffdG","kend":"\ufffdO","kpp":"\ufffdI","knp":"\ufffdQ","kcuu1":"\ufffdH","kcud1":"\ufffdP","kcub1":"\ufffdK","kcuf1":"\ufffdM","kcbt":"\ufffd\u000f","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"env230","aliases":["envision230"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"ergo4000","cols":80,"lines":66,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c80\u003e","sgr0":"\u001b[m$\u003c20\u003e","smkx":"\u001b=$\u003c4\u003e","rmkx":"\u001b=$\u003c4\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"esprit","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u001c","smkx":"\u001b\u003c","rmkx":"\u001b\u003e","cup":"\u001b\u0011%p2%c%p1%c","cub1":"\u0008","cuu1":"\u001b\u000c","pad":"\u0000","kbs":"\u0008","kf1":"\u00021\n","kf2":"\u00022\n","kf3":"\u00023\n","kf4":"\u00024\n","kf5":"\u00025\n","kf6":"\u00026\n","kf7":"\u00027\n","kf8":"\u00028\n","kf9":"\u00029\n","khome":"\u001b\u0012","kcuu1":"\u001b\u000c","kcud1":"\u001b\u000b","kcub1":"\u0008","kcuf1":"\u0010"} -{"name":"esprit-am","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u001c","smkx":"\u001b\u003c","rmkx":"\u001b\u003e","cup":"\u001b\u0011%p2%c%p1%c","cub1":"\u0008","cuu1":"\u001b\u000c","pad":"\u0000","kbs":"\u0008","kf1":"\u00021\n","kf2":"\u00022\n","kf3":"\u00023\n","kf4":"\u00024\n","kf5":"\u00025\n","kf6":"\u00026\n","kf7":"\u00027\n","kf8":"\u00028\n","kf9":"\u00029\n","khome":"\u001b\u0012","kcuu1":"\u001b\u000c","kcud1":"\u001b\u000b","kcub1":"\u0008","kcuf1":"\u0010"} -{"name":"eterm","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000"} -{"name":"ex155","cols":80,"lines":24,"clear":"\u001bX","smul":"\u001bf\u001bD","cup":"\u001bE%p1%' '%+%c%p2%' '%+%c","pad":"\u0000","kbs":"\u0008","khome":"\u001b@","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001b[","kclr":"\u001bX"} -{"name":"excel62","aliases":["excel64"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOu","kf6":"\u001bOv","kf7":"\u001bOw","kf8":"\u001bOx","kf9":"\u001bOy","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"excel62-rv","aliases":["excel64-rv"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOu","kf6":"\u001bOv","kf7":"\u001bOw","kf8":"\u001bOx","kf9":"\u001bOy","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"excel62-w","aliases":["excel64-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50/\u003e","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5/\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c5/\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOu","kf6":"\u001bOv","kf7":"\u001bOw","kf8":"\u001bOx","kf9":"\u001bOy","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"f100","aliases":["freedom","freedom100"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","smacs":"\u001b%%","rmacs":"\u001b$"} -{"name":"f100-rv","aliases":["freedom-rv"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","smacs":"\u001b%%","rmacs":"\u001b$"} -{"name":"f110","aliases":["freedom110"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.2","civis":"\u001b.1","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bG0","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bG@","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001e","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"f110-14","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.2","civis":"\u001b.1","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bG0","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bG@","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001e","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"f110-14w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.2","civis":"\u001b.1","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bG0","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bG@","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001e","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"f110-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.2","civis":"\u001b.1","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bG0","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bG@","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001e","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"f1720","aliases":["f1720a"],"cols":80,"lines":16,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kcuu1":"\u001c","kcud1":"\u001d","kcub1":"\u001f","kcuf1":"\u001e"} -{"name":"f200","aliases":["freedom200"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bG0","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bG@","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kclr":"\u001e","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"f200-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bG0","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bG@","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kclr":"\u001e","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"f200vi","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bG0","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bG@","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kclr":"\u001e","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"f200vi-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bG0","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bG@","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kclr":"\u001e","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"falco","aliases":["ts-1","ts1"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001bg0","smul":"\u001bg1","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"falco-p","aliases":["ts-1p","ts1p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","smcup":"\u001b_d","rmcup":"\u001b_b","sgr0":"\u001bg0","smul":"\u001bg1","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"fos","aliases":["fortune"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001b\\","civis":"\u001b]","sgr0":"\u001bI","smul":"\u001cHP","blink":"\u001bN","rev":"\u001bH","cup":"\u001cC%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b$\u003c3\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001a\r","kf2":"\u0001b\r","kf3":"\u0001c\r","kf4":"\u0001d\r","kf5":"\u0001e\r","kf6":"\u0001f\r","kf7":"\u0001g\r","kf8":"\u0001h\r","khome":"\u0001?\r","kend":"\u0001k\r","kpp":"\u0001n\r","knp":"\u0001o\r","kcuu1":"\u0001x\r","kcud1":"\u0001y\r","kcub1":"\u0001w\r","kcuf1":"\u0001z\r","acsc":"j*k(l m\"q\u0026v%w#x-","smacs":"\u001bo","rmacs":"\u000f"} -{"name":"fox","aliases":["pe1100"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ$\u003c132\u003e","cup":"\u001bX%p1%' '%+%c\u001bY%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000"} -{"name":"gator","cols":128,"lines":47,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"gator-52","cols":128,"lines":47,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"ffgghhompoqqss.k","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"gator-52t","cols":128,"lines":94,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"ffgghhompoqqss.k","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"gator-t","cols":128,"lines":94,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"gigi","aliases":["vk100"],"cols":84,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"gnome","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO1;2P","kf14":"\u001bO1;2Q","kf15":"\u001bO1;2R","kf16":"\u001bO1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO1;5P","kf26":"\u001bO1;5Q","kf27":"\u001bO1;5R","kf28":"\u001bO1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO1;6P","kf38":"\u001bO1;6Q","kf39":"\u001bO1;6R","kf40":"\u001bO1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO1;3P","kf50":"\u001bO1;3Q","kf51":"\u001bO1;3R","kf52":"\u001bO1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO1;4P","kf62":"\u001bO1;4Q","kf63":"\u001bO1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"gnome-2007","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO3P","kf50":"\u001bO3Q","kf51":"\u001bO3R","kf52":"\u001bO3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO4P","kf62":"\u001bO4Q","kf63":"\u001bO4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"gnome-2008","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO1;2P","kf14":"\u001bO1;2Q","kf15":"\u001bO1;2R","kf16":"\u001bO1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO1;5P","kf26":"\u001bO1;5Q","kf27":"\u001bO1;5R","kf28":"\u001bO1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO1;6P","kf38":"\u001bO1;6Q","kf39":"\u001bO1;6R","kf40":"\u001bO1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO1;3P","kf50":"\u001bO1;3Q","kf51":"\u001bO1;3R","kf52":"\u001bO1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO1;4P","kf62":"\u001bO1;4Q","kf63":"\u001bO1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"gnome-256color","cols":80,"lines":24,"colors":256,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO1;2P","kf14":"\u001bO1;2Q","kf15":"\u001bO1;2R","kf16":"\u001bO1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO1;5P","kf26":"\u001bO1;5Q","kf27":"\u001bO1;5R","kf28":"\u001bO1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO1;6P","kf38":"\u001bO1;6Q","kf39":"\u001bO1;6R","kf40":"\u001bO1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO1;3P","kf50":"\u001bO1;3Q","kf51":"\u001bO1;3R","kf52":"\u001bO1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO1;4P","kf62":"\u001bO1;4Q","kf63":"\u001bO1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"gnome-fc5","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO3P","kf50":"\u001bO3Q","kf51":"\u001bO3R","kf52":"\u001bO3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO4P","kf62":"\u001bO4Q","kf63":"\u001bO4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","kRIT":"\u001bO2C","kLFT":"\u001bO2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"gnome-rh62","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"gnome-rh72","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"gnome-rh80","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b\t","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"gnome-rh90","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO3P","kf50":"\u001bO3Q","kf51":"\u001bO3R","kf52":"\u001bO3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO4P","kf62":"\u001bO4Q","kf63":"\u001bO4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","kRIT":"\u001bO2C","kLFT":"\u001bO2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"go140","cols":80,"lines":24,"clear":"\u001b[H\u001b[2J$\u003c10/\u003e","sgr0":"\u001b[m","smul":"\u001b[4m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%2d;%p2%2dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"go140w","cols":132,"lines":24,"clear":"\u001b[H\u001b[2J$\u003c10/\u003e","sgr0":"\u001b[m","smul":"\u001b[4m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%2d;%p2%2dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"go225","aliases":["go-225"],"cols":80,"lines":25,"clear":"\u001b[H\u001b[J","smcup":"\u001b[2;0#w\u001b[1;25r","rmcup":"\u001b[!p\u001b[?7h\u001b[2;1;1#w","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"graphos","cols":80,"lines":24,"clear":"\u001b[H\u001b[2J","cnorm":"\u001bz56;2;0;0z\u001bz73z\u001bz4;1;1z","sgr0":"\u001b[m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"graphos-30","cols":80,"lines":30,"clear":"\u001b[H\u001b[2J","cnorm":"\u001bz56;2;0;0z\u001bz73z\u001bz4;1;1z","sgr0":"\u001b[m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"gs6300","aliases":["emots"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b[10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[0s","kf2":"\u001b[24s","kf3":"\u001b[1s","kf4":"\u001b[23s","kf5":"\u001b[2s","kf6":"\u001b[22s","kf7":"\u001b[3s","kf8":"\u001b[21s","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u0012\t","acsc":"++,,--..``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"guru","aliases":["guru+unk","guru-33"],"cols":80,"lines":33,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[33p","rmcup":"\u001b[255p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-24","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[24p","rmcup":"\u001b[255p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-44","cols":97,"lines":44,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[44p","rmcup":"\u001b[255p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-44-s","cols":80,"lines":43,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[44;1p\u001b[255;1H\u001b[K","rmcup":"\u001b[255;1p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-76","cols":89,"lines":76,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[76p","rmcup":"\u001b[255p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-76-lp","aliases":["guru-lp"],"cols":134,"lines":76,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[76p","rmcup":"\u001b[255p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-76-s","cols":89,"lines":75,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[76;1p\u001b[255;1H\u001b[K","rmcup":"\u001b[255;1p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-76-w","cols":178,"lines":76,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[76p","rmcup":"\u001b[255p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-76-w-s","cols":178,"lines":75,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[76;1p\u001b[255;1H\u001b[K","rmcup":"\u001b[255;1p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-76-wm","cols":178,"lines":76,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[76p","rmcup":"\u001b[255p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-nctxt","cols":80,"lines":33,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[H\u001b[J$\u003c156\u003e\u001b[33p\u001b[255;1H\u001b[K","rmcup":"\u001b[255p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-rv","aliases":["guru-33-rv"],"cols":80,"lines":33,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[33p","rmcup":"\u001b[255p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"guru-s","aliases":["guru-33-s"],"cols":80,"lines":32,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c156\u003e","smcup":"\u001b[33;1p\u001b[255;1H\u001b[K","rmcup":"\u001b[255;1p\u001b[255;1H\u001b[K","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001bP`\u003ez~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\u001b\\","rmkx":"\u001bP`\u003ey~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\u001b\\","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOA","kf2":"\u001bOB","kf3":"\u001bOC","kf4":"\u001bOD","kf5":"\u001bOE","kf6":"\u001bOF","kf7":"\u001bOG","kf8":"\u001bOH","kf9":"\u001bOI","kf10":"\u001bOJ","kf11":"\u001bOK","kf12":"\u001bOL","kf13":"\u001bOM","kf14":"\u001bON","kf15":"\u001bOO","kf16":"\u001bOP","kf17":"\u001bOQ","kf18":"\u001bOR","kf19":"\u001bOS","kf20":"\u001bOT","kf21":"\u001bOU","kf22":"\u001bOV","kf23":"\u001bOW","kf24":"\u001bOX","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[J"} -{"name":"h19","aliases":["h19-b","heath","heath-19","heathkit","z19","zenith"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bE","cnorm":"\u001by4","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"~^x`qanbkcjdmelfgg+hai.kwsutvutvozs{","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"h19-a","aliases":["h19a","heath-ansi","heathkit-a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","cnorm":"\u001b[\u003e4l","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[1A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOS","kf2":"\u001bOT","kf3":"\u001bOU","kf4":"\u001bOV","kf5":"\u001bOW","kf6":"\u001bOP","kf7":"\u001bOQ","kf8":"\u001bOR","khome":"\u001b[H","kcuu1":"\u001b[1A","kcud1":"\u001b[1B","kcub1":"\u001b[1D","kcuf1":"\u001b[1C","smacs":"\u001b[10m","rmacs":"\u001b[11m"} -{"name":"h19-bs","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bE","cnorm":"\u001by4","smkx":"\u001bt","rmkx":"\u001bu","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"~^x`qanbkcjdmelfgg+hai.kwsutvutvozs{","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"h19-g","aliases":["h19g"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bE","cnorm":"\u001bx4","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"~^x`qanbkcjdmelfgg+hai.kwsutvutvozs{","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"h19-u","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bE","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"~^x`qanbkcjdmelfgg+hai.kwsutvutvozs{","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"h19-us","aliases":["h19-smul","h19us"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bE","smkx":"\u001bt","rmkx":"\u001bu","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"~^x`qanbkcjdmelfgg+hai.kwsutvutvozs{","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"h19k","aliases":["h19kermit"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bE","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"~^x`qanbkcjdmelfgg+hai.kwsutvutvozs{","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"ha8675","cols":80,"lines":24,"clear":"\u001bE","sgr0":"\u001bd@","smul":"\u001bd`","cup":"\u001bF%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u0006","kf2":"\u0010","kf3":"\u000e","kf4":"\u0016","kf5":"\n","kf6":"\u0014","kf7":"\u0008","kf8":"","kf9":"\u001be","kf10":"\u001bd","kf11":"\u0017","kf12":"\u001bR","kf13":"\u001bE","kf14":"\u001bI","kf15":"\u001bi","kf16":"\u001bg","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b\u003e","kclr":"\u001bE"} -{"name":"ha8686","cols":80,"lines":24,"clear":"\u001bE","sgr0":"\u001bd@","smul":"\u001bd`","cup":"\u001bF%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u0002\u001bp\u0003","kf2":"\u0002\u001bq\u0003","kf3":"\u0002\u001br\u0003","kf4":"\u0002\u001bs\u0003","kf5":"\u001b3","kf6":"\u001bI","kf7":"\u001bR","kf8":"\u001bJ","kf9":"\u001b(","kf10":"\u001bj","kf11":"\u001bW","kf12":"\u0002\u001b{\u0003","kf13":"\u0002\u001b|\u0003","kf14":"\u0002\u001b}\u0003","kf15":"\u0002\u001b~\u0003","kf16":"\u0002\u001b\u0003","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b\u003e","kclr":"\u001bE"} -{"name":"hazel","aliases":["exec80","h80","he80"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[;H\u001b[2J$\u003c50/\u003e","sgr0":"\u001b[m$\u003c2/\u003e","smul":"\u001b[4m$\u003c2/\u003e","bold":"\u001b[1m$\u003c2/\u003e","blink":"\u001b[5m$\u003c2/\u003e","rev":"\u001b[7m$\u003c2/\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5/\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2/\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"hds200","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[+{","civis":"\u001b[6+{","sgr0":"\u001b[m\u000f","smul":"\u001b[0;4m","bold":"\u001b[0;1m","blink":"\u001b[0;5m","rev":"\u001b[0;7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001c001\r","kf2":"\u001c002\r","kf3":"\u001c003\r","kf4":"\u001c004\r","kf5":"\u001c005\r","kf6":"\u001c006\r","kf7":"\u001c007\r","kf8":"\u001c008\r","kf9":"\u001c009\r","kf10":"\u001c010\r","kf11":"\u001c011\r","kf12":"\u001c012\r","kf13":"\u001bOP","kf14":"\u001bOQ","kf15":"\u001bOR","kf16":"\u001bOS","kf17":"\u001c017\r","kf18":"\u001c018\r","kf19":"\u001c019\r","kf20":"\u001c020\r","kf21":"\u001c021\r","kf22":"\u001c022\r","kf23":"\u001c023\r","kf31":"\u001c031\r","kf32":"\u001c032\r","kf33":"\u001c033\r","kf34":"\u001c034\r","kf35":"\u001c035\r","kf36":"\u001c036\r","kf37":"\u001c037\r","kf38":"\u001c038\r","kf39":"\u001c039\r","kf40":"\u001c040\r","kf41":"\u001c041\r","kf42":"\u001c042\r","kf43":"\u001b$P","kf44":"\u001b$Q","kf45":"\u001b$R","kf46":"\u001b$S","kf47":"\u001c047\r","kf48":"\u001c048\r","kf49":"\u001c049\r","kf50":"\u001c050\r","kf51":"\u001c051\r","kf52":"\u001c052\r","kf53":"\u001c053\r","kdch":"","khome":"\u001b[H","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b$I","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b$C","kLFT":"\u001b$D","kHOM":"\u001b$H"} -{"name":"hft-c","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"jjkkllmmnnqqttuuvvwwxx","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"hft-c-old","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"hft-old","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","khome":"\u001b[H","kpp":"\u001b[159q","knp":"\u001b[153q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"hirez100","cols":80,"lines":48,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOQ","kf2":"\u001bOR","kf3":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hirez100-w","cols":132,"lines":48,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOQ","kf2":"\u001bOR","kf3":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hmod1","cols":80,"lines":24,"bell":"\u0007","clear":"~\u001c","sgr0":"~\u0019","cup":"~\u0011%p2%c%p1%c","cub1":"\u0008","cuu1":"~\u000c","pad":"\u0000","khome":"~\u0012","kcuu1":"~\u000c","kcud1":"~\u000b","kcub1":"\u0008","kcuf1":"\u0010"} -{"name":"hp110","cols":80,"lines":16,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","cup":"\u001b\u0026a%p2%dc%p1%dY$\u003c6\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcbt":"\u001bi"} -{"name":"hp150","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2","aliases":["hpex2"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0y0C\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kclr":"\u001bJ"} -{"name":"hp236","cols":80,"lines":24,"clear":"\u001bF","cnorm":"\u001bDE","sgr0":"\u001bCI","cup":"\u001bE%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"hp2382a","aliases":["hp2382"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ"} -{"name":"hp2392","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","khome":"\u001bh","kpp":"\u001bv","knp":"\u001bu","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"hp2397a","aliases":["hp2397"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dr%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2621","aliases":["2621","2621-wl","2621a","hp2621-wl","hp2621a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026jB","rmkx":"\u001b\u0026jA","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kcbt":"\u001bi"} -{"name":"hp2621-48","cols":80,"lines":48,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026jB","rmkx":"\u001b\u0026jA","cup":"\u001b\u0026a%p2%dc%p1%dR","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kcbt":"\u001bi"} -{"name":"hp2621-a","aliases":["hp2621a-a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026jB","rmkx":"\u001b\u0026j@","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","khome":"\u001bp\r","kcuu1":"\u001bt\r","kcud1":"\u001bw\r","kcub1":"\u001bu\r","kcuf1":"\u001bv\r","kcbt":"\u001bi"} -{"name":"hp2621-ba","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","khome":"\u001bh","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi"} -{"name":"hp2621-fl","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026jB","rmkx":"\u001b\u0026j@","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kcbt":"\u001bi"} -{"name":"hp2621-k45","aliases":["hp2621k45","k45"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","khome":"\u001bh","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi"} -{"name":"hp2621-nl","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kcbt":"\u001bi"} -{"name":"hp2621-nt","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026jB","rmkx":"\u001b\u0026jA","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kcbt":"\u001bi"} -{"name":"hp2621b","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026jB","rmkx":"\u001b\u0026jA","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","khome":"\u001bh","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi"} -{"name":"hp2621b-kx","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ"} -{"name":"hp2621b-kx-p","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ"} -{"name":"hp2621b-p","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026jB","rmkx":"\u001b\u0026jA","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","khome":"\u001bh","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi"} -{"name":"hp2621p","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026jB","rmkx":"\u001b\u0026jA","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kcbt":"\u001bi"} -{"name":"hp2621p-a","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026jB","rmkx":"\u001b\u0026jA","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","khome":"\u001bp\r","kcuu1":"\u001bt\r","kcud1":"\u001bw\r","kcub1":"\u001bu\r","kcuf1":"\u001bv\r","kcbt":"\u001bi"} -{"name":"hp2622","aliases":["hp2622a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2623","aliases":["hp2623a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2624","aliases":["hp2624a","hp2624b","hp2624b-4p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2624-10p","aliases":["hp2624a-10p","hp2624b-10p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2624b-10p-p","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2624b-p","aliases":["hp2624b-4p-p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2626","aliases":["hp2626a","hp2626p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2626-12","cols":80,"lines":12,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2626-12-s","cols":80,"lines":11,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2626-12x40","cols":40,"lines":12,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2626-ns","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2626-s","cols":80,"lines":23,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2626-x40","cols":40,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp2627a","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD\u001b\u0026v1S","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kcud1":"\n","kcub1":"\u0008","kcbt":"\u001bi"} -{"name":"hp2627a-rev","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD\u001b\u0026v1S","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kcud1":"\n","kcub1":"\u0008","kcbt":"\u001bi"} -{"name":"hp2627c","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD\u001b\u0026v1S","cup":"\u001b\u0026a%p2%dc%p1%dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp\r","kf2":"\u001bq\r","kf3":"\u001br\r","kf4":"\u001bs\r","kf5":"\u001bt\r","kf6":"\u001bu\r","kf7":"\u001bv\r","kf8":"\u001bw\r","kcud1":"\n","kcub1":"\u0008","kcbt":"\u001bi"} -{"name":"hp2640b","aliases":["hp2644a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","cup":"\u001b\u0026a%p2%dc%p1%dY$\u003c6\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi"} -{"name":"hp2641a","aliases":["hp2645a","hp2647a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001b\u0026a%p2%2dc%p1%2dY","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"hp2645","aliases":["hp45"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p2%dc%p1%dY$\u003c6\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi"} -{"name":"hp2648","aliases":["hp2648a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ$\u003c50\u003e","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p2%dc%p1%dY$\u003c20\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi"} -{"name":"hp300h","cols":128,"lines":51,"bell":"\u0007","clear":"\u001b\u0026a0y0C\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","khome":"\u001bh","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"hp700-wy","cols":80,"lines":24,"clear":"\u001a","sgr0":"\u001bG0$\u003c10/\u003e","smul":"\u001bG8$\u003c10/\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"","kich":"\u001bq","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001a"} -{"name":"hp70092","aliases":["hp70092a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0y0C\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","bold":"\u001b\u0026dB","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kclr":"\u001bJ","acsc":"0cjgktlrmfn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hp9837","aliases":["hp98720","hp98721"],"cols":128,"lines":46,"bell":"\u0007","clear":"\u001b\u0026a0y0C\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"hp9845","cols":80,"lines":21,"clear":"\u001bH\u001bJ","cup":"\u001b\u0026a%p2%2dc%p1%2dY","cuu1":"\u001bA","pad":"\u0000"} -{"name":"hp98550","aliases":["hp98550a"],"cols":128,"lines":49,"bell":"\u0007","clear":"\u001bH\u001bJ","cnorm":"\u001b*dQ","civis":"\u001b*dR","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","bold":"\u001b\u0026dJ","blink":"\u001b\u0026dA","rev":"\u001b\u0026dJ","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kclr":"\u001bJ","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hpansi","aliases":["hp700"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"hpex","cols":-1,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","khome":"\u001bh","kcuu1":"\u001bA","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001bC"} -{"name":"hpgeneric","aliases":["hp"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","cup":"\u001b\u0026a%p2%dc%p1%dY$\u003c6\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcbt":"\u001bi"} -{"name":"hpterm","aliases":["X-hpterm"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0y0C\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","bold":"\u001b\u0026dB","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kclr":"\u001bJ","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hpterm-color","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0y0C\u001bJ","sgr0":"\u001b\u0026d@","smul":"\u001b\u0026dD","bold":"\u001b\u0026dB","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kclr":"\u001bJ","smacs":"\u000e","rmacs":"\u000f"} -{"name":"hurd","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001bc","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00ii``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"hz1420","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u001c","cup":"\u001b\u0011%p2%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001b\u000c","pad":"\u0000"} -{"name":"hz1500","cols":80,"lines":24,"bell":"\u0007","clear":"~\u001c","cup":"~\u0011%p2%p2%?%{30}%\u003e%t%' '%+%;%'`'%+%c%p1%'`'%+%c","cub1":"\u0008","cuu1":"~\u000c","pad":"\u0000","khome":"~\u0012","kcuu1":"~\u000c","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0010"} -{"name":"hz1510","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u001c","cup":"\u001b\u0011%p2%c%p1%c","cub1":"\u0008","cuu1":"\u001b\u000c","pad":"\u0000"} -{"name":"hz1520","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u001c","sgr0":"\u001b\u0019","bold":"\u001b\u001f","cup":"\u001b\u0011%p2%c%p1%c","cub1":"\u0008","cuu1":"\u001b\u000c","pad":"\u0000","kbs":"\u0008","khome":"\u001b\u0012","kcuu1":"\u001b\u000c","kcud1":"\u001b\u000b","kcub1":"\u0008","kcuf1":"\u0010","kclr":"\u001b\u001c"} -{"name":"hz1520-noesc","cols":80,"lines":24,"bell":"\u0007","clear":"~\u001c","cup":"~\u0011%p2%c%p1%c$\u003c1\u003e","cub1":"\u0008","cuu1":"~\u000c","pad":"\u0000"} -{"name":"hz1552","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bP","kf2":"\u001bQ","kf3":"\u001bR","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"ffgghhompoqqss.k","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"hz1552-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bP","kf2":"\u001bQ","kf3":"\u001bR","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"ffgghhompoqqss.k","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"hz2000","cols":74,"lines":27,"bell":"\u0007","clear":"~\u001c$\u003c6\u003e","cup":"~\u0011%p2%c%p1%c","cub1":"\u0008","pad":""} -{"name":"i100","aliases":["gt100","gt100a"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cup":"\u001bf%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000"} -{"name":"i400","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[2J","cup":"\u001b[%i%p1%3d;%p2%3dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000"} -{"name":"ibcs2","cols":-1,"lines":-1,"clear":"\u001bc","cup":"\u001b[%i%p1%d;%p2%dH","pad":"\u0000"} -{"name":"ibm-apl","aliases":["apl"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u000c","cup":"\u001e%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001f","pad":"\u0000","khome":"\u0019","kcuu1":"\u001f","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001c"} -{"name":"ibm-system1","aliases":["system1"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cup":"\u0005%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001e","pad":"\u0000"} -{"name":"ibm3101","aliases":["i3101"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"ibm3151","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001b\u003eB","rmcup":"\u001b\u003eB","sgr0":"\u001b4@\u001b\u003eB","smul":"\u001b4\"a","bold":"\u001b4(a","blink":"\u001b4$a","rev":"\u001b4!a","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001ba\r","kf2":"\u001bb\r","kf3":"\u001bc\r","kf4":"\u001bd\r","kf5":"\u001be\r","kf6":"\u001bf\r","kf7":"\u001bg\r","kf8":"\u001bh\r","kf9":"\u001bi\r","kf10":"\u001bj\r","kf11":"\u001bk\r","kf12":"\u001bl\r","kf13":"\u001b!a\r","kf14":"\u001b!b\r","kf15":"\u001b!c\r","kf16":"\u001b!d\r","kf17":"\u001b!e\r","kf18":"\u001b!f\r","kf19":"\u001b!g\r","kf20":"\u001b!h\r","kf21":"\u001b!i\r","kf22":"\u001b!j\r","kf23":"\u001b!k\r","kf24":"\u001b!l\r","kich":"\u001bP \u0008","kdch":"\u001bQ","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b2","kclr":"\u001bL\r","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","smacs":"\u001b\u003eA","rmacs":"\u001b\u003eB"} -{"name":"ibm3161","aliases":["ibm3163","wy60-316X","wyse60-316X"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001b\u003eA","rmcup":"\u001b\u003eA","sgr0":"\u001b4@\u001b\u003c@","smul":"\u001b4B","bold":"\u001b4H","blink":"\u001b4D","rev":"\u001b4A","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001ba\r","kf2":"\u001bb\r","kf3":"\u001bc\r","kf4":"\u001bd\r","kf5":"\u001be\r","kf6":"\u001bf\r","kf7":"\u001bg\r","kf8":"\u001bh\r","kf9":"\u001bi\r","kf10":"\u001bj\r","kf11":"\u001bk\r","kf12":"\u001bl\r","kf13":"\u001b!a\r","kf14":"\u001b!b\r","kf15":"\u001b!c\r","kf16":"\u001b!d\r","kf17":"\u001b!e\r","kf18":"\u001b!f\r","kf19":"\u001b!g\r","kf20":"\u001b!h\r","kf21":"\u001b!i\r","kf22":"\u001b!j\r","kf23":"\u001b!k\r","kf24":"\u001b!l\r","kich":"\u001bP \u0008","kdch":"\u001bQ","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b2","kclr":"\u001bL\r","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"ibm3161-C","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001b\u003eB","rmcup":"\u001b\u003eB","sgr0":"\u001b4@\u001b\u003c@","smul":"\u001b4B","bold":"\u001b4H","blink":"\u001b4D","rev":"\u001b4A","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001ba\r","kf2":"\u001bb\r","kf3":"\u001bc\r","kf4":"\u001bd\r","kf5":"\u001be\r","kf6":"\u001bf\r","kf7":"\u001bg\r","kf8":"\u001bh\r","kf9":"\u001bi\r","kf10":"\u001bj\r","kf11":"\u001bk\r","kf12":"\u001bl\r","kf13":"\u001b!a\r","kf14":"\u001b!b\r","kf15":"\u001b!c\r","kf16":"\u001b!d\r","kf17":"\u001b!e\r","kf18":"\u001b!f\r","kf19":"\u001b!g\r","kf20":"\u001b!h\r","kf21":"\u001b!i\r","kf22":"\u001b!j\r","kf23":"\u001b!k\r","kf24":"\u001b!l\r","kich":"\u001bP \u0008","kdch":"\u001bQ","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b2","kclr":"\u001bL\r","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"ibm3162","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001b\u003eB","rmcup":"\u001b\u003eB","sgr0":"\u001b4@","smul":"\u001b4\"a","bold":"\u001b4(a","blink":"\u001b4$a","rev":"\u001b4!a","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001ba\r","kf2":"\u001bb\r","kf3":"\u001bc\r","kf4":"\u001bd\r","kf5":"\u001be\r","kf6":"\u001bf\r","kf7":"\u001bg\r","kf8":"\u001bh\r","kf9":"\u001bi\r","kf10":"\u001bj\r","kf11":"\u001bk\r","kf12":"\u001bl\r","kf13":"\u001b!a\r","kf14":"\u001b!b\r","kf15":"\u001b!c\r","kf16":"\u001b!d\r","kf17":"\u001b!e\r","kf18":"\u001b!f\r","kf19":"\u001b!g\r","kf20":"\u001b!h\r","kf21":"\u001b!i\r","kf22":"\u001b!j\r","kf23":"\u001b!k\r","kf24":"\u001b!l\r","kich":"\u001bP \u0008","kdch":"\u001bQ","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b2","kclr":"\u001bL\r","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"ibm3164","aliases":["i3164"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001b!9/N\u001b\u003eB","rmcup":"\u001b!9(N\u001b\u003eB","sgr0":"\u001b4@\u001b\u003c@","smul":"\u001b4B","bold":"\u001b4H","blink":"\u001b4D","rev":"\u001b4A","setaf":"\u001b4%?%p1%t %p1%' '%+%c%e!'%;@","setbg":"\u001b4 %p1%'@'%+%c","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001ba\r","kf2":"\u001bb\r","kf3":"\u001bc\r","kf4":"\u001bd\r","kf5":"\u001be\r","kf6":"\u001bf\r","kf7":"\u001bg\r","kf8":"\u001bh\r","kf9":"\u001bi\r","kf10":"\u001bj\r","kf11":"\u001bk\r","kf12":"\u001bl\r","kf13":"\u001b!a\r","kf14":"\u001b!b\r","kf15":"\u001b!c\r","kf16":"\u001b!d\r","kf17":"\u001b!e\r","kf18":"\u001b!f\r","kf19":"\u001b!g\r","kf20":"\u001b!h\r","kf21":"\u001b!i\r","kf22":"\u001b!j\r","kf23":"\u001b!k\r","kf24":"\u001b!l\r","kich":"\u001bP \u0008","kdch":"\u001bQ","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b2","kclr":"\u001bL\r","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"ibm5081","aliases":["hft"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"jjkkllmmnnqqttuuvvwwxx","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ibm5081-c","aliases":["ibmmpel-c"],"cols":80,"lines":33,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001bw\u001bq\u001bz\u001bB","smul":"\u001bF\u001bf2;","bold":"\u001bZ","rev":"\u001bp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bY","kich":"\ufffd","khome":"\u001bH","kpp":"\u001bg","knp":"\u001bE","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"ibm5151","aliases":["wy60-AT","wyse60-AT"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"ibm5154","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ibm6153","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[12m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"ibm6153-40","cols":40,"lines":12,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"ibm6153-90","cols":90,"lines":36,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"ibm6154","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[12m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ibm6155","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"ibm8503","aliases":["ibm8507","ibm8604"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"jjkkllmmnnqqttuuvvwwxx","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ibm8512","aliases":["ibm8513"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[20;4l\u001b[?7h\u001bb","rmcup":"\u001b[20h","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"jjkkllmmnnqqttuuvvwwxx","smacs":"\u000e","rmacs":"\u000f","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ibm8514","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m\u001b(B","smul":"\u001b[4m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"jjkkllmmnnqqttuuvvwwxx","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ibm8514-c","cols":80,"lines":41,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001bw\u001bq\u001bz\u001bB","smul":"\u001bF\u001bf2;","bold":"\u001bZ","rev":"\u001bp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bY","kich":"\ufffd","khome":"\u001bH","kpp":"\u001bg","knp":"\u001bE","kcuu1":"\u001bA","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001bC"} -{"name":"ibmaed","cols":80,"lines":52,"clear":"\u001bH\u001bK","sgr0":"\u001b0","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"ibmapa8c","aliases":["ibmapa8"],"cols":80,"lines":31,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001bw\u001bq\u001bz\u001bB","smul":"\u001bW","bold":"\u001bZ","rev":"\u001bp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bY","kich":"\ufffd","khome":"\u001bH","kpp":"\u001bg","knp":"\u001bE","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"ibmapa8c-c","aliases":["ibm6154-c"],"cols":80,"lines":31,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001bw\u001bq\u001bz\u001bB","smul":"\u001bF\u001bf2;","bold":"\u001bZ","rev":"\u001bp","dim":"\u001bF\u001bf7;","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bY","kich":"\ufffd","khome":"\u001bH","kpp":"\u001bg","knp":"\u001bE","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"ibmega","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001bw\u001bq\u001bz\u001bB","smul":"\u001bW","bold":"\u001bZ","rev":"\u001bp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bY","kich":"\ufffd","khome":"\u001bH","kpp":"\u001bg","knp":"\u001bE","kcuu1":"\u001bA","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001bC"} -{"name":"ibmega-c","aliases":["ibm5154-c"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001bw\u001bq\u001bz\u001bB","smul":"\u001bF\u001bf2;","bold":"\u001bZ","rev":"\u001bp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bY","kich":"\ufffd","khome":"\u001bH","kpp":"\u001bg","knp":"\u001bE","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"ibmmono","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001bw\u001bq\u001bz\u001bB","smul":"\u001bW","bold":"\u001bZ","rev":"\u001bp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bY","kich":"\ufffd","khome":"\u001bH","kpp":"\u001bg","knp":"\u001bE","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"ibmpc","aliases":["wy60-PC","wyse60-PC"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bc","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd","kf2":"\ufffd","kf3":"\ufffd","kf4":"\ufffd","kf5":"\ufffd","kf6":"\ufffd","kf7":"\ufffd","kf8":"\ufffd","kf9":"\ufffd","kf10":"\ufffd","kich":"\u001b[\u0008","kdch":"","khome":"\u001b[H","kend":"\u001b[Y","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001d","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"ibmpc3","aliases":["pc3-bold"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001bc","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[L","khome":"\u001b[H","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ibmpcx","aliases":["ibmx","xenix"],"cols":80,"lines":25,"clear":"\u000c","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[K","kf2":"\u001b[L","kf3":"\u001b[M","kf4":"\u001b[N","khome":"\u001b[Y","kend":"\u001b[d","kpp":"\u001b[Z","knp":"\u001b[e","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"ibmvga","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001bw\u001bq\u001bz\u001bB","smul":"\u001bW","bold":"\u001bZ","rev":"\u001bp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bY","kich":"\ufffd","khome":"\u001bH","kpp":"\u001bg","knp":"\u001bE","kcuu1":"\u001bA","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001bC"} -{"name":"ibmvga-c","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001bw\u001bq\u001bz\u001bB","smul":"\u001bF\u001bf2;","bold":"\u001bZ","rev":"\u001bp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bY","kich":"\ufffd","khome":"\u001bH","kpp":"\u001bg","knp":"\u001bE","kcuu1":"\u001bA","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001bC"} -{"name":"icl6404","aliases":["icl6402","kds6402","kds7372"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","cnorm":"\u001b.3","civis":"\u001b.0","sgr0":"\u001b[0ZZ","smul":"\u001b[8ZZ","blink":"\u001b[2ZZ","rev":"\u001b[4ZZ","cup":"\u001b=%p1%' '%+%c%p2%'P'%m%' '%+%c%p2%'P'%\u003e%' '%+%c","cuu1":"\u000b","pad":"\u0000"} -{"name":"icl6404-w","aliases":["kds7372-w"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","cnorm":"\u001b.3","civis":"\u001b.0","sgr0":"\u001b[0ZZ","smul":"\u001b[8ZZ","blink":"\u001b[2ZZ","rev":"\u001b[4ZZ","cup":"\u001b=%p1%' '%+%c%p2%'P'%m%' '%+%c%p2%'P'%\u003e%' '%+%c","cuu1":"\u000b","pad":"\u0000"} -{"name":"ifmr","cols":80,"lines":24,"clear":"\u001bZ","sgr0":"\u001bK","cup":"\u001bY%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000"} -{"name":"ims-ansi","aliases":["ultima2","ultimaII"],"cols":80,"lines":24,"clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%2d;%p2%2dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ims950","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kich":"\u001bQ","kdch":"\u001bW","kcbt":"\u001bI","kclr":"\u001b*","acsc":"b\tc\u000cd\re\ni\u000b","smacs":"\u0015","rmacs":"\u0018"} -{"name":"ims950-b","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kich":"\u001bQ","kdch":"\u001bW","kcbt":"\u001bI","kclr":"\u001b*","acsc":"b\tc\u000cd\re\ni\u000b","smacs":"\u0015","rmacs":"\u0018"} -{"name":"ims950-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kich":"\u001bQ","kdch":"\u001bW","kcbt":"\u001bI","kclr":"\u001b*","acsc":"b\tc\u000cd\re\ni\u000b","smacs":"\u0015","rmacs":"\u0018"} -{"name":"interix","aliases":["ntconsole","ntconsole-25","opennt","opennt-25"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[s\u001b[1b","rmcup":"\u001b[2b\u001b[u\r\u001b[K","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"interix-nti","aliases":["ntconsole-25-nti","opennt-25-nti","opennt-nti"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[2J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"intertube","aliases":["intertec"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u000c","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c$\u003c50\u003e","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000"} -{"name":"intertube2","cols":80,"lines":25,"bell":"\u0007","clear":"\u000c","cup":"\u000e%p1%c\u0010%p2%{10}%/%{16}%*%p2%{10}%m%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000"} -{"name":"intext","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c132\u003e","smkx":"\u001e:\ufffd\u0016%%","rmkx":"\u00169","cup":"\u000f%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001c","pad":"\u0000","kbs":"\u0008","kf1":"\u0016A\r","kf2":"\u0016B\r","kf3":"\u0016C\r","kf4":"\u0016D\r","kf5":"\u0016E\r","kf6":"\u0016F\r","kf7":"\u0016G\r","kf8":"\u0016H\r","kf9":"\u0016I\r","khome":"\u001a","kcuu1":"\u001c","kcud1":"\n","kcub1":"\u001f","kcuf1":"\u001e"} -{"name":"intext2","aliases":["intextii"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smul":"\u001b[18 D","cup":"\u001b[%i%p1%d;%p2%dH","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bP\r","kf2":"\u001bQ\r","kf3":"\u001bS\r","kf4":"\u001bT\r","kf5":"\u001bU\r","kf6":"\u001bV\r","kf7":"\u001bW\r","kf8":"\u001bX\r","kf9":"\u001bY\r","khome":"\u001bR\r","kcuu1":"\u001bA\r","kcud1":"\u001bB\r","kcub1":"\u001bD\r","kcuf1":"\u001bC\r"} -{"name":"iris-ansi","aliases":["iris-ansi-net"],"cols":80,"lines":40,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[9/y\u001b[12/y\u001b[=6l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kich":"\u001b[139q","kdch":"","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kprt":"\u001b[209q","kRIT":"\u001b[167q","kLFT":"\u001b[158q","kHOM":"\u001b[143q","kEND":"\u001b[147q"} -{"name":"iris-ansi-ap","cols":80,"lines":40,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[9/y\u001b[12/y\u001b[=6l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kich":"\u001b[139q","kdch":"","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kprt":"\u001b[209q","kRIT":"\u001b[167q","kLFT":"\u001b[158q","kHOM":"\u001b[143q","kEND":"\u001b[147q"} -{"name":"iris-color","aliases":["xwsh"],"cols":80,"lines":40,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[9/y\u001b[12/y\u001b[=6l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kich":"\u001b[139q","kdch":"","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kprt":"\u001b[209q","kRIT":"\u001b[167q","kLFT":"\u001b[158q","kHOM":"\u001b[143q","kEND":"\u001b[147q","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"jaixterm","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"jaixterm-m","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q"} -{"name":"kaypro","aliases":["kaypro2"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c1/\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcuf1":"\u000c"} -{"name":"kermit","cols":80,"lines":24,"clear":"\u001bE","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"kermit-am","cols":80,"lines":24,"clear":"\u001bE","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"kon","aliases":["jfbterm","kon2"],"cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"konsole","cols":80,"lines":24,"colors":8,"clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO3P","kf50":"\u001bO3Q","kf51":"\u001bO3R","kf52":"\u001bO3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO4P","kf62":"\u001bO4Q","kf63":"\u001bO4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"konsole-16color","cols":80,"lines":24,"colors":16,"clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO3P","kf50":"\u001bO3Q","kf51":"\u001bO3R","kf52":"\u001bO3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO4P","kf62":"\u001bO4Q","kf63":"\u001bO4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"konsole-256color","cols":80,"lines":24,"colors":256,"clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO3P","kf50":"\u001bO3Q","kf51":"\u001bO3R","kf52":"\u001bO3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO4P","kf62":"\u001bO4Q","kf63":"\u001bO4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m"} -{"name":"konsole-base","cols":80,"lines":24,"colors":8,"clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kich":"\u001b[2~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"konsole-linux","cols":80,"lines":24,"colors":8,"clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"konsole-solaris","cols":80,"lines":24,"colors":8,"clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"konsole-vt100","cols":80,"lines":24,"colors":8,"clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"konsole-vt420pc","cols":80,"lines":24,"colors":8,"clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"konsole-xf3x","cols":80,"lines":24,"colors":8,"clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"konsole-xf4x","cols":80,"lines":24,"colors":8,"clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO3P","kf50":"\u001bO3Q","kf51":"\u001bO3R","kf52":"\u001bO3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO4P","kf62":"\u001bO4Q","kf63":"\u001bO4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"kt7","cols":80,"lines":24,"clear":"\u001a","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001a"} -{"name":"kt7ix","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b*","cnorm":"\u001b.3","civis":"\u001b.0","sgr0":"\u001bG0","smul":"\u001bG8","blink":"\u001bG2","dim":"\u001bG@","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","khome":"\u001e","kend":"\u001bY","knp":"\u001bJ","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001bI","kclr":"\u001b*","acsc":"jYk?lZm@nEqDt4uCvAwBx3","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"kterm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aajjkkllmmnnooppqqrrssttuuvvwwxx~~","smacs":"\u001b(0","rmacs":"\u001b(B","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"kterm-color","aliases":["kterm-co"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aajjkkllmmnnooppqqrrssttuuvvwwxx~~","smacs":"\u001b(0","rmacs":"\u001b(B","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"kvt","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"lft","aliases":["LFT-PC850","lft-pc850"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[001q","kf2":"\u001b[002q","kf3":"\u001b[003q","kf4":"\u001b[004q","kf5":"\u001b[005q","kf6":"\u001b[006q","kf7":"\u001b[007q","kf8":"\u001b[008q","kf9":"\u001b[009q","kf10":"\u001b[010q","kf11":"\u001b[011q","kf12":"\u001b[012q","kf13":"\u001b[013q","kf14":"\u001b[014q","kf15":"\u001b[015q","kf16":"\u001b[016q","kf17":"\u001b[017q","kf18":"\u001b[018q","kf19":"\u001b[019q","kf20":"\u001b[020q","kf21":"\u001b[021q","kf22":"\u001b[022q","kf23":"\u001b[023q","kf24":"\u001b[024q","kf25":"\u001b[025q","kf26":"\u001b[026q","kf27":"\u001b[027q","kf28":"\u001b[028q","kf29":"\u001b[029q","kf30":"\u001b[030q","kf31":"\u001b[031q","kf32":"\u001b[032q","kf33":"\u001b[033q","kf34":"\u001b[034q","kf35":"\u001b[035q","kf36":"\u001b[036q","kich":"\u001b[139q","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[146q","kpp":"\u001b[150q","knp":"\u001b[154q","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kclr":"\u001b[144q","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"linux","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?0c","civis":"\u001b[?25l\u001b[?1c","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"linux-basic","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"linux-c","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"linux-c-nc","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"linux-koi8","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?0c","civis":"\u001b[?25l\u001b[?1c","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"linux-koi8r","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?0c","civis":"\u001b[?25l\u001b[?1c","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"linux-lat","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?0c","civis":"\u001b[?25l\u001b[?1c","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\u000bf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"linux-m","cols":-1,"lines":-1,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?0c","civis":"\u001b[?25l\u001b[?1c","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"linux-nic","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?0c","civis":"\u001b[?25l\u001b[?1c","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"linux-vt","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?0c","civis":"\u001b[?25l\u001b[?1c","sgr0":"\u001b[0m\u001b(K\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(K","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"linux2.6.26","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h\u001b[?0c","civis":"\u001b[?25l\u001b[?1c","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"lisa","cols":88,"lines":32,"clear":"\u000c","cnorm":"\u001b[5l","civis":"\u001b[5h","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"jdkclfmenbqattuvvuwsx`","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"lisaterm","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOQ","kf2":"\u001bOR","kf3":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"lisaterm-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOQ","kf2":"\u001bOR","kf3":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u001bOC"} -{"name":"liswb","cols":88,"lines":32,"clear":"\u000c","cnorm":"\u001b[5l","civis":"\u001b[5h","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"jdkclfmenbqattuvvuwsx`","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"luna","aliases":["luna68k"],"cols":88,"lines":46,"bell":"\u0007","clear":"\u001b[H\u001b[J","cup":"\u001b[%i%p1%d;%p2%dH","pad":"\u0000"} -{"name":"m2-nam","aliases":["minitel","minitel-2","minitel-2-nam"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[\u003c1l","civis":"\u001b[\u003c1h","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOq","kf2":"\u001bOr","kf3":"\u001bOs","kf4":"\u001bOt","kf5":"\u001bOu","kf6":"\u001bOv","kf7":"\u001bOw","kf8":"\u001bOx","kf9":"\u001bOy","kf10":"\u001bOp","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kpp":"\u001bOR","knp":"\u001bOn","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","acsc":"aaffggjjkkllmmnnooqqssttuuvvwwxx","smacs":"\u000e","rmacs":"\u000f"} -{"name":"mac","aliases":["macintosh"],"cols":88,"lines":32,"clear":"\u000c","cnorm":"\u001b[5l","civis":"\u001b[5h","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"jdkclfmenbqattuvvuwsx`","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"mac-w","aliases":["macterminal-w"],"cols":132,"lines":32,"clear":"\u000c","cnorm":"\u001b[5l","civis":"\u001b[5h","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"jdkclfmenbqattuvvuwsx`","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"mach","cols":80,"lines":25,"bell":"\u0007","clear":"\u001bc","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kich":"\u001b[@","kdch":"\u001b[9","khome":"\u001b[H","kend":"\u001b[Y","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"mach-bold","cols":80,"lines":25,"bell":"\u0007","clear":"\u001bc","sgr0":"\u001b[0m","smul":"\u001b[1m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kich":"\u001b[@","kdch":"\u001b[9","khome":"\u001b[H","kend":"\u001b[Y","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"mach-color","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001bc","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kich":"\u001b[@","kdch":"\u001b[9","khome":"\u001b[H","kend":"\u001b[Y","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"mai","aliases":["basic4"],"cols":82,"lines":25,"bell":"\u0007","clear":"\u001d\u001f","cnorm":"\u001b[?7h","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"masscomp","cols":80,"lines":24,"clear":"\u001b[2J","smul":"\u001bGu","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"masscomp1","cols":104,"lines":36,"clear":"\u001b[2J","smul":"\u001bGu","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"masscomp2","cols":64,"lines":21,"clear":"\u001b[2J","smul":"\u001bGu","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"memhp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dr%p2%dC","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"mgr","cols":-1,"lines":-1,"bell":"\u0007","clear":"\u000c","cnorm":"\u001bh","civis":"\u001b9h","sgr0":"\u001b0n","smul":"\u001b4n","bold":"\u001b2n","rev":"\u001b1n","cup":"\u001b%p2%d;%p1%dM","cub1":"\u0008","cuu1":"\u001bu","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"mgr-linux","cols":-1,"lines":-1,"bell":"\u0007","clear":"\u000c","cnorm":"\u001bh","civis":"\u001b9h","sgr0":"\u001b0n","smul":"\u001b4n","bold":"\u001b2n","rev":"\u001b1n","cup":"\u001b%p2%d;%p1%dM","cub1":"\u0008","cuu1":"\u001bu","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[[A","kf2":"\u001b[[B","kf3":"\u001b[[C","kf4":"\u001b[[D","kf5":"\u001b[[E","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"mgr-sun","cols":-1,"lines":-1,"bell":"\u0007","clear":"\u000c","cnorm":"\u001bh","civis":"\u001b9h","sgr0":"\u001b0n","smul":"\u001b4n","bold":"\u001b2n","rev":"\u001b1n","cup":"\u001b%p2%d;%p1%dM","cub1":"\u0008","cuu1":"\u001bu","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","khome":"\u001b[214z","kend":"\u001b[220z","khlp":"\u001b[207z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"mgt","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1048h\u001b[?1047h","rmcup":"\u001b[?1047l\u001b[?1048l","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"microb","aliases":["microbee"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bE","sgr0":"\u001bd@","smul":"\u001bd`","cup":"\u001bF%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kf9":"\u001bx","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"mime","aliases":["mime1","mime2","mimei","mimeii"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001d\u0003","cup":"\u0014%p1%{24}%+%c%p2%p2%?%' '%\u003e%t%'0'%+%;%'P'%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kcuu1":"\u001a","kcud1":"\u000b","kcub1":"\u0008","kcuf1":"\u0018"} -{"name":"mime-fb","cols":80,"lines":24,"bell":"\u0007","clear":"\u001d\u0003","cup":"\u0014%p1%{24}%+%c%p2%p2%?%' '%\u003e%t%'0'%+%;%'P'%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kcuu1":"\u001a","kcud1":"\u000b","kcub1":"\u0008","kcuf1":"\u0018"} -{"name":"mime-hb","cols":80,"lines":24,"bell":"\u0007","clear":"\u001d\u0003","cup":"\u0014%p1%{24}%+%c%p2%p2%?%' '%\u003e%t%'0'%+%;%'P'%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kcuu1":"\u001a","kcud1":"\u000b","kcub1":"\u0008","kcuf1":"\u0018"} -{"name":"mime2a","aliases":["mime2a-v"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bL","smul":"\u001b4","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"mime2a-s","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bL","smul":"\u001b6","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bI","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"mime314","aliases":["mm314"],"cols":80,"lines":24,"clear":"\u000c","cup":"\u0014%p1%c%p2%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kcuu1":"\u001a","kcud1":"\u000b","kcub1":"\u0008","kcuf1":"\u0018"} -{"name":"mime3a","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c1/\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u001a","kcud1":"\u000b","kcub1":"\u0008","kcuf1":"\u0018"} -{"name":"mime3ax","aliases":["mime-3ax"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c1/\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u001a","kcud1":"\u000b","kcub1":"\u0008","kcuf1":"\u0018"} -{"name":"minitel1","cols":40,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u0011","civis":"\u0014","sgr0":"\u001bI\u001b\\","blink":"\u001bH","rev":"\u001b]","cup":"\u001f%p1%'A'%+%c%p2%'A'%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","acsc":"+.,,./f0g1","enacs":"\u0019"} -{"name":"minitel1b","cols":40,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u0011","civis":"\u0014","sgr0":"\u001bI\u001b\\","blink":"\u001bH","rev":"\u001b]","smkx":"\u001b;iYA\u001b;jYC","cup":"\u001f%p1%'A'%+%c%p2%'A'%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","acsc":"+.,,./f0g1","enacs":"\u0019"} -{"name":"minitel1b-80","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001f@A\u0011\n","civis":"\u001f@A\u0014\n","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOq","kf2":"\u001bOr","kf3":"\u001bOs","kf4":"\u001bOt","kf5":"\u001bOu","kf6":"\u001bOv","kf7":"\u001bOw","kf8":"\u001bOx","kf9":"\u001bOy","kich":"\u001b[4h","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[2J","acsc":"+.,,./f0g1","enacs":"\u0019"} -{"name":"minix","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[0J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[V","kf2":"\u001b[U","kf3":"\u001b[T","kf4":"\u001b[S","kf5":"\u001b[G","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"minix-old","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[0J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[V","kf2":"\u001b[U","kf3":"\u001b[T","kf4":"\u001b[S","kf5":"\u001b[G","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"minix-old-am","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[0J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[V","kf2":"\u001b[U","kf3":"\u001b[T","kf4":"\u001b[S","kf5":"\u001b[G","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"mlterm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[11;2~","kf14":"\u001b[12;2~","kf15":"\u001b[13;2~","kf16":"\u001b[14;2~","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[11;5~","kf26":"\u001b[12;5~","kf27":"\u001b[13;5~","kf28":"\u001b[14;5~","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[11;6~","kf38":"\u001b[12;6~","kf39":"\u001b[13;6~","kf40":"\u001b[14;6~","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[11;3~","kf50":"\u001b[12;3~","kf51":"\u001b[13;3~","kf52":"\u001b[14;3~","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[11;4~","kf62":"\u001b[12;4~","kf63":"\u001b[13;4~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001bO1;2C","kLFT":"\u001bO1;2D","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"mm340","aliases":["mime340"],"cols":80,"lines":24,"clear":"\u001a$\u003c12/\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008"} -{"name":"modgraph","aliases":["mod24"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"modgraph2","cols":80,"lines":24,"clear":"\u001bH\u001bJ$\u003c50/\u003e","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c$\u003c5/\u003e","cub1":"\u0008","cuu1":"\u001bA$\u003c2/\u003e","pad":"\u0000"} -{"name":"modgraph48","aliases":["mod"],"cols":80,"lines":48,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"mono-emx","cols":80,"lines":24,"clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[0m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd;","kf2":"\ufffd\u003c","kf3":"\ufffd=","kf4":"\ufffd\u003e","kf5":"\ufffd?","kf6":"\ufffd@","kf7":"\ufffdA","kf8":"\ufffdB","kf9":"\ufffdC","kich":"\ufffdR","khome":"\ufffdG","kpp":"\ufffdI","knp":"\ufffdQ","kcuu1":"\ufffdH","kcud1":"\ufffdP","kcub1":"\ufffdK","kcuf1":"\ufffdM"} -{"name":"mrxvt","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[11;2~","kf14":"\u001b[12;2~","kf15":"\u001b[13;2~","kf16":"\u001b[14;2~","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[11;5~","kf26":"\u001b[12;5~","kf27":"\u001b[13;5~","kf28":"\u001b[14;5~","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[11;6~","kf38":"\u001b[12;6~","kf39":"\u001b[13;6~","kf40":"\u001b[14;6~","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[11;3~","kf50":"\u001b[12;3~","kf51":"\u001b[13;3~","kf52":"\u001b[14;3~","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[11;4~","kf62":"\u001b[12;4~","kf63":"\u001b[13;4~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[7^","_kcend":"\u001b[8^","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C"} -{"name":"ms-vt-utf8","aliases":["vt-utf8"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001b1","kf2":"\u001b2","kf3":"\u001b3","kf4":"\u001b4","kf5":"\u001b5","kf6":"\u001b6","kf7":"\u001b7","kf8":"\u001b8","kf9":"\u001b9","kf10":"\u001b0","kf11":"\u001b!","kf12":"\u001b@","kf13":"\u001b\u0013\u001b1","kf14":"\u001b\u0013\u001b2","kf15":"\u001b\u0013\u001b3","kf16":"\u001b\u0013\u001b4","kf17":"\u001b\u0013\u001b5","kf18":"\u001b\u0013\u001b6","kf19":"\u001b\u0013\u001b7","kf20":"\u001b\u0013\u001b8","kf21":"\u001b\u0013\u001b9","kf22":"\u001b\u0013\u001b0","kf23":"\u001b\u0013\u001b!","kf24":"\u001b\u0013\u001b@","kf25":"\u001b\u0003\u001b1","kf26":"\u001b\u0003\u001b2","kf27":"\u001b\u0003\u001b3","kf28":"\u001b\u0003\u001b4","kf29":"\u001b\u0003\u001b5","kf30":"\u001b\u0003\u001b6","kf31":"\u001b\u0003\u001b7","kf32":"\u001b\u0003\u001b8","kf33":"\u001b\u0003\u001b9","kf34":"\u001b\u0003\u001b0","kf35":"\u001b\u0003\u001b!","kf36":"\u001b\u0003\u001b@","kf37":"\u001b\u0001\u001b1","kf38":"\u001b\u0001\u001b2","kf39":"\u001b\u0001\u001b3","kf40":"\u001b\u0001\u001b4","kf41":"\u001b\u0001\u001b5","kf42":"\u001b\u0001\u001b6","kf43":"\u001b\u0001\u001b7","kf44":"\u001b\u0001\u001b8","kf45":"\u001b\u0001\u001b9","kf46":"\u001b\u0001\u001b0","kf47":"\u001b\u0001\u001b!","kf48":"\u001b\u0001\u001b@","kich":"\u001b+","kdch":"\u001b-","khome":"\u001bh","kend":"\u001bk","kpp":"\u001b?","knp":"\u001b/","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ms-vt100","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"ms-vt100+","aliases":["vt100+"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001b1","kf2":"\u001b2","kf3":"\u001b3","kf4":"\u001b4","kf5":"\u001b5","kf6":"\u001b6","kf7":"\u001b7","kf8":"\u001b8","kf9":"\u001b9","kf10":"\u001b0","kf11":"\u001b!","kf12":"\u001b@","kf13":"\u001b\u0013\u001b1","kf14":"\u001b\u0013\u001b2","kf15":"\u001b\u0013\u001b3","kf16":"\u001b\u0013\u001b4","kf17":"\u001b\u0013\u001b5","kf18":"\u001b\u0013\u001b6","kf19":"\u001b\u0013\u001b7","kf20":"\u001b\u0013\u001b8","kf21":"\u001b\u0013\u001b9","kf22":"\u001b\u0013\u001b0","kf23":"\u001b\u0013\u001b!","kf24":"\u001b\u0013\u001b@","kf25":"\u001b\u0003\u001b1","kf26":"\u001b\u0003\u001b2","kf27":"\u001b\u0003\u001b3","kf28":"\u001b\u0003\u001b4","kf29":"\u001b\u0003\u001b5","kf30":"\u001b\u0003\u001b6","kf31":"\u001b\u0003\u001b7","kf32":"\u001b\u0003\u001b8","kf33":"\u001b\u0003\u001b9","kf34":"\u001b\u0003\u001b0","kf35":"\u001b\u0003\u001b!","kf36":"\u001b\u0003\u001b@","kf37":"\u001b\u0001\u001b1","kf38":"\u001b\u0001\u001b2","kf39":"\u001b\u0001\u001b3","kf40":"\u001b\u0001\u001b4","kf41":"\u001b\u0001\u001b5","kf42":"\u001b\u0001\u001b6","kf43":"\u001b\u0001\u001b7","kf44":"\u001b\u0001\u001b8","kf45":"\u001b\u0001\u001b9","kf46":"\u001b\u0001\u001b0","kf47":"\u001b\u0001\u001b!","kf48":"\u001b\u0001\u001b@","kich":"\u001b+","kdch":"\u001b-","khome":"\u001bh","kend":"\u001bk","kpp":"\u001b?","knp":"\u001b/","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ms-vt100-color","aliases":["vtnt"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"msk227","aliases":["mskermit227"],"cols":80,"lines":24,"clear":"\u001bE","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"msk22714","aliases":["mskermit22714"],"cols":80,"lines":24,"clear":"\u001bE","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\u001b1","kf2":"\u001b2","kf3":"\u001b3","kf4":"\u001b4","kf5":"\u001b5","kf6":"\u001b6","kf7":"\u001b7","kf8":"\u001b8","kf9":"\u001b9","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"msk227am","aliases":["mskermit227am"],"cols":80,"lines":24,"clear":"\u001bE","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"mt4520-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[0V\u001b8","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"mt70","aliases":["mt-70"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","smcup":"\u001b\"2\u001bG0\u001b]","cnorm":"\u001b\"2","civis":"\u001b\"0","sgr0":"\u001bG0","smul":"\u001bG1","rev":"\u001bG4","dim":"\u001bG2","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c1\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001`\r","kf12":"\u0001a\r","kf13":"\u0001b\r","kf14":"\u0001c\r","kf15":"\u0001d\r","kf16":"\u0001e\r","kf17":"\u0001f\r","kf18":"\u0001g\r","kf19":"\u0001h\r","kf20":"\u0001i\r","kdch":"","khome":"\u0001N\r","khlp":"\u0001O\r","kcuu1":"\u0001J\r","kcud1":"\u0001K\r","kcub1":"\u0001L\r","kcuf1":"\u0001M\r","kcbt":"\u0001\u001a\r","kclr":"\u0001n\r","acsc":"+z,{-x.yOi`|jGkFlEmDnHqJtLuKvNwMxI","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"mterm","aliases":["mouse-sun"],"cols":-1,"lines":-1,"bell":"\u0007","clear":"\u000c","cup":"\u0006%p1%d.%p2%d.","cub1":"\u0008","cuu1":"\u0018","pad":"\u0000","kbs":"\u0008"} -{"name":"mterm-ansi","cols":-1,"lines":-1,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"mvterm","aliases":["vv100"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"nansi.sys","aliases":["nansisys"],"cols":80,"lines":25,"colors":8,"clear":"\u001b[2J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"nansi.sysk","aliases":["nansisysk"],"cols":80,"lines":25,"colors":8,"clear":"\u001b[2J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[;71;30p\u001b[;72;11p\u001b[;73;27;21p\u001b[;77;12p\u001b[;80;10p\u001b[;81;27;4p\u001b[;82;27;27;105p\u001b[;83;127p","rmkx":"\u001b[;71;0;71p\u001b[;72;0;72p\u001b[;73;0;73p\u001b[;77;0;77p\u001b[;80;0;80p\u001b[;81;0;81p\u001b[;82;0;82p\u001b[;83;0;83p","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ncr160vppp","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c40\u003e","cnorm":"\u001b`5","civis":"\u001b`0","sgr0":"\u001bG0\u001bH\u0003","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c$\u003c5\u003e","cub1":"\u0008$\u003c2\u003e","cuu1":"\u001a$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u00021\r","kf2":"\u00022\r","kf3":"\u00023\r","kf4":"\u00024\r","kf5":"\u00025\r","kf6":"\u00026\r","kf7":"\u00027\r","kf8":"\u00028\r","kf9":"\u00029\r","kf10":"\u0002:\r","kf11":"\u0002;\r","kf12":"\u0002\u003c\r","kf13":"\u0002=\r","kf14":"\u0002\u003e\r","kf15":"\u0002?\r","kf16":"\u0002@\r","kf17":"\u0002!\r","kf18":"\u0002\"\r","kf19":"\u0002#\r","kf20":"\u0002$\r","kf21":"\u0002%^M","kf22":"\u0002\u0026\r","kf23":"\u0002'\r","kf24":"\u0002(\r","kf25":"\u0002)\r","kf26":"\u0002*\r","kf27":"\u0002+\r","kf28":"\u0002,\r","kf29":"\u0002-\r","kf30":"\u0002.\r","kf31":"\u0002/\r","kf32":"\u00020\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u0001","kend":"\u001bK","kpp":"\u001bJ","knp":"\u001bJ","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bcB1\u001bH\u0002","rmacs":"\u001bcB0\u001bH\u0003","kRIT":"\u0006","kHOM":"\u0001","kEND":"\u001bk"} -{"name":"ncr160vpwpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c40\u003e","cnorm":"\u001b`5","civis":"\u001b`0","sgr0":"\u001bG0\u001bH\u0003","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC$\u003c30\u003e","cub1":"\u0008$\u003c2\u003e","cuu1":"\u001a$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u00021\r","kf2":"\u00022\r","kf3":"\u00023\r","kf4":"\u00024\r","kf5":"\u00025\r","kf6":"\u00026\r","kf7":"\u00027\r","kf8":"\u00028\r","kf9":"\u00029\r","kf10":"\u0002:\r","kf11":"\u0002;\r","kf12":"\u0002\u003c\r","kf13":"\u0002=\r","kf14":"\u0002\u003e\r","kf15":"\u0002?\r","kf16":"\u0002@\r","kf17":"\u0002!\r","kf18":"\u0002\"\r","kf19":"\u0002#\r","kf20":"\u0002$\r","kf21":"\u0002%^M","kf22":"\u0002\u0026\r","kf23":"\u0002'\r","kf24":"\u0002(\r","kf25":"\u0002)\r","kf26":"\u0002*\r","kf27":"\u0002+\r","kf28":"\u0002,\r","kf29":"\u0002-\r","kf30":"\u0002.\r","kf31":"\u0002/\r","kf32":"\u00020\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u0001","kend":"\u001bK","kpp":"\u001bJ","knp":"\u001bJ","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bcB1\u001bH\u0002","rmacs":"\u001bcB0\u001bH\u0003","kRIT":"\u0006","kHOM":"\u0001","kEND":"\u001bk"} -{"name":"ncr160vt100an","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"ncr160vt100pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b[1~","kdch":"\u001b[4~","khome":"\u001b[2~","kend":"\u001b[5~","khlp":"\u001b[28~","kpp":"\u001b[3~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"ncr160vt100wan","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"ncr160vt100wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b[1~","kdch":"\u001b[4~","khome":"\u001b[2~","kend":"\u001b[5~","khlp":"\u001b[28~","kpp":"\u001b[3~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"ncr160vt200an","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr160vt200pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[4~","khome":"\u001b[H","kend":"\u001b[1~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr160vt200wan","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr160vt200wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[4~","khome":"\u001b[H","kend":"\u001b[1~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr160vt300an","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr160vt300pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[4~","khome":"\u001b[H","kend":"\u001b[1~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr160vt300wan","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr160vt300wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[4~","khome":"\u001b[H","kend":"\u001b[1~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr160wy50+pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bH\u0003$\u003c15\u003e","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c30\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr160wy50+wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bH\u0003$\u003c15\u003e","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC$\u003c30\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr160wy60pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c100\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bcB0\u001bcD$\u003c15\u003e","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c10\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI$\u003c15\u003e","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr160wy60wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c100\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bcB0\u001bcD$\u003c15\u003e","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","cup":"\u001ba%i%p1%dR%p2%dC$\u003c30\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI$\u003c15\u003e","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr260intan","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ncr260intpp","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[4~","khome":"\u001b[H","kend":"\u001b[1~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ncr260intwan","cols":132,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ncr260intwpp","cols":132,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[4~","khome":"\u001b[H","kend":"\u001b[1~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ncr260vppp","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c40\u003e","cnorm":"\u001b`5","civis":"\u001b`0","sgr0":"\u001bG0\u001bH\u0003","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c$\u003c5\u003e","cub1":"\u0008$\u003c2\u003e","cuu1":"\u001a$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u00021\r","kf2":"\u00022\r","kf3":"\u00023\r","kf4":"\u00024\r","kf5":"\u00025\r","kf6":"\u00026\r","kf7":"\u00027\r","kf8":"\u00028\r","kf9":"\u00029\r","kf10":"\u0002:\r","kf11":"\u0002;\r","kf12":"\u0002\u003c\r","kf13":"\u0002=\r","kf14":"\u0002\u003e\r","kf15":"\u0002?\r","kf16":"\u0002@\r","kf17":"\u0002!\r","kf18":"\u0002\"\r","kf19":"\u0002#\r","kf20":"\u0002$\r","kf21":"\u0002%^M","kf22":"\u0002\u0026\r","kf23":"\u0002'\r","kf24":"\u0002(\r","kf25":"\u0002)\r","kf26":"\u0002*\r","kf27":"\u0002+\r","kf28":"\u0002,\r","kf29":"\u0002-\r","kf30":"\u0002.\r","kf31":"\u0002/\r","kf32":"\u00020\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u0001","kend":"\u001bK","kpp":"\u001bJ","knp":"\u001bJ","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bcB1\u001bH\u0002","rmacs":"\u001bcB0\u001bH\u0003","kRIT":"\u0006","kHOM":"\u0001","kEND":"\u001bk"} -{"name":"ncr260vpwpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c40\u003e","cnorm":"\u001b`5","civis":"\u001b`0","sgr0":"\u001bG0\u001bH\u0003","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC$\u003c30\u003e","cub1":"\u0008$\u003c2\u003e","cuu1":"\u001a$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u00021\r","kf2":"\u00022\r","kf3":"\u00023\r","kf4":"\u00024\r","kf5":"\u00025\r","kf6":"\u00026\r","kf7":"\u00027\r","kf8":"\u00028\r","kf9":"\u00029\r","kf10":"\u0002:\r","kf11":"\u0002;\r","kf12":"\u0002\u003c\r","kf13":"\u0002=\r","kf14":"\u0002\u003e\r","kf15":"\u0002?\r","kf16":"\u0002@\r","kf17":"\u0002!\r","kf18":"\u0002\"\r","kf19":"\u0002#\r","kf20":"\u0002$\r","kf21":"\u0002%^M","kf22":"\u0002\u0026\r","kf23":"\u0002'\r","kf24":"\u0002(\r","kf25":"\u0002)\r","kf26":"\u0002*\r","kf27":"\u0002+\r","kf28":"\u0002,\r","kf29":"\u0002-\r","kf30":"\u0002.\r","kf31":"\u0002/\r","kf32":"\u00020\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u0001","kend":"\u001bK","kpp":"\u001bJ","knp":"\u001bJ","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bcB1\u001bH\u0002","rmacs":"\u001bcB0\u001bH\u0003","kRIT":"\u0006","kHOM":"\u0001","kEND":"\u001bk"} -{"name":"ncr260vt100an","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"ncr260vt100pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b[1~","kdch":"\u001b[4~","khome":"\u001b[2~","kend":"\u001b[5~","khlp":"\u001b[28~","kpp":"\u001b[3~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"ncr260vt100wan","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"ncr260vt100wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kich":"\u001b[1~","kdch":"\u001b[4~","khome":"\u001b[2~","kend":"\u001b[5~","khlp":"\u001b[28~","kpp":"\u001b[3~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"ncr260vt200an","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr260vt200pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[4~","khome":"\u001b[H","kend":"\u001b[1~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr260vt200wan","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr260vt200wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[4~","khome":"\u001b[H","kend":"\u001b[1~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr260vt300an","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr260vt300pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[4~","khome":"\u001b[H","kend":"\u001b[1~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr260vt300wan","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c20\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f$\u003c20\u003e","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c30\u003e","cub1":"\u001b[D$\u003c5\u003e","cuu1":"\u001b[A$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[31~","kf22":"\u001b[32~","kf23":"\u001b[33~","kf24":"\u001b[34~","kf25":"\u001b[35~","kf26":"\u001b[1~","kf27":"\u001b[2~","kf28":"\u001b[3~","kf29":"\u001b[4~","kf30":"\u001b[5~","kf31":"\u001b[6~","kf32":"\u001b[7~","kf33":"\u001b[8~","kf34":"\u001b[9~","kf35":"\u001b[10~","kich":"\u001b[2~","kdch":"\u001b[3~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u000e$\u003c20\u003e","rmacs":"\u000f$\u003c20\u003e"} -{"name":"ncr260wy325pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c10\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bcB0\u001bcD$\u003c15\u003e","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c10\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bH\u0002\u001bcB1","rmacs":"\u001bH\u0003\u001bcB0","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr260wy325wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c10\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bcB0\u001bcD$\u003c15\u003e","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","cup":"\u001ba%i%p1%dR%p2%dC$\u003c30\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bH\u0002\u001bcB1","rmacs":"\u001bH\u0003\u001bcB0","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr260wy350pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bH\u0003\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c40\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bH\u0002\u001bcB1","rmacs":"\u001bH\u0003\u001bcB0","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr260wy350wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bH\u0003\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC$\u003c30\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bH\u0002\u001bcB1","rmacs":"\u001bH\u0003\u001bcB0","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr260wy50+pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bH\u0003$\u003c15\u003e","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c30\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr260wy50+wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bH\u0003$\u003c15\u003e","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC$\u003c30\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr260wy60pp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c100\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bcB0\u001bcD$\u003c15\u003e","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c10\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI$\u003c15\u003e","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr260wy60wpp","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c100\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001bcB0\u001bcD$\u003c15\u003e","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","cup":"\u001ba%i%p1%dR%p2%dC$\u003c30\u003e","cub1":"\u0008$\u003c5\u003e","cuu1":"\u000b$\u003c5\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kf17":"\u0001`\r","kf18":"\u0001a\r","kf19":"\u0001b\r","kf20":"\u0001c\r","kf21":"\u0001d\r","kf22":"\u0001e\r","kf23":"\u0001f\r","kf24":"\u0001g\r","kf25":"\u0001h\r","kf26":"\u0001i\r","kf27":"\u0001j\r","kf28":"\u0001k\r","kf29":"\u0001l\r","kf30":"\u0001m\r","kf31":"\u0001n\r","kf32":"\u0001o\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kend":"\u001bT","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI$\u003c15\u003e","kprt":"\u001bP","acsc":"07a?h;j5k3l2m1n8q:t4u9v=w0x6","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kRIT":"\u000c","kHOM":"\u001b{","kEND":"\u001bY"} -{"name":"ncr7900i","aliases":["ncr7900"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b0@","smul":"\u001b0`","blink":"\u001b0B","rev":"\u001b0P","dim":"\u001b0A","cup":"\u001b1%p2%c%p1%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"ncr7900iv","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cup":"\u000b%p1%'@'%+%c\u001b\u0005%p2%02d","cub1":"\u0008","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"ncr7901","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u0018","civis":"\u0017","sgr0":"\u000f","smul":"\u001b0`\u000e","blink":"\u001b0B","rev":"\u001b0P","dim":"\u001b0A","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","khome":"\u0008","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006","kclr":"\u000c"} -{"name":"ncrvt100an","aliases":["ncrvt100pp"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c300\u003e","sgr0":"\u000f\u001b[0m$\u003c120\u003e","smul":"\u001b[4m$\u003c30\u003e","bold":"\u001b[1m$\u003c30\u003e","blink":"\u001b[5m$\u003c30\u003e","rev":"\u001b[7m$\u003c30\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c100\u003e","cub1":"\u001b[D$\u003c2\u003e","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffgghhiijjkkllmmnnqqttuuvvwwxxyyzz~~","smacs":"\u000e$\u003c90\u003e","rmacs":"\u000f$\u003c90\u003e","enacs":"\u001b(B\u001b)0$\u003c40\u003e","kRIT":"\u001b[C","kLFT":"\u001b[D"} -{"name":"ncrvt100wan","aliases":["NCRVT100WPP","ncrvt100wpp"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[1;1H$\u003c300\u003e","sgr0":"\u000f\u001b[0m$\u003c120\u003e","smul":"\u001b[4m$\u003c30\u003e","bold":"\u001b[1m$\u003c30\u003e","blink":"\u001b[5m$\u003c30\u003e","rev":"\u001b[7m$\u003c30\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c100\u003e","cub1":"\u001b[D$\u003c2\u003e","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffgghhiijjkkllmmnnqqttuuvvwwxxyyzz~~","smacs":"\u000e$\u003c90\u003e","rmacs":"\u000f$\u003c90\u003e","enacs":"\u001b(B\u001b)0$\u003c40\u003e","kRIT":"\u001b[C","kLFT":"\u001b[D"} -{"name":"ncsa","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7","rmcup":"\u001b[2J\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kf13":"\u001b[32~","kf14":"\u001b[33~","kf15":"\u001b[34~","kdch":"\u001b[4~","khome":"\u001b[2~","kend":"\u001b[5~","khlp":"\u001b[1~","kpp":"\u001b[3~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ncsa-m","aliases":["ncsa-vt220-8"],"cols":-1,"lines":-1,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7","rmcup":"\u001b[2J\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kf13":"\u001b[32~","kf14":"\u001b[33~","kf15":"\u001b[34~","kdch":"\u001b[4~","khome":"\u001b[2~","kend":"\u001b[5~","khlp":"\u001b[1~","kpp":"\u001b[3~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b)0"} -{"name":"ncsa-m-ns","cols":-1,"lines":-1,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7","rmcup":"\u001b[2J\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kf13":"\u001b[32~","kf14":"\u001b[33~","kf15":"\u001b[34~","kdch":"\u001b[4~","khome":"\u001b[2~","kend":"\u001b[5~","khlp":"\u001b[1~","kpp":"\u001b[3~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b)0"} -{"name":"ncsa-ns","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7","rmcup":"\u001b[2J\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kf13":"\u001b[32~","kf14":"\u001b[33~","kf15":"\u001b[34~","kdch":"\u001b[4~","khome":"\u001b[2~","kend":"\u001b[5~","khlp":"\u001b[1~","kpp":"\u001b[3~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ncsa-vt220","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7","rmcup":"\u001b[2J\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[21~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kdch":"\u001b[4~","khome":"\u001b[2~","kend":"\u001b[5~","khlp":"\u001b[1~","kpp":"\u001b[3~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ndr9500","aliases":["nd9500"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b;","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0\u001b%%\u001b(","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001a","kprt":"\u001bP","acsc":"qKnImAjDwNuLtMvOlBkCxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"ndr9500-25","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b;","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0\u001b%%\u001b(","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001a","kprt":"\u001bP","acsc":"qKnImAjDwNuLtMvOlBkCxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"ndr9500-25-mc","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b;","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0\u001b%%\u001b(","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001a","kprt":"\u001bP","acsc":"qKnImAjDwNuLtMvOlBkCxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"ndr9500-25-mc-nl","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b;","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0\u001b%%\u001b(","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001a","kprt":"\u001bP","acsc":"qKnImAjDwNuLtMvOlBkCxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"ndr9500-25-nl","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b;","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0\u001b%%\u001b(","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001a","kprt":"\u001bP","acsc":"qKnImAjDwNuLtMvOlBkCxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"ndr9500-mc","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b;","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0\u001b%%\u001b(","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001a","kprt":"\u001bP","acsc":"qKnImAjDwNuLtMvOlBkCxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"ndr9500-mc-nl","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b;","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0\u001b%%\u001b(","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001a","kprt":"\u001bP","acsc":"qKnImAjDwNuLtMvOlBkCxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"ndr9500-nl","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b;","cnorm":"\u001b.1","civis":"\u001b.0","sgr0":"\u001bG0\u001b%%\u001b(","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001a","kprt":"\u001bP","acsc":"qKnImAjDwNuLtMvOlBkCxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"news-old-unk","cols":80,"lines":-1,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"news-unk","cols":80,"lines":-1,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"news28","cols":80,"lines":28,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"news29","aliases":["news28-a"],"cols":80,"lines":29,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"next","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"northstar","cols":80,"lines":24,"clear":"\u0004$\u003c200/\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c1/\u003e","pad":"\u0000"} -{"name":"nsterm","aliases":["Apple_Terminal"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"0#`\ufffda:f\ufffdg\ufffdh#i\ufffdjjkkllmmnno\ufffdp\ufffdq\ufffdrrssttuuvvwwxxy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd+\ufffd-\ufffd,\ufffd.\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"nsterm+7","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"nsterm+acs","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"nsterm+mac","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"0#`\ufffda:f\ufffdg\ufffdh#i\ufffdjjkkllmmnno\ufffdp\ufffdq\ufffdrrssttuuvvwwxxy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd+\ufffd-\ufffd,\ufffd.\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"nsterm-16color","cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"nsterm-7","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"nsterm-7-c","aliases":["nsterm-c-7"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"nsterm-acs","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"nsterm-c","cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"0#`\ufffda:f\ufffdg\ufffdh#i\ufffdjjkkllmmnno\ufffdp\ufffdq\ufffdrrssttuuvvwwxxy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd+\ufffd-\ufffd,\ufffd.\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"nsterm-c-acs","aliases":["nsterm-acs-c"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"nsterm-c-s","cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"0#`\ufffda:f\ufffdg\ufffdh#i\ufffdjjkkllmmnno\ufffdp\ufffdq\ufffdrrssttuuvvwwxxy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd+\ufffd-\ufffd,\ufffd.\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"nsterm-c-s-7","aliases":["nsterm-7-c-s"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"nsterm-c-s-acs","aliases":["nsterm-acs-c-s"],"cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"nsterm-m","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"0#`\ufffda:f\ufffdg\ufffdh#i\ufffdjjkkllmmnno\ufffdp\ufffdq\ufffdrrssttuuvvwwxxy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd+\ufffd-\ufffd,\ufffd.\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"nsterm-m-7","aliases":["nsterm-7-m"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"nsterm-m-acs","aliases":["nsterm-acs-m"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"nsterm-m-s","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"0#`\ufffda:f\ufffdg\ufffdh#i\ufffdjjkkllmmnno\ufffdp\ufffdq\ufffdrrssttuuvvwwxxy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd+\ufffd-\ufffd,\ufffd.\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"nsterm-m-s-7","aliases":["nsterm-7-m-s"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"nsterm-m-s-acs","aliases":["nsterm-acs-m-s"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"nsterm-s","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"0#`\ufffda:f\ufffdg\ufffdh#i\ufffdjjkkllmmnno\ufffdp\ufffdq\ufffdrrssttuuvvwwxxy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd+\ufffd-\ufffd,\ufffd.\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"nsterm-s-7","aliases":["nsterm-7-s"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"nsterm-s-acs","aliases":["nsterm-acs-s"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"nwp511","aliases":["nwp-511"],"cols":80,"lines":24,"clear":"\u001b[;H\u001b[2J$\u003c20/\u003e","smul":"\u001b[4m$\u003c2/\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cuu1":"\u001b[A$\u003c2/\u003e","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001b#W","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"nwp512","aliases":["news","news40","nwp514","vt100-bm"],"cols":80,"lines":40,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"nwp512-a","aliases":["news-a","news40-a","news42","nwp514-a"],"cols":80,"lines":42,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"nwp512-o","aliases":["news-o","news40-o","nwp514-o","vt100-bm-o"],"cols":80,"lines":40,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"nwp513","aliases":["news31","newscbm","nwe501","nwp518"],"cols":80,"lines":31,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"nwp513-a","aliases":["news31-a","news33","newscbm-a","newscbm33","nwe501-a","nwp251-a","nwp518-a"],"cols":80,"lines":33,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"nwp513-o","aliases":["news31-o","newscbm-o","nwe501-o","nwp251-o","nwp518-o"],"cols":80,"lines":31,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"nwp517","aliases":["nwp-517"],"cols":80,"lines":30,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0"} -{"name":"nwp517-w","aliases":["nwp-517-w"],"cols":132,"lines":50,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0"} -{"name":"oblit","aliases":["ojerq"],"cols":88,"lines":72,"bell":"\u0007","clear":"\u000c","cup":"\u001bY%p2%' '%+%c%p1%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008"} -{"name":"oc100","aliases":["c100-1p","oconcept"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b?\u001b\u0005$\u003c2*\u003e","smcup":"\u001bU\u001bv 8p\u001bp\r\u001b\u0015$\u003c16\u003e","rmcup":"\u001bv $\u003c6\u003e\u001bp\r\n","sgr0":"\u001bN@","smul":"\u001bG","blink":"\u001bC","rev":"\u001bD","dim":"\u001bE","smkx":"\u001bX","rmkx":"\u001bx","cup":"\u001ba%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001b;","pad":"\u0000","kbs":"\u0008","kf1":"\u001b5","kf2":"\u001b6","kf3":"\u001b7","kf4":"\u001b8","kf5":"\u001b9","kf6":"\u001b:a","kf7":"\u001b:b","kf8":"\u001b:c","kich":"\u001b\u0010","kdch":"\u001b\u0011","khome":"\u001b?","kpp":"\u001b.","knp":"\u001b-","kcuu1":"\u001b;","kcud1":"\u001b\u003c","kcub1":"\u001b\u003e","kcuf1":"\u001b=","kcbt":"\u001b'"} -{"name":"ofcons","cols":80,"lines":30,"bell":"\u0007","clear":"\u000c","sgr0":"\ufffd0m","bold":"\ufffd1m","blink":"\ufffd7;2m","rev":"\ufffd7m","dim":"\ufffd2m","cup":"\ufffd%i%p1%d;%p2%dH","cub1":"\ufffdD","cuu1":"\ufffdA","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd0P","kf2":"\ufffd0Q","kf3":"\ufffd0W","kf4":"\ufffd0x","kf5":"\ufffd0t","kf6":"\ufffd0u","kf7":"\ufffd0q","kf8":"\ufffd0r","kf9":"\ufffd0p","kf10":"\ufffd0M","kdch":"\ufffdP","kpp":"\ufffd?","knp":"\ufffd/","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC"} -{"name":"oldsun","cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"opennt-100","aliases":["ntconsole-100"],"cols":80,"lines":100,"colors":8,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[s\u001b[1b","rmcup":"\u001b[2b\u001b[u\r\u001b[K","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-100-nti","aliases":["ntconsole-100-nti"],"cols":80,"lines":100,"colors":8,"bell":"\u0007","clear":"\u001b[2J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-35","aliases":["ntconsole-35"],"cols":80,"lines":35,"colors":8,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[s\u001b[1b","rmcup":"\u001b[2b\u001b[u\r\u001b[K","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-35-nti","aliases":["ntconsole-35-nti"],"cols":80,"lines":35,"colors":8,"bell":"\u0007","clear":"\u001b[2J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-35-w","aliases":["ntconsole-35-w"],"cols":125,"lines":35,"colors":8,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[s\u001b[1b","rmcup":"\u001b[2b\u001b[u\r\u001b[K","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-50","aliases":["ntconsole-50"],"cols":80,"lines":50,"colors":8,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[s\u001b[1b","rmcup":"\u001b[2b\u001b[u\r\u001b[K","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-50-nti","aliases":["ntconsole-50-nti"],"cols":80,"lines":50,"colors":8,"bell":"\u0007","clear":"\u001b[2J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-50-w","aliases":["ntconsole-50-w"],"cols":125,"lines":50,"colors":8,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[s\u001b[1b","rmcup":"\u001b[2b\u001b[u\r\u001b[K","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-60","aliases":["ntconsole-60"],"cols":80,"lines":60,"colors":8,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[s\u001b[1b","rmcup":"\u001b[2b\u001b[u\r\u001b[K","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-60-nti","aliases":["ntconsole-60-nti"],"cols":80,"lines":60,"colors":8,"bell":"\u0007","clear":"\u001b[2J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-60-w","aliases":["ntconsole-60-w"],"cols":125,"lines":60,"colors":8,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[s\u001b[1b","rmcup":"\u001b[2b\u001b[u\r\u001b[K","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-w","aliases":["ntconsole-25-w","ntconsole-w","opennt-25-w"],"cols":125,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[s\u001b[1b","rmcup":"\u001b[2b\u001b[u\r\u001b[K","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opennt-w-vt","aliases":["ntconsole-25-w-vt","ntconsole-w-vt","opennt-25-w-vt"],"cols":132,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[s\u001b[1b","rmcup":"\u001b[2b\u001b[u\r\u001b[K","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bF1","kf2":"\u001bF2","kf3":"\u001bF3","kf4":"\u001bF4","kf5":"\u001bF5","kf6":"\u001bF6","kf7":"\u001bF7","kf8":"\u001bF8","kf9":"\u001bF9","kf10":"\u001bFA","kf11":"\u001bFB","kf12":"\u001bFC","kf13":"\u001bFD","kf14":"\u001bFE","kf15":"\u001bFF","kf16":"\u001bFG","kf17":"\u001bFH","kf18":"\u001bFI","kf19":"\u001bFJ","kf20":"\u001bFK","kf21":"\u001bFL","kf22":"\u001bFM","kf23":"\u001bFN","kf24":"\u001bFO","kf25":"\u001bFP","kf26":"\u001bFQ","kf27":"\u001bFR","kf28":"\u001bFS","kf29":"\u001bFT","kf30":"\u001bFU","kf31":"\u001bFV","kf32":"\u001bFW","kf33":"\u001bFX","kf34":"\u001bFY","kf35":"\u001bFZ","kf36":"\u001bFa","kf37":"\u001bFb","kf38":"\u001bFc","kf39":"\u001bFd","kf40":"\u001bFe","kf41":"\u001bFf","kf42":"\u001bFg","kf43":"\u001bFh","kf44":"\u001bFi","kf45":"\u001bFj","kf46":"\u001bFk","kf47":"\u001bFm","kf48":"\u001bFn","kf49":"\u001bFo","kf50":"\u001bFp","kf51":"\u001bFq","kf52":"\u001bFr","kf53":"\u001bFs","kf54":"\u001bFt","kf55":"\u001bFu","kf56":"\u001bFv","kf57":"\u001bFw","kf58":"\u001bFx","kf59":"\u001bFy","kf60":"\u001bFz","kf61":"\u001bF+","kf62":"\u001bF-","kf63":"\u001bF\u000c kf64=\u001bF$","kich":"\u001b[L","kdch":"\u001b[M","kend":"\u001b[U","kpp":"\u001b[S","knp":"\u001b[T","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~q\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd.\u0019-\u0018,\u0011+\u00100\ufffdp\ufffdr\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"opus3n1+","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c100\u003e","smcup":"\u001bzz\u0026\u001b[A\u001bzz'\u001b[B\u001bzz(\u001b[D\u001bzz)\u001b[C\u001bzz\u003c\u001b[Q","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kend":"\u001b[F","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kHOM":"\u001b{"} -{"name":"origpc3","aliases":["origibmpc3"],"cols":80,"lines":25,"clear":"\u001bc","sgr0":"\u001b[m\u001b[1;0x\u001b[2;7x","smul":"\u001b[1;7x\u001b[2;0x","bold":"\u001b[7m","cup":"\u001b[%i%p1%2d;%p2%2dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","khome":"\u001b[Y","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"j\ufffdk\ufffdl\ufffdm\ufffdn\ufffdq\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd"} -{"name":"osborne","aliases":["osborne1"],"cols":80,"lines":24,"clear":"\u001a","smul":"\u001bl","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008$\u003c4\u003e","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"osborne-w","aliases":["osborne1-w"],"cols":104,"lines":24,"bell":"\u0007","clear":"\u001a","smul":"\u001bl","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"osexec","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","smul":"\u001bl","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001A\r","kf2":"\u0001B\r","kf3":"\u0001C\r","kf4":"\u0001D\r","kf5":"\u0001E\r","kf6":"\u0001F\r","kf7":"\u0001G\r","kf8":"\u0001H\r","kf9":"\u0001I\r","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"otek4115","cols":80,"lines":34,"clear":"\u001b[H\u001b[2J","smcup":"\u001b%!0\u001bLBB2\u001b%!1","rmcup":"\u001b%!0\u001bLBG8\u001b%!1\u001b[34;1H\u001b[J","cnorm":"\u001b%!0\u001bLBG8\u001b%!1\u001b[34;1H","sgr0":"\u001b[m","smul":"\u001b[4m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008"} -{"name":"owl","aliases":["pe1200"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ$\u003c132\u003e","sgr0":"\u001b!\ufffd","cup":"\u001bX%p1%' '%+%c\u001bY%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bRA","kf2":"\u001bRB","kf3":"\u001bRC","kf4":"\u001bRD","kf5":"\u001bRE","kf6":"\u001bRF","kf7":"\u001bRG","kf8":"\u001bRH","kf9":"\u001bRI"} -{"name":"p19","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bE","cnorm":"\u001by4","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"~^x`qanbkcjdmelfgg+hai.kwsutvutvozs{","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"p8gl","aliases":["prism8gl"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u0003 ","smul":"\u00030","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0015","cuu1":"\u001a","pad":"\ufffd","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf12":"\u0001J\r","kf13":"\u0001K\r","kf14":"\u0001L\r","kf15":"\u0001M\r","kf16":"\u0001N\r","kf17":"\u0001O\r","kdch":" \u0008","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"pc-coherent","aliases":["coherent","pcz19"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001bE","sgr0":"\u001bq","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"pc-minix","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[0J","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[V","kf2":"\u001b[U","kf3":"\u001b[T","kf4":"\u001b[S","kf5":"\u001b[G","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"pc-venix","aliases":["venix"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","khome":"\u001bG","kcuu1":"\u001bH","kcud1":"\u001bP","kcub1":"\u001bK","kcuf1":"\u001bM"} -{"name":"pc3","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001bc","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kich":"\u001b[L","khome":"\u001b[H","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"pc6300plus","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[=1C","civis":"\u001b[=C","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%2d;%p2%2dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOc","kf2":"\u001bOd","kf3":"\u001bOe","kf4":"\u001bOf","kf5":"\u001bOg","kf6":"\u001bOh","kf7":"\u001bOi","kf8":"\u001bOj","kf9":"\u001bOk","kf10":"\u001bOu","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"pcansi","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"pcansi-25","aliases":["pcansi25"],"cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"pcansi-25-m","aliases":["pcansi25m"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m"} -{"name":"pcansi-33","aliases":["pcansi33"],"cols":80,"lines":33,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"pcansi-33-m","aliases":["pcansi33m"],"cols":80,"lines":33,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m"} -{"name":"pcansi-43","aliases":["pcansi43"],"cols":80,"lines":43,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"pcansi-43-m","aliases":["ansi43m"],"cols":80,"lines":43,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m"} -{"name":"pcansi-m","aliases":["pcansi-mono"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m"} -{"name":"pccons","aliases":["pcconsole"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"pcix","cols":80,"lines":24,"clear":"\u001bc","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%2d;%p2%2dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000"} -{"name":"pckermit","aliases":["pckermit12"],"cols":80,"lines":25,"clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"pckermit120","cols":80,"lines":24,"clear":"\u001bE","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"pcmw","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[;H\u001b[2J$\u003c50/\u003e","sgr0":"\u001b[m$\u003c2/\u003e","smul":"\u001b[4m$\u003c2/\u003e","bold":"\u001b[1m$\u003c2/\u003e","blink":"\u001b[5m$\u003c2/\u003e","rev":"\u001b[7m$\u003c2/\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5/\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2/\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"pcplot","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"pcvt25","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt25-color","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[17~","kf6":"\u001b[18~","kf7":"\u001b[19~","kf8":"\u001b[20~","kf9":"\u001b[21~","kf10":"\u001b[29~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"pcvt25w","cols":132,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt28","cols":80,"lines":28,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt28w","cols":132,"lines":28,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt35","cols":80,"lines":35,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt35w","cols":132,"lines":35,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt40","cols":80,"lines":40,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt40w","cols":132,"lines":40,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt43","cols":80,"lines":43,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt43w","cols":132,"lines":43,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt50","cols":80,"lines":50,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvt50w","cols":132,"lines":50,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pcvtXX","cols":-1,"lines":-1,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"pe1251","aliases":["pe6300","pe6312"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK$\u003c332\u003e","cup":"\u001bX%p1%' '%+%c\u001bY%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kf1":"\u001bRB","kf2":"\u001bRC","kf3":"\u001bRD","kf4":"\u001bRE","kf5":"\u001bRF","kf6":"\u001bRG","kf7":"\u001bRH","kf8":"\u001bRI","kf9":"\u001bRJ","kf10":"\u001bRK"} -{"name":"pe7000c","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK","smul":"\u001b! ","cup":"\u001bS%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001b!\u0001","kf2":"\u001b!\u0002","kf3":"\u001b!\u0003","kf4":"\u001b!\u0004","kf5":"\u001b!\u0005","kf6":"\u001b!\u0006","kf7":"\u001b!\u0007","kf8":"\u001b!\u0008","kf9":"\u001b!\t","kf10":"\u001b!\n","khome":"\u001b!S","kcuu1":"\u001b!T","kcud1":"\u001b!U","kcub1":"\u001b!V","kcuf1":"\u001b!W"} -{"name":"pe7000m","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bK","cup":"\u001bS%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001b!\u0001","kf2":"\u001b!\u0002","kf3":"\u001b!\u0003","kf4":"\u001b!\u0004","kf5":"\u001b!\u0005","kf6":"\u001b!\u0006","kf7":"\u001b!\u0007","kf8":"\u001b!\u0008","kf9":"\u001b!\t","kf10":"\u001b!\n","khome":"\u001b!S","kcuu1":"\u001b!T","kcud1":"\u001b!U","kcub1":"\u001b!V","kcuf1":"\u001b!W"} -{"name":"pilot","aliases":["tgtelnet"],"cols":39,"lines":16,"bell":"\u0007","clear":"\u001bc","cup":"\u001bm%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","pad":"\u0000","kbs":"\u0008","kpp":"\u000b","knp":"\u000c","kcud1":"\n","kcub1":"\u0008"} -{"name":"prism12","aliases":["P12","p12"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001b[\u003c4h","civis":"\u001b[\u003c4l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u000c"} -{"name":"prism12-m","aliases":["P12-M","p12-m"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism12-m-w","aliases":["P12-M-W","p12-m-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism12-w","aliases":["P12-W","p12-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001b[\u003c4h","civis":"\u001b[\u003c4l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u000c"} -{"name":"prism14","aliases":["P14","p14"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001b[\u003c4h","civis":"\u001b[\u003c4l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u000c"} -{"name":"prism14-m","aliases":["P14-M","p14-m"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism14-m-w","aliases":["P14-M-W","p14-m-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism14-w","aliases":["P14-W","p14-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001b[\u003c4h","civis":"\u001b[\u003c4l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u000c"} -{"name":"prism2","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cup":"\u000b%p1%' '%+%c\u0010%p2%{10}%/%{16}%*%p2%{10}%m%+%Pc%?%{17}%gc%=%{19}%gc%=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism4","aliases":["P4","p4"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u000b%p1%' '%+%c\u0010%p2%{10}%/%{16}%*%p2%{10}%m%+%Pc%?%{17}%gc%=%{19}%gc%=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism5","aliases":["P5","p5"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u000b%p1%' '%+%c\u0010%p2%{10}%/%{16}%*%p2%{10}%m%+%Pc%?%{17}%gc%=%{19}%gc%=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism7","aliases":["P7","p7"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism8","aliases":["P8","p8"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism8-w","aliases":["P8-W","p8-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism9","aliases":["P9","p9"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001b[\u003c4h","civis":"\u001b[\u003c4l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u000c"} -{"name":"prism9-8","aliases":["P9-8","p9-8"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism9-8-w","aliases":["P9-8-W","p9-8-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c20\u003e","cnorm":"\u001d\ufffd","civis":"\u001d\ufffd","sgr0":"\u0003 ","smul":"\u0003P","blink":"\u0003B","rev":"\u0003D","dim":"\u0003A","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001"} -{"name":"prism9-w","aliases":["P9-W","p9-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001b[\u003c4h","civis":"\u001b[\u003c4l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u000c"} -{"name":"pro350","aliases":["decpro"],"cols":80,"lines":24,"clear":"\u001bH\u001bJ","smul":"\u001b\u0004","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\u001bF","kf2":"\u001bG","kf3":"\u001bH","kf4":"\u001bI","kf5":"\u001bJ","kf6":"\u001bi","kf7":"\u001bj","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"ps300","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"psterm","aliases":["psterm-basic"],"cols":80,"lines":34,"clear":"\u000c","smcup":"\u001bOt","rmcup":"\u001bNt","sgr0":"\u001bN*","smul":"\u001bOu","bold":"\u001bOd","blink":"\u001bOb","rev":"\u001bOr","cup":"\u001b%p1%d;%p2%d;","cub1":"\u001bT","cuu1":"\u001bY","pad":"\u0000","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"psterm-80x24","cols":80,"lines":24,"clear":"\u000c","smcup":"\u001bOt","rmcup":"\u001bNt","sgr0":"\u001bN*","smul":"\u001bOu","bold":"\u001bOd","blink":"\u001bOb","rev":"\u001bOr","cup":"\u001b%p1%d;%p2%d;","cub1":"\u001bT","cuu1":"\u001bY","pad":"\u0000","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"psterm-90x28","cols":90,"lines":28,"clear":"\u000c","smcup":"\u001bOt","rmcup":"\u001bNt","sgr0":"\u001bN*","smul":"\u001bOu","bold":"\u001bOd","blink":"\u001bOb","rev":"\u001bOr","cup":"\u001b%p1%d;%p2%d;","cub1":"\u001bT","cuu1":"\u001bY","pad":"\u0000","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"psterm-96x48","cols":96,"lines":48,"clear":"\u000c","smcup":"\u001bOt","rmcup":"\u001bNt","sgr0":"\u001bN*","smul":"\u001bOu","bold":"\u001bOd","blink":"\u001bOb","rev":"\u001bOr","cup":"\u001b%p1%d;%p2%d;","cub1":"\u001bT","cuu1":"\u001bY","pad":"\u0000","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"psterm-fast","cols":80,"lines":34,"clear":"\u000c","smcup":"\u000ft","rmcup":"\u000et","sgr0":"\u000e*","smul":"\u000fu","bold":"\u000fd","blink":"\u000fb","rev":"\u000fr","cup":"\u0004%p1%d;%p2%d;","cub1":"\u0014","cuu1":"\u0019","pad":"\u0000","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"pt100","aliases":["fenix","pt200","wren"],"cols":80,"lines":24,"clear":"\u001b?","smcup":"\u001b[\u003e1l\u001b[\u003e2l\u001b[\u003e16l\u001b[4l\u001b[\u003e9l\u001b[20l\u001b[\u003e3l\u001b[\u003e7h\u001b[\u003e12l\u001b[1Q","sgr0":"\u001b[m","smul":"\u001b[4m","dim":"\u001b[2m","smkx":"\u001b[\u003e13h","rmkx":"\u001b[\u003e13l","cup":"\u001b0%p1%'!'%+%c%p2%'!'%+%c","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","khome":"\u001b$A","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"pt100w","aliases":["fenixw","pt200w","wrenw"],"cols":132,"lines":24,"clear":"\u001b?","smcup":"\u001b[\u003e1l\u001b[\u003e2l\u001b[\u003e16l\u001b[4l\u001b[\u003e9l\u001b[20l\u001b[\u003e3l\u001b[\u003e7h\u001b[\u003e12l\u001b[1Q","sgr0":"\u001b[m","smul":"\u001b[4m","dim":"\u001b[2m","smkx":"\u001b[\u003e13h","rmkx":"\u001b[\u003e13l","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","khome":"\u001b$A","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"pt250","cols":80,"lines":24,"clear":"\u001b?","smcup":"\u001b[\u003e1l\u001b[\u003e2l\u001b[\u003e16l\u001b[4l\u001b[\u003e9l\u001b[20l\u001b[\u003e3l\u001b[\u003e7h\u001b[\u003e12l\u001b[1Q","sgr0":"\u001b[m","smul":"\u001b[4m","dim":"\u001b[2m","smkx":"\u001b[\u003e13h","rmkx":"\u001b[\u003e13l","cup":"\u001b0%p1%'!'%+%c%p2%'!'%+%c","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","khome":"\u001b$A","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"pt250w","cols":132,"lines":24,"clear":"\u001b?","smcup":"\u001b[\u003e1l\u001b[\u003e2l\u001b[\u003e16l\u001b[4l\u001b[\u003e9l\u001b[20l\u001b[\u003e3l\u001b[\u003e7h\u001b[\u003e12l\u001b[1Q","sgr0":"\u001b[m","smul":"\u001b[4m","dim":"\u001b[2m","smkx":"\u001b[\u003e13h","rmkx":"\u001b[\u003e13l","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","khome":"\u001b$A","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"pty","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bL","smul":"\u001ba!","cup":"\u001bG%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","khome":"\u001bE","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"putty","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kcan":"\u0003","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"putty-256color","cols":-1,"lines":-1,"colors":256,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kcan":"\u0003","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m"} -{"name":"putty-vt100","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kf11":"\u001bOZ","kf12":"\u001bO[","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kcan":"\u0003","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"qansi","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kf11":"\u001bOZ","kf12":"\u001bOA","kf13":"\u001bOp","kf14":"\u001bOq","kf15":"\u001bOr","kf16":"\u001bOs","kf17":"\u001bOt","kf18":"\u001bOu","kf19":"\u001bOv","kf20":"\u001bOw","kf21":"\u001bOx","kf22":"\u001bOy","kf23":"\u001bOz","kf24":"\u001bOa","kf25":"\u001b[1~","kf26":"\u001b[2~","kf27":"\u001b[3~","kf28":"\u001b[4~","kf29":"\u001b[5~","kf30":"\u001b[6~","kf31":"\u001b[7~","kf32":"\u001b[8~","kf33":"\u001b[9~","kf34":"\u001b[10~","kf35":"\u001b[11~","kf36":"\u001b[12~","kf37":"\u001b[17~","kf38":"\u001b[18~","kf39":"\u001b[19~","kf40":"\u001b[20~","kf41":"\u001b[21~","kf42":"\u001b[22~","kf43":"\u001b[23~","kf44":"\u001b[24~","kf45":"\u001b[25~","kf46":"\u001b[26~","kf47":"\u001b[27~","kf48":"\u001b[28~","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[Y","khlp":"\u001bNh","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001b[y","kclr":"\u001bNa","kcan":"\u001b[S","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~Oa","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[h","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od"} -{"name":"qansi-g","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kf11":"\u001bOZ","kf12":"\u001bOA","kf13":"\u001bOp","kf14":"\u001bOq","kf15":"\u001bOr","kf16":"\u001bOs","kf17":"\u001bOt","kf18":"\u001bOu","kf19":"\u001bOv","kf20":"\u001bOw","kf21":"\u001bOx","kf22":"\u001bOy","kf23":"\u001bOz","kf24":"\u001bOa","kf25":"\u001b[1~","kf26":"\u001b[2~","kf27":"\u001b[3~","kf28":"\u001b[4~","kf29":"\u001b[5~","kf30":"\u001b[6~","kf31":"\u001b[7~","kf32":"\u001b[8~","kf33":"\u001b[9~","kf34":"\u001b[10~","kf35":"\u001b[11~","kf36":"\u001b[12~","kf37":"\u001b[17~","kf38":"\u001b[18~","kf39":"\u001b[19~","kf40":"\u001b[20~","kf41":"\u001b[21~","kf42":"\u001b[22~","kf43":"\u001b[23~","kf44":"\u001b[24~","kf45":"\u001b[25~","kf46":"\u001b[26~","kf47":"\u001b[27~","kf48":"\u001b[28~","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[Y","khlp":"\u001bNh","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001b[y","kclr":"\u001bNa","kcan":"\u001b[S","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~Oa","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[h","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od"} -{"name":"qansi-m","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kf11":"\u001bOZ","kf12":"\u001bOA","kf13":"\u001bOp","kf14":"\u001bOq","kf15":"\u001bOr","kf16":"\u001bOs","kf17":"\u001bOt","kf18":"\u001bOu","kf19":"\u001bOv","kf20":"\u001bOw","kf21":"\u001bOx","kf22":"\u001bOy","kf23":"\u001bOz","kf24":"\u001bOa","kf25":"\u001b[1~","kf26":"\u001b[2~","kf27":"\u001b[3~","kf28":"\u001b[4~","kf29":"\u001b[5~","kf30":"\u001b[6~","kf31":"\u001b[7~","kf32":"\u001b[8~","kf33":"\u001b[9~","kf34":"\u001b[10~","kf35":"\u001b[11~","kf36":"\u001b[12~","kf37":"\u001b[17~","kf38":"\u001b[18~","kf39":"\u001b[19~","kf40":"\u001b[20~","kf41":"\u001b[21~","kf42":"\u001b[22~","kf43":"\u001b[23~","kf44":"\u001b[24~","kf45":"\u001b[25~","kf46":"\u001b[26~","kf47":"\u001b[27~","kf48":"\u001b[28~","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[Y","khlp":"\u001bNh","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001b[y","kclr":"\u001bNa","kcan":"\u001b[S","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~Oa","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[h","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od"} -{"name":"qansi-t","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kf11":"\u001bOZ","kf12":"\u001bOA","kf13":"\u001bOp","kf14":"\u001bOq","kf15":"\u001bOr","kf16":"\u001bOs","kf17":"\u001bOt","kf18":"\u001bOu","kf19":"\u001bOv","kf20":"\u001bOw","kf21":"\u001bOx","kf22":"\u001bOy","kf23":"\u001bOz","kf24":"\u001bOa","kf25":"\u001b[1~","kf26":"\u001b[2~","kf27":"\u001b[3~","kf28":"\u001b[4~","kf29":"\u001b[5~","kf30":"\u001b[6~","kf31":"\u001b[7~","kf32":"\u001b[8~","kf33":"\u001b[9~","kf34":"\u001b[10~","kf35":"\u001b[11~","kf36":"\u001b[12~","kf37":"\u001b[17~","kf38":"\u001b[18~","kf39":"\u001b[19~","kf40":"\u001b[20~","kf41":"\u001b[21~","kf42":"\u001b[22~","kf43":"\u001b[23~","kf44":"\u001b[24~","kf45":"\u001b[25~","kf46":"\u001b[26~","kf47":"\u001b[27~","kf48":"\u001b[28~","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[Y","khlp":"\u001bNh","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001b[y","kclr":"\u001bNa","kcan":"\u001b[S","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~Oa","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[h","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od"} -{"name":"qansi-w","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h\u001b[?12l","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kf11":"\u001bOZ","kf12":"\u001bOA","kf13":"\u001bOp","kf14":"\u001bOq","kf15":"\u001bOr","kf16":"\u001bOs","kf17":"\u001bOt","kf18":"\u001bOu","kf19":"\u001bOv","kf20":"\u001bOw","kf21":"\u001bOx","kf22":"\u001bOy","kf23":"\u001bOz","kf24":"\u001bOa","kf25":"\u001b[1~","kf26":"\u001b[2~","kf27":"\u001b[3~","kf28":"\u001b[4~","kf29":"\u001b[5~","kf30":"\u001b[6~","kf31":"\u001b[7~","kf32":"\u001b[8~","kf33":"\u001b[9~","kf34":"\u001b[10~","kf35":"\u001b[11~","kf36":"\u001b[12~","kf37":"\u001b[17~","kf38":"\u001b[18~","kf39":"\u001b[19~","kf40":"\u001b[20~","kf41":"\u001b[21~","kf42":"\u001b[22~","kf43":"\u001b[23~","kf44":"\u001b[24~","kf45":"\u001b[25~","kf46":"\u001b[26~","kf47":"\u001b[27~","kf48":"\u001b[28~","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b[Y","khlp":"\u001bNh","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kext":"\u001b[y","kclr":"\u001bNa","kcan":"\u001b[S","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~Oa","smacs":"\u000e","rmacs":"\u000f","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[h","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od"} -{"name":"qdss","aliases":["qdcons"],"cols":128,"lines":57,"clear":"\u001a$\u003c1/\u003e","cup":"\u001b=%p1%c%p2%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"qnx","aliases":["qnx4"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001bi","rmcup":"\u001bh\u001bR","cnorm":"\u001by1","civis":"\u001by0","sgr0":"\u001b}\u001b]\u001b\u003e\u001b)","smul":"\u001b[","bold":"\u001b\u003c","blink":"\u001b{","rev":"\u001b(","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\ufffd\ufffd","kf2":"\ufffd\ufffd","kf3":"\ufffd\ufffd","kf4":"\ufffd\ufffd","kf5":"\ufffd\ufffd","kf6":"\ufffd\ufffd","kf7":"\ufffd\ufffd","kf8":"\ufffd\ufffd","kf9":"\ufffd\ufffd","kf10":"\ufffd\ufffd","kf11":"\ufffd\ufffd","kf12":"\ufffd\ufffd","kf13":"\ufffd\ufffd","kf14":"\ufffd\ufffd","kf15":"\ufffd\ufffd","kf16":"\ufffd\ufffd","kf17":"\ufffd\ufffd","kf18":"\ufffd\ufffd","kf19":"\ufffd\ufffd","kf20":"\ufffd\ufffd","kf21":"\ufffd\ufffd","kf22":"\ufffd\ufffd","kf23":"\ufffd\ufffd","kf24":"\ufffd\ufffd","kf25":"\ufffd\ufffd","kf26":"\ufffd\ufffd","kf27":"\ufffd\ufffd","kf28":"\ufffd\ufffd","kf29":"\ufffd\ufffd","kf30":"\ufffd\ufffd","kf31":"\ufffd\ufffd","kf32":"\ufffd\ufffd","kf33":"\ufffd\ufffd","kf34":"\ufffd\ufffd","kf35":"\ufffd\ufffd","kf36":"\ufffd\ufffd","kf37":"\ufffd\ufffd","kf38":"\ufffd\ufffd","kf39":"\ufffd\ufffd","kf40":"\ufffd\ufffd","kf41":"\ufffd\ufffd","kf42":"\ufffd\ufffd","kf43":"\ufffd\ufffd","kf44":"\ufffd\ufffd","kf45":"\ufffd\ufffd","kf46":"\ufffd\ufffd","kf47":"\ufffd\ufffd","kf48":"\ufffd\ufffd","kich":"\ufffd\ufffd","kdch":"\ufffd\ufffd","khome":"\ufffd\ufffd","kend":"\ufffd\ufffd","khlp":"\ufffd\ufffd","kpp":"\ufffd\ufffd","knp":"\ufffd\ufffd","kcuu1":"\ufffd\ufffd","kcud1":"\ufffd\ufffd","kcub1":"\ufffd\ufffd","kcuf1":"\ufffd\ufffd","kcbt":"\ufffd\ufffd","kext":"\ufffd\ufffd","kclr":"\ufffd\ufffd","kprt":"\ufffd\ufffd","kcan":"\ufffd\ufffd","acsc":"O\ufffda\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdq\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","kRIT":"\ufffd\ufffd","kLFT":"\ufffd\ufffd","kHOM":"\ufffd\ufffd","kEND":"\ufffd\ufffd"} -{"name":"qnxm","cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001bi","rmcup":"\u001bh\u001bR","cnorm":"\u001by1","civis":"\u001by0","sgr0":"\u001b}\u001b]\u001b\u003e\u001b)","smul":"\u001b[","bold":"\u001b\u003c","blink":"\u001b{","rev":"\u001b(","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\ufffd\ufffd","kf2":"\ufffd\ufffd","kf3":"\ufffd\ufffd","kf4":"\ufffd\ufffd","kf5":"\ufffd\ufffd","kf6":"\ufffd\ufffd","kf7":"\ufffd\ufffd","kf8":"\ufffd\ufffd","kf9":"\ufffd\ufffd","kf10":"\ufffd\ufffd","kf11":"\ufffd\ufffd","kf12":"\ufffd\ufffd","kf13":"\ufffd\ufffd","kf14":"\ufffd\ufffd","kf15":"\ufffd\ufffd","kf16":"\ufffd\ufffd","kf17":"\ufffd\ufffd","kf18":"\ufffd\ufffd","kf19":"\ufffd\ufffd","kf20":"\ufffd\ufffd","kf21":"\ufffd\ufffd","kf22":"\ufffd\ufffd","kf23":"\ufffd\ufffd","kf24":"\ufffd\ufffd","kf25":"\ufffd\ufffd","kf26":"\ufffd\ufffd","kf27":"\ufffd\ufffd","kf28":"\ufffd\ufffd","kf29":"\ufffd\ufffd","kf30":"\ufffd\ufffd","kf31":"\ufffd\ufffd","kf32":"\ufffd\ufffd","kf33":"\ufffd\ufffd","kf34":"\ufffd\ufffd","kf35":"\ufffd\ufffd","kf36":"\ufffd\ufffd","kf37":"\ufffd\ufffd","kf38":"\ufffd\ufffd","kf39":"\ufffd\ufffd","kf40":"\ufffd\ufffd","kf41":"\ufffd\ufffd","kf42":"\ufffd\ufffd","kf43":"\ufffd\ufffd","kf44":"\ufffd\ufffd","kf45":"\ufffd\ufffd","kf46":"\ufffd\ufffd","kf47":"\ufffd\ufffd","kf48":"\ufffd\ufffd","kich":"\ufffd\ufffd","kdch":"\ufffd\ufffd","khome":"\ufffd\ufffd","kend":"\ufffd\ufffd","khlp":"\ufffd\ufffd","kpp":"\ufffd\ufffd","knp":"\ufffd\ufffd","kcuu1":"\ufffd\ufffd","kcud1":"\ufffd\ufffd","kcub1":"\ufffd\ufffd","kcuf1":"\ufffd\ufffd","kcbt":"\ufffd\ufffd","kext":"\ufffd\ufffd","kclr":"\ufffd\ufffd","kprt":"\ufffd\ufffd","kcan":"\ufffd\ufffd","acsc":"O\ufffda\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdq\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","kRIT":"\ufffd\ufffd","kLFT":"\ufffd\ufffd","kHOM":"\ufffd\ufffd","kEND":"\ufffd\ufffd"} -{"name":"qnxt","aliases":["qnxt4"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001bi","rmcup":"\u001bh\u001bR","cnorm":"\u001by1","civis":"\u001by0","sgr0":"\u001b}\u001b]\u001b\u003e\u001b)","smul":"\u001b[","bold":"\u001b\u003c","blink":"\u001b{","rev":"\u001b(","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\ufffd\ufffd","kf2":"\ufffd\ufffd","kf3":"\ufffd\ufffd","kf4":"\ufffd\ufffd","kf5":"\ufffd\ufffd","kf6":"\ufffd\ufffd","kf7":"\ufffd\ufffd","kf8":"\ufffd\ufffd","kf9":"\ufffd\ufffd","kf10":"\ufffd\ufffd","kf11":"\ufffd\ufffd","kf12":"\ufffd\ufffd","kf13":"\ufffd\ufffd","kf14":"\ufffd\ufffd","kf15":"\ufffd\ufffd","kf16":"\ufffd\ufffd","kf17":"\ufffd\ufffd","kf18":"\ufffd\ufffd","kf19":"\ufffd\ufffd","kf20":"\ufffd\ufffd","kf21":"\ufffd\ufffd","kf22":"\ufffd\ufffd","kf23":"\ufffd\ufffd","kf24":"\ufffd\ufffd","kf25":"\ufffd\ufffd","kf26":"\ufffd\ufffd","kf27":"\ufffd\ufffd","kf28":"\ufffd\ufffd","kf29":"\ufffd\ufffd","kf30":"\ufffd\ufffd","kf31":"\ufffd\ufffd","kf32":"\ufffd\ufffd","kf33":"\ufffd\ufffd","kf34":"\ufffd\ufffd","kf35":"\ufffd\ufffd","kf36":"\ufffd\ufffd","kf37":"\ufffd\ufffd","kf38":"\ufffd\ufffd","kf39":"\ufffd\ufffd","kf40":"\ufffd\ufffd","kf41":"\ufffd\ufffd","kf42":"\ufffd\ufffd","kf43":"\ufffd\ufffd","kf44":"\ufffd\ufffd","kf45":"\ufffd\ufffd","kf46":"\ufffd\ufffd","kf47":"\ufffd\ufffd","kf48":"\ufffd\ufffd","kich":"\ufffd\ufffd","kdch":"\ufffd\ufffd","khome":"\ufffd\ufffd","kend":"\ufffd\ufffd","khlp":"\ufffd\ufffd","kpp":"\ufffd\ufffd","knp":"\ufffd\ufffd","kcuu1":"\ufffd\ufffd","kcud1":"\ufffd\ufffd","kcub1":"\ufffd\ufffd","kcuf1":"\ufffd\ufffd","kcbt":"\ufffd\ufffd","kext":"\ufffd\ufffd","kclr":"\ufffd\ufffd","kprt":"\ufffd\ufffd","kcan":"\ufffd\ufffd","acsc":"O\ufffda\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdq\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","kRIT":"\ufffd\ufffd","kLFT":"\ufffd\ufffd","kHOM":"\ufffd\ufffd","kEND":"\ufffd\ufffd"} -{"name":"qnxt2","cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH\u001bJ","sgr0":"\u001b}\u001b]\u001b\u003e\u001b)","smul":"\u001b[","bold":"\u001b\u003c","blink":"\u001b{","rev":"\u001b(","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\ufffd\ufffd","kf2":"\ufffd\ufffd","kf3":"\ufffd\ufffd","kf4":"\ufffd\ufffd","kf5":"\ufffd\ufffd","kf6":"\ufffd\ufffd","kf7":"\ufffd\ufffd","kf8":"\ufffd\ufffd","kf9":"\ufffd\ufffd","kf10":"\ufffd\ufffd","kf11":"\ufffd\ufffd","kf12":"\ufffd\ufffd","kf13":"\ufffd\ufffd","kf14":"\ufffd\ufffd","kf15":"\ufffd\ufffd","kf16":"\ufffd\ufffd","kf17":"\ufffd\ufffd","kf18":"\ufffd\ufffd","kf19":"\ufffd\ufffd","kf20":"\ufffd\ufffd","kf21":"\ufffd\ufffd","kf22":"\ufffd\ufffd","kf23":"\ufffd\ufffd","kf24":"\ufffd\ufffd","kf25":"\ufffd\ufffd","kf26":"\ufffd\ufffd","kf27":"\ufffd\ufffd","kf28":"\ufffd\ufffd","kf29":"\ufffd\ufffd","kf30":"\ufffd\ufffd","kf31":"\ufffd\ufffd","kf32":"\ufffd\ufffd","kf33":"\ufffd\ufffd","kf34":"\ufffd\ufffd","kf35":"\ufffd\ufffd","kf36":"\ufffd\ufffd","kf37":"\ufffd\ufffd","kf38":"\ufffd\ufffd","kf39":"\ufffd\ufffd","kf40":"\ufffd\ufffd","kf41":"\ufffd\ufffd","kf42":"\ufffd\ufffd","kf43":"\ufffd\ufffd","kf44":"\ufffd\ufffd","kf45":"\ufffd\ufffd","kf46":"\ufffd\ufffd","kf47":"\ufffd\ufffd","kf48":"\ufffd\ufffd","kich":"\ufffd\ufffd","kdch":"\ufffd\ufffd","khome":"\ufffd\ufffd","kend":"\ufffd\ufffd","khlp":"\ufffd\ufffd","kpp":"\ufffd\ufffd","knp":"\ufffd\ufffd","kcuu1":"\ufffd\ufffd","kcud1":"\ufffd\ufffd","kcub1":"\ufffd\ufffd","kcuf1":"\ufffd\ufffd","kcbt":"\ufffd\ufffd","kext":"\ufffd\ufffd","kclr":"\ufffd\ufffd","kprt":"\ufffd\ufffd","kcan":"\ufffd\ufffd","acsc":"O\ufffda\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdq\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","kRIT":"\ufffd\ufffd","kLFT":"\ufffd\ufffd","kHOM":"\ufffd\ufffd","kEND":"\ufffd\ufffd"} -{"name":"qnxtmono","cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001bi","rmcup":"\u001bh\u001bR","cnorm":"\u001by1","civis":"\u001by0","sgr0":"\u001b}\u001b]\u001b\u003e\u001b)","smul":"\u001b[","bold":"\u001b\u003c","blink":"\u001b{","rev":"\u001b(","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\ufffd\ufffd","kf2":"\ufffd\ufffd","kf3":"\ufffd\ufffd","kf4":"\ufffd\ufffd","kf5":"\ufffd\ufffd","kf6":"\ufffd\ufffd","kf7":"\ufffd\ufffd","kf8":"\ufffd\ufffd","kf9":"\ufffd\ufffd","kf10":"\ufffd\ufffd","kf11":"\ufffd\ufffd","kf12":"\ufffd\ufffd","kf13":"\ufffd\ufffd","kf14":"\ufffd\ufffd","kf15":"\ufffd\ufffd","kf16":"\ufffd\ufffd","kf17":"\ufffd\ufffd","kf18":"\ufffd\ufffd","kf19":"\ufffd\ufffd","kf20":"\ufffd\ufffd","kf21":"\ufffd\ufffd","kf22":"\ufffd\ufffd","kf23":"\ufffd\ufffd","kf24":"\ufffd\ufffd","kf25":"\ufffd\ufffd","kf26":"\ufffd\ufffd","kf27":"\ufffd\ufffd","kf28":"\ufffd\ufffd","kf29":"\ufffd\ufffd","kf30":"\ufffd\ufffd","kf31":"\ufffd\ufffd","kf32":"\ufffd\ufffd","kf33":"\ufffd\ufffd","kf34":"\ufffd\ufffd","kf35":"\ufffd\ufffd","kf36":"\ufffd\ufffd","kf37":"\ufffd\ufffd","kf38":"\ufffd\ufffd","kf39":"\ufffd\ufffd","kf40":"\ufffd\ufffd","kf41":"\ufffd\ufffd","kf42":"\ufffd\ufffd","kf43":"\ufffd\ufffd","kf44":"\ufffd\ufffd","kf45":"\ufffd\ufffd","kf46":"\ufffd\ufffd","kf47":"\ufffd\ufffd","kf48":"\ufffd\ufffd","kich":"\ufffd\ufffd","kdch":"\ufffd\ufffd","khome":"\ufffd\ufffd","kend":"\ufffd\ufffd","khlp":"\ufffd\ufffd","kpp":"\ufffd\ufffd","knp":"\ufffd\ufffd","kcuu1":"\ufffd\ufffd","kcud1":"\ufffd\ufffd","kcub1":"\ufffd\ufffd","kcuf1":"\ufffd\ufffd","kcbt":"\ufffd\ufffd","kext":"\ufffd\ufffd","kclr":"\ufffd\ufffd","kprt":"\ufffd\ufffd","kcan":"\ufffd\ufffd","acsc":"O\ufffda\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdq\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","kRIT":"\ufffd\ufffd","kLFT":"\ufffd\ufffd","kHOM":"\ufffd\ufffd","kEND":"\ufffd\ufffd"} -{"name":"qnxw","cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001bi","rmcup":"\u001bh\u001bR","cnorm":"\u001by1","civis":"\u001by0","sgr0":"\u001b}\u001b]\u001b\u003e\u001b)","smul":"\u001b[","bold":"\u001b\u003c","blink":"\u001b{","rev":"\u001b(","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\ufffd\ufffd","kf2":"\ufffd\ufffd","kf3":"\ufffd\ufffd","kf4":"\ufffd\ufffd","kf5":"\ufffd\ufffd","kf6":"\ufffd\ufffd","kf7":"\ufffd\ufffd","kf8":"\ufffd\ufffd","kf9":"\ufffd\ufffd","kf10":"\ufffd\ufffd","kf11":"\ufffd\ufffd","kf12":"\ufffd\ufffd","kf13":"\ufffd\ufffd","kf14":"\ufffd\ufffd","kf15":"\ufffd\ufffd","kf16":"\ufffd\ufffd","kf17":"\ufffd\ufffd","kf18":"\ufffd\ufffd","kf19":"\ufffd\ufffd","kf20":"\ufffd\ufffd","kf21":"\ufffd\ufffd","kf22":"\ufffd\ufffd","kf23":"\ufffd\ufffd","kf24":"\ufffd\ufffd","kf25":"\ufffd\ufffd","kf26":"\ufffd\ufffd","kf27":"\ufffd\ufffd","kf28":"\ufffd\ufffd","kf29":"\ufffd\ufffd","kf30":"\ufffd\ufffd","kf31":"\ufffd\ufffd","kf32":"\ufffd\ufffd","kf33":"\ufffd\ufffd","kf34":"\ufffd\ufffd","kf35":"\ufffd\ufffd","kf36":"\ufffd\ufffd","kf37":"\ufffd\ufffd","kf38":"\ufffd\ufffd","kf39":"\ufffd\ufffd","kf40":"\ufffd\ufffd","kf41":"\ufffd\ufffd","kf42":"\ufffd\ufffd","kf43":"\ufffd\ufffd","kf44":"\ufffd\ufffd","kf45":"\ufffd\ufffd","kf46":"\ufffd\ufffd","kf47":"\ufffd\ufffd","kf48":"\ufffd\ufffd","kich":"\ufffd\ufffd","kdch":"\ufffd\ufffd","khome":"\ufffd\ufffd","kend":"\ufffd\ufffd","khlp":"\ufffd\ufffd","kpp":"\ufffd\ufffd","knp":"\ufffd\ufffd","kcuu1":"\ufffd\ufffd","kcud1":"\ufffd\ufffd","kcub1":"\ufffd\ufffd","kcuf1":"\ufffd\ufffd","kcbt":"\ufffd\ufffd","kext":"\ufffd\ufffd","kclr":"\ufffd\ufffd","kprt":"\ufffd\ufffd","kcan":"\ufffd\ufffd","acsc":"O\ufffda\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo\ufffdq\ufffds\ufffdt\ufffdu\ufffdv\ufffdw\ufffdx\ufffd","kRIT":"\ufffd\ufffd","kLFT":"\ufffd\ufffd","kHOM":"\ufffd\ufffd","kEND":"\ufffd\ufffd"} -{"name":"qvt101","aliases":["qvt108"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.4","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kich":"\u001bQ","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI"} -{"name":"qvt101+","aliases":["qvt101p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.4","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kich":"\u001bQ","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI"} -{"name":"qvt102","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kich":"\u001bQ","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI"} -{"name":"qvt103","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"qvt103-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"qvt119+","aliases":["qvt119","qvt119p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*1","cnorm":"\u001b.4","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"qvt119+-25","aliases":["qvt119p-25"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b*1","cnorm":"\u001b.4","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"qvt119+-25-w","aliases":["qvt119-25-w","qvt119p-25-w"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b*1","cnorm":"\u001b.4","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"qvt119+-w","aliases":["qvt119-w","qvt119p-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b*1","cnorm":"\u001b.4","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"qvt203","aliases":["qvt203+"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[28~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"qvt203-25","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[28~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"qvt203-25-w","cols":132,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[28~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"qvt203-w","aliases":["qvt203-w-am"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[28~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"rbcomm","cols":80,"lines":25,"bell":"\u0007","clear":"\u000c","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u0014","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u0012","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001f%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001e","pad":"\u0000","kbs":"\u0008","khome":"\u0001","kcuu1":"\u0010","kcud1":"\u000e","kcub1":"\u0002","kcuf1":"\u0006"} -{"name":"rbcomm-nam","cols":80,"lines":25,"bell":"\u0007","clear":"\u000c","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u0014","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u0012","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001f%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001e","pad":"\u0000","kbs":"\u0008","khome":"\u0001","kcuu1":"\u0010","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0006"} -{"name":"rbcomm-w","cols":132,"lines":25,"bell":"\u0007","clear":"\u000c","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u0014","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u0012","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001f%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","cuu1":"\u001e","pad":"\u0000","kbs":"\u0008","khome":"\u0001","kcuu1":"\u0010","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0006"} -{"name":"rca","cols":40,"lines":24,"clear":"\u000c","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cuu1":"\u000b","pad":"\u0000"} -{"name":"rcons","cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"rcons-color","cols":80,"lines":34,"colors":8,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"regent100","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b0@","smul":"\u001b0`","cup":"\u000b%p1%' '%+%c\u0010%p2%{10}%/%{16}%*%p2%{10}%m%+%c","cub1":"\u0015","cuu1":"\u001a","pad":"\u0000","kf1":"\u00022\r","kf2":"\u00023\r","kf3":"\u00024\r","kf4":"\u00025\r","kf5":"\u00026\r","kf6":"\u00027\r","kf7":"\u00028\r"} -{"name":"regent20","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0015","cuu1":"\u001a","pad":"\u0000"} -{"name":"regent25","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0015","cuu1":"\u001a","pad":"\u0000","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"regent40","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b0@","smul":"\u001b0`","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0015","cuu1":"\u001a","pad":"\u0000","kf1":"\u00022\r","kf2":"\u00023\r","kf3":"\u00024\r","kf4":"\u00025\r","kf5":"\u00026\r","kf6":"\u00027\r","kf7":"\u00028\r","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"regent40+","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b0@","smul":"\u001b0`","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0015","cuu1":"\u001a","pad":"\u0000","kf1":"\u00022\r","kf2":"\u00023\r","kf3":"\u00024\r","kf4":"\u00025\r","kf5":"\u00026\r","kf6":"\u00027\r","kf7":"\u00028\r","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"regent60","aliases":["regent200"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b0@","smul":"\u001b0`","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0015","cuu1":"\u001a","pad":"\u0000","kf1":"\u00022\r","kf2":"\u00023\r","kf3":"\u00024\r","kf4":"\u00025\r","kf5":"\u00026\r","kf6":"\u00027\r","kf7":"\u00028\r","kich":"\u001bF","kdch":"\u001bE","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"rt6221","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[1;1H\u001b[J","cnorm":"\u001b[\u003e5h\u001b[\u003e9h","civis":"\u001b[\u003e5l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOQ","kf2":"\u001bOR","kf3":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000e","rmacs":"\u000f"} -{"name":"rt6221-w","cols":160,"lines":48,"bell":"\u0007","clear":"\u001b[1;1H\u001b[J","cnorm":"\u001b[\u003e5h\u001b[\u003e9h","civis":"\u001b[\u003e5l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOQ","kf2":"\u001bOR","kf3":"\u001bOS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u000e","rmacs":"\u000f"} -{"name":"rtpc","aliases":["ibmapa16"],"cols":80,"lines":32,"bell":"\u0007","clear":"\u001bK","sgr0":"\u001bw\u001bq\u001bz\u001bB","smul":"\u001bW","bold":"\u001bZ","rev":"\u001bp","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bY","kich":"\ufffd","khome":"\u001bH","kpp":"\u001bg","knp":"\u001bE","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"rxvt","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"rxvt-16color","cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"rxvt-256color","cols":80,"lines":24,"colors":256,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"rxvt-88color","cols":80,"lines":24,"colors":88,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"rxvt-basic","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"rxvt-color","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"rxvt-cygwin","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"0\ufffd+\ufffd,\ufffd-^`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"rxvt-cygwin-native","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"0\ufffd+\ufffd,\ufffd-^`\u0004a\ufffdf\ufffdg\ufffdh\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd~\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"rxvt-xpm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[7~","kend":"\u001b[8~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"sb1","cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH$\u003c1\u003e\u001bJ$\u003c3\u003e","smcup":"\u001bO","sgr0":"\u001b_3","smul":"\u001b_0","cup":"\u001bF%p2%03d%p1%03d","cub1":"\u0008","cuu1":"\u001bA$\u003c3\u003e","pad":"\u0000","kbs":"\u001f","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kf9":"\u001b1","kich":"\u001bQ\u001bO","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"sb2","aliases":["sb3"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH$\u003c1\u003e\u001bJ$\u003c3\u003e","smcup":"\u001bO","sgr0":"\u001b_3","smul":"\u001b_0","cup":"\u001bF%p2%03d%p1%03d","cub1":"\u0008","cuu1":"\u001bA$\u003c3\u003e","pad":"\u0000","kbs":"\u001f","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kf9":"\u001b1","kich":"\u001bQ\u001bO","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"sbi","aliases":["superbee"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH$\u003c1\u003e\u001bJ$\u003c3\u003e","smcup":"\u001bO","sgr0":"\u001b_3","smul":"\u001b_0","cup":"\u001bF%p2%03d%p1%03d","cub1":"\u0008","cuu1":"\u001bA$\u003c3\u003e","pad":"\u0000","kbs":"\u001f","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kf9":"\u001b1","kich":"\u001bQ\u001bO","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"scanset","aliases":["sc410","sc415"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"j%k4l\u003cm-q,x5","smacs":"\u000e","rmacs":"\u000f"} -{"name":"scoansi","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[=10;12C","civis":"\u001b[=14;12C","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\ufffd.\ufffd,.+/0[5566778899::;;\u003c\u003c==\u003e\u003eFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXX`\ufffda0fxgqh2jYk?lZm@nEqDtCu4vAwBx3yszr{c}\u001c~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"scoansi-new","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[=1c","civis":"\u001b[=0c","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\ufffd.\ufffd,.+/0[5566778899::;;\u003c\u003c==\u003e\u003eFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXX`\ufffda0fxgqh2jYk?lZm@nEqDtCu4vAwBx3yszr{c}\u001c~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"scoansi-old","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[=10;12C","civis":"\u001b[=14;12C","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"-\ufffd.\ufffd,.+/0[5566778899::;;\u003c\u003c==\u003e\u003eFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXX`\ufffda0fxgqh2jYk?lZm@nEqDtCu4vAwBx3yszr{c}\u001c~\ufffd","smacs":"\u001b[12m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"screen","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"screen-16color","cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"screen-16color-bce","cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"screen-16color-bce-s","cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"screen-16color-s","cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm"} -{"name":"screen-256color","cols":80,"lines":24,"colors":256,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m"} -{"name":"screen-256color-bce","cols":80,"lines":24,"colors":256,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m"} -{"name":"screen-256color-bce-s","cols":80,"lines":24,"colors":256,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m"} -{"name":"screen-256color-s","cols":80,"lines":24,"colors":256,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m"} -{"name":"screen-bce","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"screen-s","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"screen-w","cols":132,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"screen.linux","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"screen.mlterm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[11;2~","kf14":"\u001b[12;2~","kf15":"\u001b[13;2~","kf16":"\u001b[14;2~","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[11;5~","kf26":"\u001b[12;5~","kf27":"\u001b[13;5~","kf28":"\u001b[14;5~","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[11;6~","kf38":"\u001b[12;6~","kf39":"\u001b[13;6~","kf40":"\u001b[14;6~","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[11;3~","kf50":"\u001b[12;3~","kf51":"\u001b[13;3~","kf52":"\u001b[14;3~","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[11;4~","kf62":"\u001b[12;4~","kf63":"\u001b[13;4~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001bO1;2C","kLFT":"\u001bO1;2D","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"screen.rxvt","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[23$","kf22":"\u001b[24$","kf23":"\u001b[11^","kf24":"\u001b[12^","kf25":"\u001b[13^","kf26":"\u001b[14^","kf27":"\u001b[15^","kf28":"\u001b[17^","kf29":"\u001b[18^","kf30":"\u001b[19^","kf31":"\u001b[20^","kf32":"\u001b[21^","kf33":"\u001b[23^","kf34":"\u001b[24^","kf35":"\u001b[25^","kf36":"\u001b[26^","kf37":"\u001b[28^","kf38":"\u001b[29^","kf39":"\u001b[31^","kf40":"\u001b[32^","kf41":"\u001b[33^","kf42":"\u001b[34^","kf43":"\u001b[23@","kf44":"\u001b[24@","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[c","kLFT":"\u001b[d","kHOM":"\u001b[7$","kEND":"\u001b[8$","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[a","_kscud1":"\u001b[b","_kccu1":"\u001b[Oa","_kccud1":"\u001b[Ob","_kccuf1":"\u001b[Oc","_kccub1":"\u001b[Od","_kchome":"\u001b[7^","_kcend":"\u001b[8^"} -{"name":"screen.teraterm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"screen.xterm-r6","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"screen.xterm-xfree86","aliases":["screen.xterm-new"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"screen2","cols":80,"lines":24,"clear":"\u001b[2J\u001b[H","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001b0I","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"screen3","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"screwpoint","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u000f\u001b0`","sgr0":"\u000f","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kf2":"\u00022","kf3":"\u0002!","kf4":"\u0002\"","kf5":"\u0002#","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"scrhp","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u0026a0c0Y\u001bJ$\u003c40\u003e","sgr0":"\u001b\u0026d@\u000f","smul":"\u001b\u0026dD","bold":"\u001b\u0026dF","blink":"\u001b\u0026dA","rev":"\u001b\u0026dB","dim":"\u001b\u0026dH","smkx":"\u001b\u0026s1A","rmkx":"\u001b\u0026s0A","cup":"\u001b\u0026a%p1%dy%p2%dC$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kpp":"\u001bV","knp":"\u001bU","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001bi","kclr":"\u001bJ","acsc":"2[3@4\u003e5I9(:'JSKWLQMAO#P$Q;R!S\"T1U2V4W3X:Y+Z*dHjGkTlRmFn/q,t5u6v8w7x.","smacs":"\u000e","rmacs":"\u000f"} -{"name":"sibo","cols":61,"lines":20,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"simterm","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001bVS","rmcup":"\u001bVE","sgr0":"\u001b\u0026d@","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000"} -{"name":"soroc120","aliases":["iq120","soroc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c2\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"soroc140","aliases":["iq140"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+","smul":"\u001b\u0001","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","khome":"\u001e","kcuu1":"\u000b","kcuf1":"\u000c"} -{"name":"st52","cols":80,"lines":25,"bell":"\u0007","clear":"\u001bH\u001bJ","smcup":"\u001be","cnorm":"\u001be","civis":"\u001bf","sgr0":"\u001bq","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001b#;","kf2":"\u001b#\u003c","kf3":"\u001b#=","kf4":"\u001b#\u003e","kf5":"\u001b#?","kf6":"\u001b#@","kf7":"\u001b#A","kf8":"\u001b#B","kf9":"\u001b#C","khome":"\u001b#G","kcuu1":"\u001b#H","kcud1":"\u001b#P","kcub1":"\u001b#K","kcuf1":"\u001b#M","kclr":"\u001b#7"} -{"name":"sun","aliases":["sun1","sun2"],"cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-1","cols":80,"lines":1,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-12","cols":80,"lines":12,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-17","cols":80,"lines":17,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-24","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-34","cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-48","cols":80,"lines":48,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-c","aliases":["sun-cmd"],"cols":80,"lines":35,"bell":"\u0007","clear":"\u000c","smcup":"\u001b[\u003e4l","rmcup":"\u001b[\u003e4h","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-cgsix","aliases":["sun-ss5"],"cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-color","cols":80,"lines":34,"colors":8,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"sun-e","aliases":["sun-nic","sune"],"cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-e-s","aliases":["sun-s-e"],"cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-il","cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-s","cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"sun-type4","cols":80,"lines":34,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b[m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[234z","kf12":"\u001b[235z","kdch":"","khome":"\u001b[214z","kend":"\u001b[220z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001b[215z","kcud1":"\u001b[221z","kcub1":"\u001b[217z","kcuf1":"\u001b[219z"} -{"name":"superbee-xsb","cols":80,"lines":25,"clear":"\u001bH\u001bJ$\u003c3\u003e","cnorm":"\n","sgr0":"\u001b_3","cup":"\u001bF%p2%3d%p1%3d","cub1":"\u0008","cuu1":"\u001bA$\u003c3\u003e","pad":"\u0000","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"superbeeic","cols":80,"lines":25,"clear":"\u001bH\u001bJ$\u003c3\u003e","cnorm":"\n","sgr0":"\u001b_3","cup":"\u001bF%p2%3d%p1%3d","cub1":"\u0008","cuu1":"\u001bA$\u003c3\u003e","pad":"\u0000","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"superbrain","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c5*\u003e","smcup":"\u000c","rmcup":"\u000c","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c$\u003c20\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"swtp","aliases":["ct82"],"cols":82,"lines":20,"bell":"\u0007","clear":"\u000c","cup":"\u000b%p2%c%p1%c","cub1":"\u0004","cuu1":"\u0001","pad":"\u0000"} -{"name":"synertek","aliases":["ktm","synertek380"],"cols":80,"lines":24,"clear":"\u001a","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"t10","cols":80,"lines":24,"clear":"\u001bj$\u003c30/\u003e","smul":"\u001bRH","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\ufffd"} -{"name":"t1061","aliases":["teleray"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c1\u003e","smul":"\u001bRH","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\u001a1","kf2":"\u001a2","kf3":"\u001a3","kf4":"\u001a4","kf5":"\u001a5","kf6":"\u001a6","kf7":"\u001a7","kf8":"\u001a8"} -{"name":"t1061f","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c$\u003c1\u003e","smul":"\u001bRH","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\u001a1","kf2":"\u001a2","kf3":"\u001a3","kf4":"\u001a4","kf5":"\u001a5","kf6":"\u001a6","kf7":"\u001a7","kf8":"\u001a8"} -{"name":"t16","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[U\u001b[?38l","rmcup":"\u001b[V\u001b[24;1f\u001b[?38h","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"%i\u001b[%p1%d;%p2%df","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001a1","kf2":"\u001a2","kf3":"\u001a3","kf4":"\u001a4","kf5":"\u001a5","kf6":"\u001a6","kf7":"\u001a7","kf8":"\u001a8","kf9":"\u001a9","kf10":"\u001a0"} -{"name":"t3800","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"tab132","aliases":["tab","tab132-15"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"tab132-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"tab132-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"tab132-w-rv","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"tandem6510","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c1/\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tandem653","aliases":["t653x"],"cols":80,"lines":24,"clear":"\u001bI","sgr0":"\u001b6 ","smul":"\u001b60","cup":"\u0013%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000"} -{"name":"tek4023","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b\u000c$\u003c4/\u003e","cup":"\u001c%p2%' '%+%c%p1%' '%+%c","cub1":"\u0008","pad":"\u0000","kbs":"\u0008"} -{"name":"tek4025-cr","cols":80,"lines":33,"clear":"\u001fera;","smcup":"\u001fwor 33h","rmcup":"\u001fwor 0","cup":"\u001fjum%i%p1%d,%p2%d;","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"tek4105","cols":79,"lines":29,"bell":"\u0007","clear":"\u001b[2J\u001b[H","smcup":"\u001b%!1\u001b[?6l\u001b[2J","sgr0":"\u001b[=0;\u003c1m","smul":"\u001b[=5;\u003c2m","bold":"\u001b[=7;\u003c4m","blink":"\u001b[=3;\u003c7m","rev":"\u001b[=1;\u003c3m","dim":"\u001b[=1;\u003c6m","cup":"\u001b[%i%p1%2d;%p2%2dH","cuu1":"\u001b[1A","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001b[1A","kcud1":"\u001b[1B","kcub1":"\u001b[1D","kcuf1":"\u001b[1C","smacs":"\u001b[1m","rmacs":"\u001b[m"} -{"name":"tek4105-30","cols":80,"lines":30,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"tek4105a","cols":80,"lines":30,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?6l","rmcup":"\u001b%!0\u001bLBH=\u001b%!1","cnorm":"\u001b%!0\u001bTD10\u001b%!1","civis":"\u001b%!0\u001bTD00\u001b%!1","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOB","kf2":"\u001bOC","kf3":"\u001bOD","kf4":"\u001bOP","kf5":"\u001bOQ","kf6":"\u001bOR","kf7":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","smacs":"\u000e","rmacs":"\u000f"} -{"name":"tek4106brl","aliases":["tek4107brl","tek4109brl"],"cols":80,"lines":32,"bell":"\u0007","clear":"\u001b[H\u001b[J","smcup":"\u001b[?6l","rmcup":"\u001b%!0\u001bLBH=\u001b%!1","cnorm":"\u001b%!0\u001bTD10\u001b%!1","civis":"\u001b%!0\u001bTD00\u001b%!1","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOB","kf2":"\u001bOC","kf3":"\u001bOD","kf4":"\u001bOP","kf5":"\u001bOQ","kf6":"\u001bOR","kf7":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","smacs":"\u000e","rmacs":"\u000f"} -{"name":"tek4107","aliases":["tek4109"],"cols":79,"lines":29,"bell":"\u0007","clear":"\u001bLZ","cnorm":"\u001b%!0","sgr0":"\u001b%!1\u001b[m$\u003c2\u003e\u001b%!0","smul":"\u001b%!1\u001b[4m$\u003c2\u003e\u001b%!0","bold":"\u001b%!1\u001b[1m$\u003c2\u003e\u001b%!0","blink":"\u001b%!1\u001b[5m$\u003c2\u003e\u001b%!0","rev":"\u001b%!1\u001b[7m$\u003c2\u003e\u001b%0","dim":"\u001b%!1\u001b[\u003c0m$\u003c2\u003e\u001b%!0","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"tek4112","aliases":["tek4114"],"cols":80,"lines":34,"clear":"\u001b[2J\u001b[0;0H","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000"} -{"name":"tek4112-5","cols":80,"lines":5,"clear":"\u001b[2J\u001b[0;0H","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000"} -{"name":"tek4112-nd","cols":80,"lines":34,"clear":"\u001b[2J\u001b[0;0H","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"tek4115","cols":80,"lines":34,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"tek4125","cols":80,"lines":34,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"tek4205","cols":80,"lines":30,"bell":"\u0007","clear":"\u001b[2J\u001b[H","smcup":"\u001b%%!1\u001b[?6l\u001b[2J","sgr0":"\u001b[=0;\u003c1m\u001b[24;25;27m\u000f","smul":"\u001b[4m","bold":"\u001b[=7;\u003c4m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[=1;\u003c6m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOB","kf2":"\u001bOC","kf3":"\u001bOD","kf4":"\u001bP","kf5":"\u001bQ","kf6":"\u001bR","kf7":"\u001bS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"tek4207","cols":80,"lines":32,"clear":"\u001b[H\u001b[J$\u003c156/\u003e","smcup":"\u001b[?6l\u001b[H\u001b[J","rmcup":"\u001b[?6h\u001b%!0\u001bLBP0\u001b%!1\u001b[32;1f","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","khome":"\u001b[H","kcuu1":"\u001bM","kcud1":"\u001bD","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"tek4207-s","cols":79,"lines":29,"bell":"\u0007","clear":"\u001bLZ","cnorm":"\u001b%!0","sgr0":"\u001b%!1\u001b[m$\u003c2\u003e\u001b%!0","smul":"\u001b%!1\u001b[4m$\u003c2\u003e\u001b%!0","bold":"\u001b%!1\u001b[1m$\u003c2\u003e\u001b%!0","blink":"\u001b%!1\u001b[5m$\u003c2\u003e\u001b%!0","rev":"\u001b%!1\u001b[7m$\u003c2\u003e\u001b%0","dim":"\u001b%!1\u001b[\u003c0m$\u003c2\u003e\u001b%!0","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"tek4404","cols":80,"lines":32,"clear":"\u001b[H\u001b[2J","smcup":"\u001b%\u001b!1\u001b[1;32r\u001b[?6l\u001b\u003e","rmcup":"\u001b[1;1H\u001b[0J\u001b[?6h\u001b[?1l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","smkx":"\u001b[?1l","rmkx":"\u001b[?1h","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"teraterm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"teraterm2.3","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"teraterm4.59","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ti916","aliases":["ti916-220-7"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c6\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%p1%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","khlp":"\u001b[28~","kpp":"\u001b[T","knp":"\u001b[S","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kprt":"\u0018","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e$\u003c2\u003e","rmacs":"\u000f$\u003c2\u003e","enacs":"\u001b(B\u001b)0"} -{"name":"ti916-132","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c6\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%p1%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","khlp":"\u001b[28~","kpp":"\u001b[T","knp":"\u001b[S","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kprt":"\u0018","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e$\u003c2\u003e","rmacs":"\u000f$\u003c2\u003e","enacs":"\u001b(B\u001b)0"} -{"name":"ti916-8","aliases":["ti916-220-8"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c6\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%p1%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd17~","kf2":"\ufffd18~","kf3":"\ufffd19~","kf4":"\ufffd20~","kf5":"\ufffd21~","kf6":"\ufffd23~","kf7":"\ufffd24~","kf8":"\ufffd25~","kf9":"\ufffd26~","kf10":"\ufffd28~","kf11":"\ufffd29~","kf12":"\ufffd31~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\ufffd@","kdch":"\ufffdP","khome":"\ufffdH","khlp":"\u001b[28~","kpp":"\ufffdT","knp":"\ufffdS","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kprt":"\u0018","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e$\u003c2\u003e","rmacs":"\u000f$\u003c2\u003e","enacs":"\u001b(B\u001b)0"} -{"name":"ti916-8-132","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c6\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%p1%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd17~","kf2":"\ufffd18~","kf3":"\ufffd19~","kf4":"\ufffd20~","kf5":"\ufffd21~","kf6":"\ufffd23~","kf7":"\ufffd24~","kf8":"\ufffd25~","kf9":"\ufffd26~","kf10":"\ufffd28~","kf11":"\ufffd29~","kf12":"\ufffd31~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\ufffd@","kdch":"\ufffdP","khome":"\ufffdH","khlp":"\u001b[28~","kpp":"\ufffdT","knp":"\ufffdS","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kprt":"\u0018","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e$\u003c2\u003e","rmacs":"\u000f$\u003c2\u003e","enacs":"\u001b(B\u001b)0"} -{"name":"ti924","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[16~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kich":"\u001b[@","kdch":"\u001b[P","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ti924-8","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"P$\u003c\ufffd\u003e","kf2":"Q$\u003c\ufffd\u003e","kf3":"R$\u003c\ufffd\u003e","kf4":"S$\u003c\ufffd\u003e","kf5":"~$\u003c\ufffd16\u003e","kf6":"~$\u003c\ufffd17\u003e","kf7":"~$\u003c\ufffd18\u003e","kf8":"~$\u003c\ufffd19\u003e","kf9":"~$\u003c\ufffd20\u003e","kich":"@$\u003c\ufffd\u003e","kdch":"P$\u003c\ufffd\u003e","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ti924-8w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"P$\u003c\ufffd\u003e","kf2":"Q$\u003c\ufffd\u003e","kf3":"R$\u003c\ufffd\u003e","kf4":"S$\u003c\ufffd\u003e","kf5":"~$\u003c\ufffd16\u003e","kf6":"~$\u003c\ufffd17\u003e","kf7":"~$\u003c\ufffd18\u003e","kf8":"~$\u003c\ufffd19\u003e","kf9":"~$\u003c\ufffd20\u003e","kich":"@$\u003c\ufffd\u003e","kdch":"P$\u003c\ufffd\u003e","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ti924w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[16~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kich":"\u001b[@","kdch":"\u001b[P","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ti926","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[16~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kich":"\u001b[@","kdch":"\u001b[P","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ti926-8","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"%i\u001b[%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"P$\u003c\ufffd\u003e","kf2":"Q$\u003c\ufffd\u003e","kf3":"R$\u003c\ufffd\u003e","kf4":"S$\u003c\ufffd\u003e","kf5":"~$\u003c\ufffd16\u003e","kf6":"~$\u003c\ufffd17\u003e","kf7":"~$\u003c\ufffd18\u003e","kf8":"~$\u003c\ufffd19\u003e","kf9":"~$\u003c\ufffd20\u003e","kich":"@$\u003c\ufffd\u003e","kdch":"P$\u003c\ufffd\u003e","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"ti928","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[2J\u001b[H","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[17~","kf2":"\u001b[18~","kf3":"\u001b[19~","kf4":"\u001b[20~","kf5":"\u001b[21~","kf6":"\u001b[23~","kf7":"\u001b[24~","kf8":"\u001b[25~","kf9":"\u001b[26~","kf10":"\u001b[28~","kf11":"\u001b[29~","kf12":"\u001b[31~","kf13":"\u001b[32~","kf15":"\u001b[34~","kich":"\u001b[@","kdch":"\u001b[P","khome":"\u001b[H","kend":"\u001b_1\u001b\\","kpp":"\u001b[T","knp":"\u001b[S","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kprt":"\u001b[35~","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ti928-8","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[2J\u001b[H","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\ufffd17~","kf2":"\ufffd18~","kf3":"\ufffd19~","kf4":"\ufffd20~","kf5":"\ufffd21~","kf6":"\ufffd23~","kf7":"\ufffd24~","kf8":"\ufffd25~","kf9":"\ufffd26~","kf10":"\ufffd28~","kf11":"\ufffd29~","kf12":"\ufffd31~","kf13":"\ufffd32~","kf15":"\ufffd34~","kich":"\ufffd@","kdch":"\ufffdP","khome":"\ufffdH","kend":"\ufffd1\ufffd","kpp":"\ufffdT","knp":"\ufffdS","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kprt":"\ufffd35~","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"ti931","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bL","cnorm":"\u001b4@","sgr0":"\u001b4@","smul":"\u001b4D","blink":"\u001b4P","rev":"\u001b4B","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kf1":"\u001bi1","kf2":"\u001bi2","kf3":"\u001bi3","kf4":"\u001bi4","kf5":"\u001bi5","kf6":"\u001bi6","kf7":"\u001bi7","kf8":"\u001bi8","kf9":"\u001bi9","kich":"\u001bP","kdch":"\u001bQ","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"ti_ansi","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[2J\u001b[H","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"trs16","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001bRC","civis":"\u001bRc","sgr0":"\u001bR@","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u0002","kf2":"\u0004","kf3":"\u000c","kf4":"\u0015","kf5":"\u0010","kf6":"\u000e","kf7":"\u0013","khome":"\u0017","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"jak`l_mbquvewcxs","smacs":"\u001bRG","rmacs":"\u001bRg"} -{"name":"trs2","aliases":["trs80II","trsII"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u000f","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001e","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001e","kcud1":"\u001f","kcub1":"\u001c","kcuf1":"\u001d"} -{"name":"ts100","aliases":["ts100-sp"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"ts100-ctxt","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","smcup":"\u001b~_d\u001b[2J","rmcup":"\u001b~_b","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"tt","aliases":["tkterm"],"cols":-1,"lines":-1,"clear":"\u001b[H\u001b[J","cup":"\u001b[%p1%d;%p2%dH","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX"} -{"name":"tt505-22","aliases":["gs5430-22","pt505-22"],"cols":80,"lines":22,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[\u003el","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[01s","kf2":"\u001b[02s","kf3":"\u001b[03s","kf4":"\u001b[04s","kf5":"\u001b[05s","kf6":"\u001b[06s","kf18":"\u001b[18s","kf19":"\u001b[19s","kf20":"\u001b[20s","kf21":"\u001b[21s","kf22":"\u001b[22s","kf23":"\u001b[23s","kf24":"\u001b[24s","kf26":"\u001b[26s","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b[11m","rmacs":"\u001b[10m"} -{"name":"tvi803","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*$\u003c10\u003e","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001b*","acsc":"b\tc\u000cd\re\ni\u000b","smacs":"\u0015","rmacs":"\u0018"} -{"name":"tvi9065","cols":80,"lines":25,"bell":"\u0007","clear":"\u001a","smcup":"\u001b.2","rmcup":"\u001b.3\u001br\u001b[1;25r\u001b[25;0H","cnorm":"\u001b.3","civis":"\u001b.0","sgr0":"\u001bG0","smul":"\u001bG8","bold":"\u001bG,","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","acsc":"'r0_jhkglfmeniopqksqtmulvownxj","smacs":"\u001b$","rmacs":"\u001b%%","kHOM":"\u001b "} -{"name":"tvi910","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi910+","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001A\r","kf2":"\u0001B\r","kf3":"\u0001C\r","kf4":"\u0001D\r","kf5":"\u0001E\r","kf6":"\u0001F\r","kf7":"\u0001G\r","kf8":"\u0001H\r","kf9":"\u0001I\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912","aliases":["tvi914","tvi920"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","smul":"\u001bl","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b","aliases":["tvi912c"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","sgr0":"\u001b(","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-2p","aliases":["tvi912c-2p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","sgr0":"\u001b(","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-2p-mc","aliases":["tvi912b-mc-2p","tvi912c-2p-mc","tvi912c-mc-2p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","sgr0":"\u001b(\u001bk\u0008\u001bm\u0008\u001bq","smul":"\u001bl","blink":"\u001b^","rev":"\u001bj","dim":"\u001b) ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-2p-p","aliases":["tvi912b-p-2p","tvi912c-2p-p","tvi912c-p-2p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-2p-unk","aliases":["tvi912b-unk-2p","tvi912c-2p-unk","tvi912c-unk-2p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-mc","aliases":["tvi912c-mc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","sgr0":"\u001b(\u001bk\u0008\u001bm\u0008\u001bq","smul":"\u001bl","blink":"\u001b^","rev":"\u001bj","dim":"\u001b) ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-p","aliases":["tvi912c-p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-unk","aliases":["tvi912c-unk"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-vb","aliases":["tvi912c-vb"],"cols":80,"lines":24,"bell":"\u001bK$\u003c100\u003e\u001bK","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","sgr0":"\u001b(","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-vb-mc","aliases":["tvi912b-mc-vb","tvi912c-mc-vb","tvi912c-vb-mc"],"cols":80,"lines":24,"bell":"\u001bK$\u003c100\u003e\u001bK","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","sgr0":"\u001b(\u001bk\u0008\u001bm\u0008\u001bq","smul":"\u001bl","blink":"\u001b^","rev":"\u001bj","dim":"\u001b) ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-vb-p","aliases":["tvi912b-p-vb","tvi912c-p-vb","tvi912c-vb-p"],"cols":80,"lines":24,"bell":"\u001bK$\u003c100\u003e\u001bK","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi912b-vb-unk","aliases":["tvi912b-unk-vb","tvi912c-unk-vb","tvi912c-vb-unk"],"cols":80,"lines":24,"bell":"\u001bK$\u003c100\u003e\u001bK","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b","aliases":["tvi920c"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","sgr0":"\u001b(","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-2p","aliases":["tvi920c-2p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","sgr0":"\u001b(","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-2p-mc","aliases":["tvi920b-mc-2p","tvi920c-2p-mc","tvi920c-mc-2p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","sgr0":"\u001b(\u001bk\u0008\u001bm\u0008\u001bq","smul":"\u001bl","blink":"\u001b^","rev":"\u001bj","dim":"\u001b) ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-2p-p","aliases":["tvi920b-p-2p","tvi920c-2p-p","tvi920c-p-2p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-2p-unk","aliases":["tvi920b-unk-2p","tvi920c-2p-unk","tvi920c-unk-2p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-mc","aliases":["tvi920c-mc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","sgr0":"\u001b(\u001bk\u0008\u001bm\u0008\u001bq","smul":"\u001bl","blink":"\u001b^","rev":"\u001bj","dim":"\u001b) ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-p","aliases":["tvi920c-p"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-unk","aliases":["tvi920c-unk"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001a$\u003c50\u003e","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-vb","aliases":["tvi920c-vb"],"cols":80,"lines":24,"bell":"\u001bK$\u003c100\u003e\u001bK","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","sgr0":"\u001b(","dim":"\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-vb-mc","aliases":["tvi920b-mc-vb","tvi920c-mc-vb","tvi920c-vb-mc"],"cols":80,"lines":24,"bell":"\u001bK$\u003c100\u003e\u001bK","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","sgr0":"\u001b(\u001bk\u0008\u001bm\u0008\u001bq","smul":"\u001bl","blink":"\u001b^","rev":"\u001bj","dim":"\u001b) ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-vb-p","aliases":["tvi920b-p-vb","tvi920c-p-vb","tvi920c-vb-p"],"cols":80,"lines":24,"bell":"\u001bK$\u003c100\u003e\u001bK","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi920b-vb-unk","aliases":["tvi920b-unk-vb","tvi920c-unk-vb","tvi920c-vb-unk"],"cols":80,"lines":24,"bell":"\u001bK$\u003c100\u003e\u001bK","clear":"\u001a$\u003c50\u003e","smcup":"\u001bK\u001a$\u003c50\u003e\u001b(\u001bk\u0008\u001bm\u0008\u001bq\u001a$\u003c50\u003e","rmcup":"\u001a$\u003c50\u003e\u001bK\u001b=7 ","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001`\r","kf13":"\u0001a\r","kf14":"\u0001b\r","kf15":"\u0001c\r","kf16":"\u0001d\r","kf17":"\u0001e\r","kf18":"\u0001f\r","kf19":"\u0001g\r","kf20":"\u0001h\r","kf21":"\u0001i\r","kf22":"\u0001j\r","kdch":"","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tvi921","cols":80,"lines":24,"clear":"\u001a","cnorm":"\u001b.3","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c3/\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kich":"\u001bQ","kdch":"\u001bW","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kclr":"\u001a","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"tvi924","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*0","cnorm":"\u001b.3","civis":"\u001b.0","sgr0":"\u001bG0","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001A\r","kf2":"\u0001B\r","kf3":"\u0001C\r","kf4":"\u0001D\r","kf5":"\u0001E\r","kf6":"\u0001F\r","kf7":"\u0001G\r","kf8":"\u0001H\r","kf9":"\u0001I\r","kf10":"\u0001J\r","kf11":"\u0001K\r","kf12":"\u0001L\r","kf13":"\u0001M\r","kf14":"\u0001N\r","kf15":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kclr":"\u001b*0"} -{"name":"tvi925","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.4","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kclr":"\u001a"} -{"name":"tvi925-hi","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cnorm":"\u001b.4","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kclr":"\u001a"} -{"name":"tvi92B","cols":80,"lines":24,"clear":"\u001a","cnorm":"\u001b.3","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c3/\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kich":"\u001bQ","kdch":"\u001bW","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kclr":"\u001a","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"tvi92D","cols":80,"lines":24,"clear":"\u001a","cnorm":"\u001b.3","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c3/\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kich":"\u001bQ","kdch":"\u001bW","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kclr":"\u001a","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"tvi950","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001b*","acsc":"b\tc\u000cd\re\ni\u000b","smacs":"\u0015","rmacs":"\u0018"} -{"name":"tvi950-2p","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","smcup":"\u001b\\1\u001b-07 ","rmcup":"\u001b\\2\u001b-07 ","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","smkx":"\u001bl","rmkx":"\u001bk","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001b*","acsc":"b\tc\u000cd\re\ni\u000b","smacs":"\u0015","rmacs":"\u0018"} -{"name":"tvi950-4p","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","smcup":"\u001b\\1\u001b-07 ","rmcup":"\u001b\\3\u001b-07 ","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","smkx":"\u001bl","rmkx":"\u001bk","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001b*","acsc":"b\tc\u000cd\re\ni\u000b","smacs":"\u0015","rmacs":"\u0018"} -{"name":"tvi950-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001b*","acsc":"b\tc\u000cd\re\ni\u000b","smacs":"\u0015","rmacs":"\u0018"} -{"name":"tvi950-rv-2p","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","smcup":"\u001b\\1\u001b-07 ","rmcup":"\u001b\\2\u001b-07 ","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","smkx":"\u001bl","rmkx":"\u001bk","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001b*","acsc":"b\tc\u000cd\re\ni\u000b","smacs":"\u0015","rmacs":"\u0018"} -{"name":"tvi950-rv-4p","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","smcup":"\u001b\\1\u001b-07 ","rmcup":"\u001b\\3\u001b-07 ","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","smkx":"\u001bl","rmkx":"\u001bk","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001b*","acsc":"b\tc\u000cd\re\ni\u000b","smacs":"\u0015","rmacs":"\u0018"} -{"name":"tvi955","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","cnorm":"\u001b.2","civis":"\u001b.0","sgr0":"\u001bG0\u001b[=5l","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001b[=5h","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001b*","acsc":"0_`RjHkGlFmEnIoPqKsQtMuLvOwNxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"tvi955-hb","aliases":["955-hb"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","cnorm":"\u001b.2","civis":"\u001b.0","sgr0":"\u001bG0\u001b[=5h","smul":"\u001bG8","bold":"\u001b[=5l","blink":"\u001bG2","rev":"\u001bG4","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001b*","acsc":"0_`RjHkGlFmEnIoPqKsQtMuLvOwNxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"tvi955-w","aliases":["955-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b*","cnorm":"\u001b.2","civis":"\u001b.0","sgr0":"\u001bG0\u001b[=5l","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001b[=5h","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\u0016","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kclr":"\u001b*","acsc":"0_`RjHkGlFmEnIoPqKsQtMuLvOwNxJ","smacs":"\u001b$","rmacs":"\u001b%%"} -{"name":"tvi970","cols":80,"lines":24,"clear":"\u001b[H\u001b[2J","smcup":"\u001b[?20l\u001b[?7h\u001b[1Q","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%df","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001b?a","kf2":"\u001b?b","kf3":"\u001b?c","kf4":"\u001b?d","kf5":"\u001b?e","kf6":"\u001b?f","kf7":"\u001b?g","kf8":"\u001b?h","kf9":"\u001b?i","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u001b(B","rmacs":"\u001b(B"} -{"name":"tvi970-2p","cols":80,"lines":24,"clear":"\u001b[H\u001b[2J","smcup":"\u001b[U\u001b[?20l\u001b[?7h\u001b[1Q","rmcup":"\u001b[H\u001b[J\u001b[V","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%df","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001b?a","kf2":"\u001b?b","kf3":"\u001b?c","kf4":"\u001b?d","kf5":"\u001b?e","kf6":"\u001b?f","kf7":"\u001b?g","kf8":"\u001b?h","kf9":"\u001b?i","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u001b(B","rmacs":"\u001b(B"} -{"name":"tvi970-vb","cols":80,"lines":24,"clear":"\u001b[H\u001b[2J","smcup":"\u001b[?20l\u001b[?7h\u001b[1Q","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%df","cub1":"\u0008","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001b?a","kf2":"\u001b?b","kf3":"\u001b?c","kf4":"\u001b?d","kf5":"\u001b?e","kf6":"\u001b?f","kf7":"\u001b?g","kf8":"\u001b?h","kf9":"\u001b?i","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","smacs":"\u001b(B","rmacs":"\u001b(B"} -{"name":"tvipt","cols":80,"lines":24,"clear":"\u001a","smul":"\u001bG1B@\u001bH","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0002","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"tws-generic","aliases":["dku7102"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[?\u003eh\u001bPY99:98\u001b\\","rmcup":"\u001b[0;98v\u001b[2J\u001b[v","cnorm":"\u001b[r","civis":"\u001b[1r","sgr0":"\u001b[m\u000f","smul":"\u001b[0;4m","blink":"\u001b[0;5m","rev":"\u001b[0;7m","dim":"\u001b[0;2m","cup":"\u001b[%i%p1%d;%p2%df","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[1u\u0017","kf2":"\u001b[2u\u0017","kf3":"\u001b[3u\u0017","kf4":"\u001b[4u\u0017","kf5":"\u001b[5u\u0017","kf6":"\u001b[6u\u0017","kf7":"\u001b[7u\u0017","kf8":"\u001b[8u\u0017","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggj)k,l\u0026m#n/ooppq*rrsst'u-v+w.x%yyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"tws2102-sna","aliases":["dku7102-sna"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[?\u003eh\u001bPY99:98\u001b\\","rmcup":"\u001b[0;98v\u001b[2J\u001b[v","cnorm":"\u001b[r","civis":"\u001b[1r","sgr0":"\u001b[m\u000f","smul":"\u001b[0;4m","blink":"\u001b[0;5m","rev":"\u001b[0;7m","dim":"\u001b[0;2m","cup":"\u001b[%i%p1%d;%p2%df","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[1u\u0017","kf2":"\u001b[2u\u0017","kf3":"\u001b[3u\u0017","kf4":"\u001b[4u\u0017","kf5":"\u001b[5u\u0017","kf6":"\u001b[6u\u0017","kf7":"\u001b[7u\u0017","kf8":"\u001b[8u\u0017","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggj)k,l\u0026m#n/ooppq*rrsst'u-v+w.x%yyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"tws2103","aliases":["xdku"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[?\u003eh\u001bPY99:98\u001b\\","rmcup":"\u001b[0;98v\u001b[2J\u001b[v","cnorm":"\u001b[r","civis":"\u001b[1r","sgr0":"\u001b[m\u000f","smul":"\u001b[0;4m","blink":"\u001b[0;5m","rev":"\u001b[0;7m","dim":"\u001b[0;2m","cup":"\u001b[%i%p1%d;%p2%df","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[1u\u0017","kf2":"\u001b[2u\u0017","kf3":"\u001b[3u\u0017","kf4":"\u001b[4u\u0017","kf5":"\u001b[5u\u0017","kf6":"\u001b[6u\u0017","kf7":"\u001b[7u\u0017","kf8":"\u001b[8u\u0017","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggj)k,l\u0026m#n/ooppq*rrsst'u-v+w.x%yyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"tws2103-sna","aliases":["dku7103-sna"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[?\u003eh\u001bPY99:98\u001b\\","rmcup":"\u001b[0;98v\u001b[2J\u001b[v","cnorm":"\u001b[r","civis":"\u001b[1r","sgr0":"\u001b[m\u000f","smul":"\u001b[0;4m","blink":"\u001b[0;5m","rev":"\u001b[0;7m","dim":"\u001b[0;2m","cup":"\u001b[%i%p1%d;%p2%df","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[1u\u0017","kf2":"\u001b[2u\u0017","kf3":"\u001b[3u\u0017","kf4":"\u001b[4u\u0017","kf5":"\u001b[5u\u0017","kf6":"\u001b[6u\u0017","kf7":"\u001b[7u\u0017","kf8":"\u001b[8u\u0017","kdch":"\u001b[P","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggj)k,l\u0026m#n/ooppq*rrsst'u-v+w.x%yyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"uniterm","aliases":["uniterm49"],"cols":80,"lines":49,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0"} -{"name":"uts30","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u001bS","civis":"\u001bR","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","khome":"\u001b[H","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001bF","rmacs":"\u001bd"} -{"name":"uwin","cols":-1,"lines":-1,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0;10m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kf11":"\u001bOZ","kf12":"\u001bOA","kich":"\u001b[@","kdch":"","khome":"\u001b[H","kend":"\u001b[Y","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"+\u0010,\u0011-\u0018.\u00190\ufffd`\u0004a\ufffdf\ufffdg\ufffdh\ufffdi\ufffdj\ufffdk\ufffdl\ufffdm\ufffdn\ufffdo~p\ufffdq\ufffdr\ufffds_t\ufffdu\ufffdv\ufffdw\ufffdx\ufffdy\ufffdz\ufffd{\ufffd|\ufffd}\ufffd~\ufffd","smacs":"\u001b[11m","rmacs":"\u001b[10m","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"v3220","cols":80,"lines":24,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b[2~","kf2":"\u001b[3~","kf3":"\u001b[4~","kf4":"\u001b[5~","kf5":"\u001b[6~","kf6":"\u001b[OP","kf7":"\u001b[OQ","kf8":"\u001b[OR","kf9":"\u001b[OS","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"v5410","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vc404","cols":80,"lines":24,"bell":"\u0007","clear":"\u0018$\u003c40\u003e","cup":"\u0010%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0015"} -{"name":"vc404-s","cols":80,"lines":24,"bell":"\u0007","clear":"\u0018$\u003c40\u003e","cup":"\u0010%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0015"} -{"name":"vc414","aliases":["vc414h"],"cols":80,"lines":24,"clear":"\u001b\u001c$\u003c40\u003e","cup":"\u001b\u0011%p2%c%p1%c$\u003c40\u003e","cuu1":"\u001b\u000c","pad":"\u0000","kf1":"\u001bB","kf2":"\u001bC","kf3":"\u001bD","kf4":"\u001bE","kf5":"\u001bF","kf6":"\u001bG","kf7":"\u001bH","khome":"\u001b\u0012","kcuu1":"\u001b\u000c","kcud1":"\u001b\u000b","kcub1":"\u0008","kcuf1":"\u0010"} -{"name":"vc415","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cup":"\u0010%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u0015"} -{"name":"versaterm","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[;H\u001b[2J$\u003c50/\u003e","sgr0":"\u001b[m$\u003c2/\u003e","smul":"\u001b[4m$\u003c2/\u003e","bold":"\u001b[1m$\u003c2/\u003e","blink":"\u001b[5m$\u003c2/\u003e","rev":"\u001b[7m$\u003c2/\u003e","smkx":"\u001b=\u001b[?1h","rmkx":"\u001b\u003e\u001b[?1l","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5/\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2/\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"vi200","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bv","cnorm":"\u001bc","sgr0":"\u001b3\u001bb","dim":"\u001b4","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001b?q","kf2":"\u001b?r","kf3":"\u001b?s","kf4":"\u001b?t","kf5":"\u001b?u","kf6":"\u001b?v","kf7":"\u001b?w","kf8":"\u001b?x","kf9":"\u001b?y","kich":"\u001bi","kdch":"\u001bO","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kclr":"\u001bv","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"vi200-f","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bv","cnorm":"\u001bc","sgr0":"\u001b3\u001bb","dim":"\u001b4","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001b?q","kf2":"\u001b?r","kf3":"\u001b?s","kf4":"\u001b?t","kf5":"\u001b?u","kf6":"\u001b?v","kf7":"\u001b?w","kf8":"\u001b?x","kf9":"\u001b?y","kich":"\u001bi","kdch":"\u001bO","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kclr":"\u001bv","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"vi200-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bv","sgr0":"\u001b3\u001bb","dim":"\u001b4","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001b?q","kf2":"\u001b?r","kf3":"\u001b?s","kf4":"\u001b?t","kf5":"\u001b?u","kf6":"\u001b?v","kf7":"\u001b?w","kf8":"\u001b?x","kf9":"\u001b?y","kich":"\u001bi","kdch":"\u001bO","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kclr":"\u001bv","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"vi300","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b_A\u001b\\","kf2":"\u001b_B\u001b\\","kf3":"\u001b_C\u001b\\","kf4":"\u001b_D\u001b\\","kf5":"\u001b_E\u001b\\","kf6":"\u001b_F\u001b\\","kf7":"\u001b_G\u001b\\","kf8":"\u001b_H\u001b\\","kf9":"\u001b_I\u001b\\","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"vi300-old","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b_A\u001b\\","kf2":"\u001b_B\u001b\\","kf3":"\u001b_C\u001b\\","kf4":"\u001b_D\u001b\\","kf5":"\u001b_E\u001b\\","kf6":"\u001b_F\u001b\\","kf7":"\u001b_G\u001b\\","kf8":"\u001b_H\u001b\\","kf9":"\u001b_I\u001b\\","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"vi50","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","smul":"\u001bS","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bP","kf2":"\u001bQ","kf3":"\u001bR","kf4":"\u001bV","kf5":"\u001bE","kf6":"\u001b]","kf7":"\u001bL","kf8":"\u001bv","kf9":"\u001bM","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"vi500","cols":80,"lines":33,"clear":"\u001bv$\u003c6*/\u003e","smul":"\u001b\u0004","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","smacs":"\u000e","rmacs":"\u000f"} -{"name":"vi50adm","cols":80,"lines":24,"bell":"\u0007","clear":"\u001a","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"vi55","cols":80,"lines":24,"clear":"\u001bv","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"vi550","cols":80,"lines":33,"bell":"\u0007","clear":"\u0018\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kf1":"\u001b_A\u001b\\","kf2":"\u001b_B\u001b\\","kf3":"\u001b_C\u001b\\","kf4":"\u001b_D\u001b\\","kf5":"\u001b_E\u001b\\","kf6":"\u001b_F\u001b\\","kf7":"\u001b_G\u001b\\","kf8":"\u001b_H\u001b\\","kf9":"\u001b_I\u001b\\","khome":"\u001b[H","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C"} -{"name":"vi603","aliases":["visual603"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"viewpoint","aliases":["addsviewpoint"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","cnorm":"\u000f\u001b0`","sgr0":"\u000f","smul":"\u000e","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kf2":"\u00022","kf3":"\u0002!","kf4":"\u0002\"","kf5":"\u0002#","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"vip","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b`","sgr0":"\u001bsR\u001bsU\u001bF","smul":"\u001bs_","blink":"\u001bsB","rev":"\u001bsI","dim":"\u001bsL","cup":"\u001b[%i%p1%03d%p2%03df","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001b0","kf2":"\u001b2","kf3":"\u001b6","kf4":"\u001b8","kf5":"\u001b:","kf6":"\u001b\u003c","kf7":"\u001b\u003e","kf8":"\u001bP","kf9":"\u001bR","kf10":"\u001bT","kf11":"\u001b\\","kf12":"\u001b^","kf21":"\u001b1","kf22":"\u001b5","kf23":"\u001b7","kf24":"\u001b9","kf25":"\u001b;","kf26":"\u001b=","kf27":"\u001b?","kf28":"\u001bQ","kf29":"\u001bS","kf30":"\u001bV","kf31":"\u001b]","kf32":"\u001b_","kich":"\u001b[I","kdch":"\u001b[P","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b[Z","kclr":"\u001b`","acsc":"0pjdkblamcnkqitgufvhwexj","smacs":"\u001bG","rmacs":"\u001bF","kRIT":"\u001bu","kLFT":"\u001bo","kHOM":"\u001bH"} -{"name":"vip-H","aliases":["Q310-vip-H","Q310-vip-H-am","vip7800-H"],"cols":80,"lines":72,"bell":"\u0007","clear":"\u001b`","sgr0":"\u001bsR\u001bsU\u001bF","smul":"\u001bs_","blink":"\u001bsB","rev":"\u001bsI","dim":"\u001bsL","cup":"\u001b[%i%p1%03d%p2%03df","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001b0","kf2":"\u001b2","kf3":"\u001b6","kf4":"\u001b8","kf5":"\u001b:","kf6":"\u001b\u003c","kf7":"\u001b\u003e","kf8":"\u001bP","kf9":"\u001bR","kf10":"\u001bT","kf11":"\u001b\\","kf12":"\u001b^","kf21":"\u001b1","kf22":"\u001b5","kf23":"\u001b7","kf24":"\u001b9","kf25":"\u001b;","kf26":"\u001b=","kf27":"\u001b?","kf28":"\u001bQ","kf29":"\u001bS","kf30":"\u001bV","kf31":"\u001b]","kf32":"\u001b_","kich":"\u001b[I","kdch":"\u001b[P","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b[Z","kclr":"\u001b`","acsc":"0pjdkblamcnkqitgufvhwexj","smacs":"\u001bG","rmacs":"\u001bF","kRIT":"\u001bu","kLFT":"\u001bo","kHOM":"\u001bH"} -{"name":"vip-Hw","aliases":["Q310-vip-Hw","vip7800-Hw"],"cols":132,"lines":72,"bell":"\u0007","clear":"\u001b`","sgr0":"\u001bsR\u001bsU\u001bF","smul":"\u001bs_","blink":"\u001bsB","rev":"\u001bsI","dim":"\u001bsL","cup":"\u001b[%i%p1%03d%p2%03df","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001b0","kf2":"\u001b2","kf3":"\u001b6","kf4":"\u001b8","kf5":"\u001b:","kf6":"\u001b\u003c","kf7":"\u001b\u003e","kf8":"\u001bP","kf9":"\u001bR","kf10":"\u001bT","kf11":"\u001b\\","kf12":"\u001b^","kf21":"\u001b1","kf22":"\u001b5","kf23":"\u001b7","kf24":"\u001b9","kf25":"\u001b;","kf26":"\u001b=","kf27":"\u001b?","kf28":"\u001bQ","kf29":"\u001bS","kf30":"\u001bV","kf31":"\u001b]","kf32":"\u001b_","kich":"\u001b[I","kdch":"\u001b[P","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b[Z","kclr":"\u001b`","acsc":"0pjdkblamcnkqitgufvhwexj","smacs":"\u001bG","rmacs":"\u001bF","kRIT":"\u001bu","kLFT":"\u001bo","kHOM":"\u001bH"} -{"name":"vip-w","aliases":["Q310-vip-w","Q310-vip-w-am","vip7800-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b`","sgr0":"\u001bsR\u001bsU\u001bF","smul":"\u001bs_","blink":"\u001bsB","rev":"\u001bsI","dim":"\u001bsL","cup":"\u001b[%i%p1%03d%p2%03df","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001b0","kf2":"\u001b2","kf3":"\u001b6","kf4":"\u001b8","kf5":"\u001b:","kf6":"\u001b\u003c","kf7":"\u001b\u003e","kf8":"\u001bP","kf9":"\u001bR","kf10":"\u001bT","kf11":"\u001b\\","kf12":"\u001b^","kf21":"\u001b1","kf22":"\u001b5","kf23":"\u001b7","kf24":"\u001b9","kf25":"\u001b;","kf26":"\u001b=","kf27":"\u001b?","kf28":"\u001bQ","kf29":"\u001bS","kf30":"\u001bV","kf31":"\u001b]","kf32":"\u001b_","kich":"\u001b[I","kdch":"\u001b[P","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kcbt":"\u001b[Z","kclr":"\u001b`","acsc":"0pjdkblamcnkqitgufvhwexj","smacs":"\u001bG","rmacs":"\u001bF","kRIT":"\u001bu","kLFT":"\u001bo","kHOM":"\u001bH"} -{"name":"visa50","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[0;2m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b001","kf2":"\u001b002","kf3":"\u001b003","kf4":"\u001b004","kf5":"\u001b005","kf6":"\u001b006","kf7":"\u001b007","kf8":"\u001b008","kf9":"\u001b009","kf10":"\u001b011","kdch":"","khome":"\u001b[f","kcuu1":"\u001b[A","kcud1":"\u001b[A","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"0_aaffggh jjkkllmmnnooqqssttuuvvwwxx","smacs":"\u001b3h","rmacs":"\u001b[3l"} -{"name":"vp3a+","aliases":["viewpoint3a+"],"cols":80,"lines":24,"clear":"\u001b*$\u003c80\u003e","cnorm":"\u0018","civis":"\u0017","sgr0":"\u001b(","smul":"\u001b0`\u001b)","blink":"\u001b0B\u001b)","rev":"\u001b0P\u001b)","dim":"\u001b0A\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"vp60","aliases":["addsvp60","viewpoint60"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u001b0@","smul":"\u001b0`","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0015","cuu1":"\u001a","pad":"\u0000","kf1":"\u00022\r","kf2":"\u00023\r","kf3":"\u00024\r","kf4":"\u00025\r","kf5":"\u00026\r","kf6":"\u00027\r","kf7":"\u00028\r","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"vp90","aliases":["viewpoint90"],"cols":80,"lines":24,"clear":"\u001bG\u001bk","sgr0":"\u001bR\u001b0@\u001bV","smul":"\u001bR\u001b0`\u001bV","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","kf1":"\u00022\r","kf2":"\u00023\r","kf3":"\u00024\r","kf4":"\u00025\r","kf5":"\u00026\r","kf6":"\u00027\r","kf7":"\u00028\r","kf8":"\u00029\r","kf9":"\u0002:\r","kf10":"\u0002;\r","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"vremote","cols":79,"lines":24,"bell":"\u0007","clear":"\u001bL","smul":"\u001ba\u0001","cup":"\u001bG%p2%c%p1%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","khome":"\u001bE","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"vsc","cols":80,"lines":26,"clear":"\u001b[;H\u001b[2J$\u003c50/\u003e","sgr0":"\u001f!","smul":"\u001f\"","rev":"\u001f ","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kcud1":"\n","kcub1":"\u0008"} -{"name":"vt100","aliases":["vt100-am"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt100-nav","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt100-nav-w","aliases":["vt100-w-nav"],"cols":132,"lines":14,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt100-putty","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt100-s","aliases":["vt100-s-top","vt100-top-s"],"cols":80,"lines":23,"bell":"\u0007","clear":"\u001b[2;1H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%{1}%+%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt100-s-bot","aliases":["vt100-bot-s"],"cols":80,"lines":23,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt100-vb","cols":80,"lines":24,"clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt100-w","aliases":["vt100-w-am"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt100-w-nam","aliases":["vt100-nam-w"],"cols":132,"lines":14,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt100nam","aliases":["vt100-nam"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt102","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt102-nsgr","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt102-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt125","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J\u001bPpS(E)\u001b\\$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt131","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[;H\u001b[2J$\u003c50/\u003e","sgr0":"\u001b[m$\u003c2/\u003e","smul":"\u001b[4m$\u003c2/\u003e","bold":"\u001b[1m$\u003c2/\u003e","blink":"\u001b[5m$\u003c2/\u003e","rev":"\u001b[7m$\u003c2/\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5/\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2/\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"vt132","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m\u000f$\u003c2\u003e","smul":"\u001b[4m$\u003c2\u003e","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"vt200-js","aliases":["vt220-js"],"cols":80,"lines":-1,"bell":"\u0007","clear":"\u001b[H\u001b[J","smul":"\u001b[4m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"vt220","aliases":["vt200"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0"} -{"name":"vt220-8bit","aliases":["vt200-8","vt200-8bit","vt220-8"],"cols":80,"lines":24,"bell":"\u0007","clear":"\ufffdH\ufffdJ","sgr0":"\ufffd0m\u001b(B","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd5m","rev":"\ufffd7m","cup":"\ufffd%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\ufffdA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\ufffd17~","kf7":"\ufffd18~","kf8":"\ufffd19~","kf9":"\ufffd20~","kf10":"\ufffd21~","kf11":"\ufffd23~","kf12":"\ufffd24~","kf13":"\ufffd25~","kf14":"\ufffd26~","kf17":"\ufffd31~","kf18":"\ufffd32~","kf19":"\ufffd33~","kf20":"\ufffd34~","kich":"\ufffd2~","khome":"\ufffdH","khlp":"\ufffd28~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b)0"} -{"name":"vt220-nam","aliases":["v200-nam"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0"} -{"name":"vt220-old","aliases":["vt200-old"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[17~","kf6":"\u001b[18~","kf7":"\u001b[19~","kf8":"\u001b[20~","kf9":"\u001b[21~","kf10":"\u001b[29~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt220-w","aliases":["vt200-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0"} -{"name":"vt220d","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt320","aliases":["vt300"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"vt320-k3","cols":80,"lines":49,"bell":"\u0007","clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kich":"\u001b[2~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"vt320-k311","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[;H\u001b[2J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f"} -{"name":"vt320-nam","aliases":["vt300-nam"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"vt320-w","aliases":["vt300-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"vt320-w-nam","aliases":["vt300-w-nam"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"vt320nam","aliases":["v320n"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0"} -{"name":"vt340","aliases":["dec-vt330","dec-vt340","vt330"],"cols":80,"lines":24,"clear":"\u001b[H\u001b[J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"vt400","aliases":["dec-vt400","vt400-24"],"cols":80,"lines":24,"clear":"\u001b[H\u001b[J$\u003c10/\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"vt420","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[17~","kf6":"\u001b[18~","kf7":"\u001b[19~","kf8":"\u001b[20~","kf9":"\u001b[21~","kf10":"\u001b[29~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt420f","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt420pc","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[11;2~","kf14":"\u001b[12;2~","kf15":"\u001b[13;2~","kf16":"\u001b[14;2~","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[23~","kf26":"\u001b[24~","kf27":"\u001b[25~","kf28":"\u001b[26~","kf29":"\u001b[28~","kf30":"\u001b[29~","kf31":"\u001b[31~","kf32":"\u001b[32~","kf33":"\u001b[33~","kf34":"\u001b[34~","kf35":"\u001b[35~","kf36":"\u001b[36~","kf37":"\u001b[23;2~","kf38":"\u001b[24;2~","kf39":"\u001b[25;2~","kf40":"\u001b[26;2~","kf41":"\u001b[28;2~","kf42":"\u001b[29;2~","kf43":"\u001b[31;2~","kf44":"\u001b[32;2~","kf45":"\u001b[33;2~","kf46":"\u001b[34;2~","kf47":"\u001b[35;2~","kf48":"\u001b[36;2~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt420pcdos","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[11;2~","kf14":"\u001b[12;2~","kf15":"\u001b[13;2~","kf16":"\u001b[14;2~","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[23~","kf26":"\u001b[24~","kf27":"\u001b[25~","kf28":"\u001b[26~","kf29":"\u001b[28~","kf30":"\u001b[29~","kf31":"\u001b[31~","kf32":"\u001b[32~","kf33":"\u001b[33~","kf34":"\u001b[34~","kf35":"\u001b[35~","kf36":"\u001b[36~","kf37":"\u001b[23;2~","kf38":"\u001b[24;2~","kf39":"\u001b[25;2~","kf40":"\u001b[26;2~","kf41":"\u001b[28;2~","kf42":"\u001b[29;2~","kf43":"\u001b[31;2~","kf44":"\u001b[32;2~","kf45":"\u001b[33;2~","kf46":"\u001b[34;2~","kf47":"\u001b[35;2~","kf48":"\u001b[36;2~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt50h","cols":80,"lines":12,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000"} -{"name":"vt510","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[17~","kf6":"\u001b[18~","kf7":"\u001b[19~","kf8":"\u001b[20~","kf9":"\u001b[21~","kf10":"\u001b[29~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt510pc","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[11;2~","kf14":"\u001b[12;2~","kf15":"\u001b[13;2~","kf16":"\u001b[14;2~","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[23~","kf26":"\u001b[24~","kf27":"\u001b[25~","kf28":"\u001b[26~","kf29":"\u001b[28~","kf30":"\u001b[29~","kf31":"\u001b[31~","kf32":"\u001b[32~","kf33":"\u001b[33~","kf34":"\u001b[34~","kf35":"\u001b[35~","kf36":"\u001b[36~","kf37":"\u001b[23;2~","kf38":"\u001b[24;2~","kf39":"\u001b[25;2~","kf40":"\u001b[26;2~","kf41":"\u001b[28;2~","kf42":"\u001b[29;2~","kf43":"\u001b[31;2~","kf44":"\u001b[32;2~","kf45":"\u001b[33;2~","kf46":"\u001b[34;2~","kf47":"\u001b[35;2~","kf48":"\u001b[36;2~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt510pcdos","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","smkx":"\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[11;2~","kf14":"\u001b[12;2~","kf15":"\u001b[13;2~","kf16":"\u001b[14;2~","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[23~","kf26":"\u001b[24~","kf27":"\u001b[25~","kf28":"\u001b[26~","kf29":"\u001b[28~","kf30":"\u001b[29~","kf31":"\u001b[31~","kf32":"\u001b[32~","kf33":"\u001b[33~","kf34":"\u001b[34~","kf35":"\u001b[35~","kf36":"\u001b[36~","kf37":"\u001b[23;2~","kf38":"\u001b[24;2~","kf39":"\u001b[25;2~","kf40":"\u001b[26;2~","kf41":"\u001b[28;2~","kf42":"\u001b[29;2~","kf43":"\u001b[31;2~","kf44":"\u001b[32;2~","kf45":"\u001b[33;2~","kf46":"\u001b[34;2~","kf47":"\u001b[35;2~","kf48":"\u001b[36;2~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt52","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"ffgghhompoqqss.k","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"vt520","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[17~","kf6":"\u001b[18~","kf7":"\u001b[19~","kf8":"\u001b[20~","kf9":"\u001b[21~","kf10":"\u001b[29~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt525","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J$\u003c50\u003e","sgr0":"\u001b[m$\u003c2\u003e","smul":"\u001b[4m","bold":"\u001b[1m$\u003c2\u003e","blink":"\u001b[5m$\u003c2\u003e","rev":"\u001b[7m$\u003c2\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c10\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[17~","kf6":"\u001b[18~","kf7":"\u001b[19~","kf8":"\u001b[20~","kf9":"\u001b[21~","kf10":"\u001b[29~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e"} -{"name":"vt61","aliases":["vt-61","vt61.5"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ$\u003c120\u003e","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c$\u003c20\u003e","cub1":"\u0008","cuu1":"\u001bA$\u003c20\u003e","pad":"\u0000","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"wsiris","aliases":["iris40"],"cols":80,"lines":40,"bell":"\u0007","clear":"\u001bv","cnorm":"\u001b\u003e","sgr0":"\u001b7F7","smul":"\u001b7R2\u001b9P","dim":"\u001b7F2","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kf1":"\u001b1","kf2":"\u001b2","kf3":"\u001b3","kf4":"\u001b4","kf5":"\u001b5","kf6":"\u001b6","kf7":"\u001b7","kf8":"\u001b8","kf9":"\u001b9","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} -{"name":"wsvt25","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khome":"\u001b[7~","kend":"\u001b[8~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"wsvt25m","cols":80,"lines":25,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khome":"\u001b[7~","kend":"\u001b[8~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"wy100","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b;","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","khome":"\u001b{","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"wy100q","cols":80,"lines":24,"clear":"\u001a","sgr0":"\u001bG0","smul":"\u001bG8","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"wy120","aliases":["wy150","wyse120","wyse150"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy120-25","aliases":["wy150-25","wyse120-25","wyse150-25"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy120-25-w","aliases":["wy150-25-w","wyse120-25-w","wyse150-25-w"],"cols":132,"lines":25,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy120-vb","aliases":["wy150-vb","wyse120-vb","wyse150-vb"],"cols":80,"lines":24,"clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy120-w","aliases":["wy150-w","wyse120-w","wyse150-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy120-w-vb","aliases":["wy120-wvb","wy150-w-vb","wyse120-wvb","wyse150-w-vb"],"cols":132,"lines":24,"clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy160","aliases":["wyse160"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c30\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy160-25","aliases":["wyse160-25"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b+$\u003c30\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy160-25-w","aliases":["wyse160-25-w"],"cols":132,"lines":25,"bell":"\u0007","clear":"\u001b+$\u003c30\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy160-42","aliases":["wyse160-42"],"cols":80,"lines":42,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy160-42-w","aliases":["wyse160-42-w"],"cols":132,"lines":42,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy160-43","aliases":["wyse160-43"],"cols":80,"lines":43,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy160-43-w","aliases":["wyse160-43-w"],"cols":132,"lines":43,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy160-tek","cols":74,"lines":35,"bell":"\u0007","clear":"\u001b\u000c","cup":"\u001d%{3103}%'['%p1%*%-%Py%p2%'7'%*%Px%gy%{128}%/%{31}%\u0026%' '%+%c%gy%{3}%\u0026%{4}%*%gx%{3}%\u0026%+%'`'%+%c%gy%{004}%/%{31}%\u0026%'`'%+%c%gx%{128}%/%{31}%\u0026%' '%+%c%gx%{004}%/%{31}%\u0026%'@'%+%c\u001f","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"wy160-vb","aliases":["wyse160-vb"],"cols":80,"lines":24,"clear":"\u001b+$\u003c30\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy160-w","aliases":["wyse160-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c30\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy160-w-vb","aliases":["wy160-wvb","wyse160-wvb"],"cols":132,"lines":24,"clear":"\u001b+$\u003c30\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy185","aliases":["wyse185"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy185-24","aliases":["wyse185-24"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy185-vb","aliases":["wyse185-vb"],"cols":80,"lines":24,"clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy185-w","aliases":["wyse185-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy185-wvb","aliases":["wyse185-wvb"],"cols":132,"lines":24,"clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy30","aliases":["wyse30"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c80\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003","dim":"\u001b`7\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy30-mc","aliases":["wyse30-mc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c80\u003e","rmcup":"\u001bG0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001b(\u001bH\u0003","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bG0\u001bH\u0002","rmacs":"\u001bG0\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy30-vb","aliases":["wyse30-vb"],"cols":80,"lines":24,"clear":"\u001b+$\u003c80\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003","dim":"\u001b`7\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy325","aliases":["wyse325"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-25","aliases":["wy325-80","wyse-325","wyse325-25"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-25w","aliases":["wyse325-25w"],"cols":132,"lines":25,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-42","aliases":["wyse325-42"],"cols":80,"lines":42,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-42w","aliases":["wyse325-42w"],"cols":132,"lines":42,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-42w-vb","aliases":["wy325-42wvb"],"cols":132,"lines":24,"clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-43","aliases":["wyse325-43"],"cols":80,"lines":43,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-43w","aliases":["wyse325-43w"],"cols":132,"lines":43,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-43w-vb","aliases":["wy325-43wvb"],"cols":132,"lines":24,"clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-vb","aliases":["wyse325-vb"],"cols":80,"lines":24,"clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-w","aliases":["wy325w-24","wyse325-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy325-w-vb","aliases":["wy325-wvb","wyse325-wvb"],"cols":132,"lines":24,"clear":"\u001b+$\u003c50\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bq","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy350","aliases":["wyse350"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001b(\u001bH\u0003%{0}%PA%{0}%PC","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bG0\u001bH\u0002","rmacs":"\u001bG0\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy350-vb","aliases":["wyse350-vb"],"cols":80,"lines":24,"clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001b(\u001bH\u0003%{0}%PA%{0}%PC","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bG0\u001bH\u0002","rmacs":"\u001bG0\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy350-w","aliases":["wyse350-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001b(\u001bH\u0003%{0}%PA%{0}%PC","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bG0\u001bH\u0002","rmacs":"\u001bG0\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy350-wvb","aliases":["wyse350-wvb"],"cols":132,"lines":24,"clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001b(\u001bH\u0003%{0}%PA%{0}%PC","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bG0\u001bH\u0002","rmacs":"\u001bG0\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy370","aliases":["wy370-101k","wyse370"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?4i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kich":"\u001bOP","kdch":"\u001bOQ","khome":"\u001b[H","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy370-105k","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy370-EPC","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","khome":"\u001b[H","kend":"\u001b[1~","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy370-nk","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy370-rv","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?4i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kich":"\u001bOP","kdch":"\u001bOQ","khome":"\u001b[H","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy370-tek","cols":80,"lines":36,"bell":"\u0007","clear":"\u001b\u000c","cup":"\u001d%{775}%'l'%p1%*%{5}%/%-%Py%p2%'@'%*%{4}%+%{5}%/%Px%gy%' '%/%{31}%\u0026%' '%+%c%gy%{31}%\u0026%'`'%+%c%gx%' '%/%{31}%\u0026%' '%+%c%gx%{31}%\u0026%'@'%+%c\u001f","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\t"} -{"name":"wy370-vb","cols":80,"lines":24,"clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?4i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kich":"\u001bOP","kdch":"\u001bOQ","khome":"\u001b[H","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy370-w","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?4i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kich":"\u001bOP","kdch":"\u001bOQ","khome":"\u001b[H","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy370-wvb","cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?4i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kich":"\u001bOP","kdch":"\u001bOQ","khome":"\u001b[H","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy50","aliases":["wyse50"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003","rev":"\u001b`6\u001b)","dim":"\u001b`7\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy50-mc","aliases":["wyse50-mc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","rmcup":"\u001bG0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001bG0\u001b(\u001bH\u0003","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bG0\u001bH\u0002","rmacs":"\u001bG0\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy50-vb","aliases":["wyse50-vb"],"cols":80,"lines":24,"clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003","rev":"\u001b`6\u001b)","dim":"\u001b`7\u001b)","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy50-w","aliases":["wyse50-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003","rev":"\u001b`6\u001b)","dim":"\u001b`7\u001b)","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy50-wvb","aliases":["wyse50-wvb"],"cols":132,"lines":24,"clear":"\u001b+$\u003c20\u003e","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003","rev":"\u001b`6\u001b)","dim":"\u001b`7\u001b)","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"0wa_h[jukslrmqnxqzttuyv]wpxv","smacs":"\u001bH\u0002","rmacs":"\u001bH\u0003","kHOM":"\u001b{"} -{"name":"wy520","aliases":["wyse520"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-24","aliases":["wyse520-24"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-36","aliases":["wyse520-36"],"cols":80,"lines":36,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-36pc","aliases":["wyse520-36pc"],"cols":80,"lines":36,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-36w","aliases":["wyse520-36w"],"cols":132,"lines":36,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-36wpc","aliases":["wyse520-36wpc"],"cols":132,"lines":36,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-48","aliases":["wyse520-48"],"cols":80,"lines":48,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-48pc","aliases":["wyse520-48pc"],"cols":80,"lines":48,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-48w","aliases":["wyse520-48w"],"cols":132,"lines":48,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-48wpc","aliases":["wyse520-48wpc"],"cols":132,"lines":48,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-epc","aliases":["wyse520-epc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-epc-24","aliases":["wyse520-pc-24"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-epc-vb","aliases":["wyse520-pc-vb"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-epc-w","aliases":["wyse520-epc-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-epc-wvb","aliases":["wyse520-p-wvb"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001b[H","kend":"\u001b[4~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-vb","aliases":["wyse520-vb"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-w","aliases":["wyse520-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy520-wvb","aliases":["wyse520-wvb"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c40\u003e","smcup":"\u001b[ Q\u001b[?67;8h","rmcup":"\u001b[ R","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy60","aliases":["wyse60"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c100\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy60-25","aliases":["wyse60-25"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b+$\u003c100\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy60-25-w","aliases":["wyse60-25-w"],"cols":132,"lines":25,"bell":"\u0007","clear":"\u001b+$\u003c100\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy60-42","aliases":["wyse60-42"],"cols":80,"lines":42,"bell":"\u0007","clear":"\u001b+$\u003c260\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c2\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy60-42-w","aliases":["wyse60-42-w"],"cols":132,"lines":42,"bell":"\u0007","clear":"\u001b+$\u003c260\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC$\u003c2\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy60-43","aliases":["wyse60-43"],"cols":80,"lines":43,"bell":"\u0007","clear":"\u001b+$\u003c260\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c$\u003c2\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy60-43-w","aliases":["wyse60-43-w"],"cols":132,"lines":43,"bell":"\u0007","clear":"\u001b+$\u003c260\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC$\u003c2\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy60-vb","aliases":["wyse60-vb"],"cols":80,"lines":24,"clear":"\u001b+$\u003c100\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy60-w","aliases":["wyse60-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c100\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy60-w-vb","aliases":["wy60-wvb","wyse60-wvb"],"cols":132,"lines":24,"clear":"\u001b+$\u003c100\u003e","smcup":"\u001bw0","rmcup":"\u001bw1","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy75","aliases":["wyse75"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c30\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[2t\u001b[4m","rev":"\u001b[1t\u001b[7m","dim":"\u001b[0t\u001b[2m","smkx":"\u001b[?1l\u001b[?7h\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?5i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[35~","kich":"\u001b[@","khome":"\u001b[H","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kprt":"\u001b[?5i","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy75-mc","aliases":["wyse75-mc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c30\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0p\u000f","smul":"\u001b[8p","blink":"\u001b[2p","rev":"\u001b[16p","dim":"\u001b[1p","smkx":"\u001b[?1l\u001b[?7h\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?5i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[35~","kich":"\u001b[@","khome":"\u001b[H","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kprt":"\u001b[?5i","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b[0p\u000e","rmacs":"\u001b[0p\u000f","enacs":"\u001b)0"} -{"name":"wy75-vb","aliases":["wyse75-vb"],"cols":80,"lines":24,"clear":"\u001b[H\u001b[J$\u003c30\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[2t\u001b[4m","rev":"\u001b[1t\u001b[7m","dim":"\u001b[0t\u001b[2m","smkx":"\u001b[?1l\u001b[?7h\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?5i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[35~","kich":"\u001b[@","khome":"\u001b[H","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kprt":"\u001b[?5i","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy75-w","aliases":["wyse75-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c30\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[2t\u001b[4m","rev":"\u001b[1t\u001b[7m","dim":"\u001b[0t\u001b[2m","smkx":"\u001b[?1l\u001b[?7h\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?5i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[35~","kich":"\u001b[@","khome":"\u001b[H","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kprt":"\u001b[?5i","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy75-wvb","aliases":["wyse75-wvb"],"cols":132,"lines":24,"clear":"\u001b[H\u001b[J$\u003c30\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[2t\u001b[4m","rev":"\u001b[1t\u001b[7m","dim":"\u001b[0t\u001b[2m","smkx":"\u001b[?1l\u001b[?7h\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?5i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[35~","kich":"\u001b[@","khome":"\u001b[H","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kprt":"\u001b[?5i","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy75ap","aliases":["wy-75ap","wyse-75ap","wyse75ap"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c30\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[2t\u001b[4m","rev":"\u001b[1t\u001b[7m","dim":"\u001b[0t\u001b[2m","smkx":"\u001b[?1h\u001b=$\u003c10/\u003e","rmkx":"\u001b[?1l\u001b\u003e$\u003c10/\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[?5i","kf2":"\u001b[?3i","kf3":"\u001b[2i","kf4":"\u001b[@","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kf21":"\u001b[35~","kich":"\u001b[@","khome":"\u001bOH","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kprt":"\u001b[?5i","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy85","aliases":["wyse85"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c110\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy85-8bit","aliases":["wyse85-8bit"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c110\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\ufffd17~","kf7":"\ufffd18~","kf8":"\ufffd19~","kf9":"\ufffd20~","kf10":"\ufffd21~","kf11":"\ufffd23~","kf12":"\ufffd24~","kf13":"\ufffd25~","kf14":"\ufffd26~","kf15":"\ufffd28~","kf16":"\ufffd29~","kf17":"\ufffd31~","kf18":"\ufffd32~","kf19":"\ufffd33~","kf20":"\ufffd34~","kich":"\ufffd2~","kdch":"\ufffd3~","khome":"\ufffd26~","khlp":"\ufffd28~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy85-vb","aliases":["wyse85-vb"],"cols":80,"lines":24,"clear":"\u001b[H\u001b[J$\u003c110\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy85-w","aliases":["wyse85-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c110\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy85-wvb","aliases":["wyse85-wvb"],"cols":132,"lines":24,"clear":"\u001b[H\u001b[J$\u003c110\u003e","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1l\u001b=","rmkx":"\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c1\u003e","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[26~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy99-ansi","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c200\u003e","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f\u001b[\"q","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1h","rmkx":"\u001b[?1l","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008$\u003c1\u003e","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf17":"\u001b[K","kf18":"\u001b[31~","kf19":"\u001b[32~","kf20":"\u001b[33~","kf21":"\u001b[34~","kf22":"\u001b[35~","kf23":"\u001b[1~","kf24":"\u001b[2~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[z","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy99a-ansi","cols":80,"lines":25,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c200\u003e","cnorm":"\u001b[34h\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f\u001b[\"q","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[?1h","rmkx":"\u001b[?1l","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008$\u003c1\u003e","cuu1":"\u001bM","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[M","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf17":"\u001b[K","kf18":"\u001b[31~","kf19":"\u001b[32~","kf20":"\u001b[33~","kf21":"\u001b[34~","kf22":"\u001b[35~","kf23":"\u001b[1~","kf24":"\u001b[2~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[z","acsc":"``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"wy99f","aliases":["wy-99fgt","wy99fgt"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b'\u001b(\u001a","smcup":"\u001bc20\u001bc30","rmcup":"\u001bc21\u001bc31","cnorm":"\u001b`4\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bG0","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001`\r","kf14":"\u0001a\r","kf15":"\u0001b\r","kf16":"\u0001c\r","kf17":"\u0001d\r","kf18":"\u0001e\r","kf19":"\u0001f\r","kf20":"\u0001g\r","kf21":"\u0001h\r","kf22":"\u0001i\r","kf23":"\u0001j\r","kf24":"\u0001k\r","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"'x+y.wi~_vj(k'l\u0026m%n)o9q*s8t-u.v,w+x=","smacs":"\u001bcE","rmacs":"\u001bcD","enacs":"\u001bc@1J$\u003c2000\u003e"} -{"name":"wy99fa","aliases":["wy-99fgta","wy99fgta"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b'\u001b(\u001a","smcup":"\u001bc20\u001bc30","rmcup":"\u001bc21\u001bc31","cnorm":"\u001b`4\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bG0","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001`\r","kf14":"\u0001a\r","kf15":"\u0001b\r","kf16":"\u0001c\r","kf17":"\u0001d\r","kf18":"\u0001e\r","kf19":"\u0001f\r","kf20":"\u0001g\r","kf21":"\u0001h\r","kf22":"\u0001i\r","kf23":"\u0001j\r","kf24":"\u0001k\r","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"'x+y.wi~_vj(k'l\u0026m%n)o9q*s8t-u.v,w+x=","smacs":"\u001bcE","rmacs":"\u001bcD","enacs":"\u001bc@1J$\u003c2000\u003e"} -{"name":"wy99gt","aliases":["wyse99gt"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c130\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy99gt-25","aliases":["wyse99gt-25"],"cols":80,"lines":25,"bell":"\u0007","clear":"\u001b+$\u003c130\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy99gt-25-w","aliases":["wyse99gt-25-w"],"cols":132,"lines":25,"bell":"\u0007","clear":"\u001b+$\u003c160\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC$\u003c2\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy99gt-tek","cols":74,"lines":35,"bell":"\u0007","clear":"\u001b\u000c","cup":"\u001d%{3040}%'Y'%p1%*%-%Py%p2%'7'%*%Px%gy%{128}%/%{31}%\u0026%' '%+%c%gy%{3}%\u0026%{4}%*%gx%{3}%\u0026%+%'`'%+%c%gy%{004}%/%{31}%\u0026%'`'%+%c%gx%{128}%/%{31}%\u0026%' '%+%c%gx%{004}%/%{31}%\u0026%'@'%+%c\u001f","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"wy99gt-vb","aliases":["wyse99gt-vb"],"cols":80,"lines":24,"clear":"\u001b+$\u003c130\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy99gt-w","aliases":["wyse99gt-w"],"cols":132,"lines":24,"bell":"\u0007","clear":"\u001b+$\u003c160\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC$\u003c2\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wy99gt-w-vb","aliases":["wy99gt-wvb","wyse99gt-wvb"],"cols":132,"lines":24,"clear":"\u001b+$\u003c160\u003e","smcup":"\u001bw1","rmcup":"\u001bw0","cnorm":"\u001b`1","civis":"\u001b`0","sgr0":"\u001b(\u001bH\u0003\u001bG0\u001bcD","smul":"\u001bG8","blink":"\u001bG2","rev":"\u001bG4","dim":"\u001bGp","cup":"\u001ba%i%p1%dR%p2%dC$\u003c2\u003e","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","kbs":"\u0008","kf1":"\u0001@\r","kf2":"\u0001A\r","kf3":"\u0001B\r","kf4":"\u0001C\r","kf5":"\u0001D\r","kf6":"\u0001E\r","kf7":"\u0001F\r","kf8":"\u0001G\r","kf9":"\u0001H\r","kf10":"\u0001I\r","kf11":"\u0001J\r","kf12":"\u0001K\r","kf13":"\u0001L\r","kf14":"\u0001M\r","kf15":"\u0001N\r","kf16":"\u0001O\r","kich":"\u001bQ","kdch":"\u001bW","khome":"\u001e","kpp":"\u001bJ","knp":"\u001bK","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c","kcbt":"\u001bI","kprt":"\u001bP","acsc":"+/,.0[iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~","smacs":"\u001bcE","rmacs":"\u001bcD","kHOM":"\u001b{"} -{"name":"wyse-vp","cols":80,"lines":24,"bell":"\u0007","clear":"\u000c","sgr0":"\u000f","smul":"\u000e","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001a","pad":"\u0000","kbs":"\u0008","khome":"\u0001","kcuu1":"\u001a","kcud1":"\n","kcub1":"\u0015","kcuf1":"\u0006"} -{"name":"x10term","aliases":["vs100-x10"],"cols":80,"lines":65,"clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"x68k","aliases":["x68k-ite"],"cols":96,"lines":32,"bell":"\u0007","clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","khlp":"\u001b[28~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kclr":"\u001b[9~","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0$\u003c2\u003e","rmacs":"\u001b(B$\u003c4\u003e","enacs":"\u001b)0"} -{"name":"xerox820","aliases":["x820"],"cols":80,"lines":24,"bell":"\u0007","clear":"1\u001a","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"xfce","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[0m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO1;2P","kf14":"\u001bO1;2Q","kf15":"\u001bO1;2R","kf16":"\u001bO1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO1;5P","kf26":"\u001bO1;5Q","kf27":"\u001bO1;5R","kf28":"\u001bO1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO1;6P","kf38":"\u001bO1;6Q","kf39":"\u001bO1;6R","kf40":"\u001bO1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001bO1;3P","kf50":"\u001bO1;3Q","kf51":"\u001bO1;3R","kf52":"\u001bO1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001bO1;4P","kf62":"\u001bO1;4Q","kf63":"\u001bO1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xiterm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc","aliases":["darwin"],"cols":-1,"lines":-1,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc+b","cols":-1,"lines":-1,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[35m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc+basic","cols":-1,"lines":-1,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc+f","cols":-1,"lines":-1,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[36;4m","bold":"\u001b[35m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc+f2","cols":-1,"lines":-1,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[34m","bold":"\u001b[33m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-100x37","aliases":["darwin-100x37"],"cols":100,"lines":37,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-100x37-m","aliases":["darwin-100x37-m"],"cols":100,"lines":37,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-112x37","aliases":["darwin-112x37"],"cols":112,"lines":37,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-112x37-m","aliases":["darwin-112x37-m"],"cols":112,"lines":37,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-128x40","aliases":["darwin-128x40"],"cols":128,"lines":40,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-128x40-m","aliases":["darwin-128x40-m"],"cols":128,"lines":40,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-128x48","aliases":["darwin-128x48"],"cols":128,"lines":48,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-128x48-m","aliases":["darwin-128x48-m"],"cols":128,"lines":48,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-144x48","aliases":["darwin-144x48"],"cols":144,"lines":48,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-144x48-m","aliases":["darwin-144x48-m"],"cols":144,"lines":48,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-160x64","aliases":["darwin-160x64"],"cols":160,"lines":64,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-160x64-m","aliases":["darwin-160x64-m"],"cols":160,"lines":64,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-200x64","aliases":["darwin-200x64"],"cols":200,"lines":64,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-200x64-m","aliases":["darwin-200x64-m"],"cols":200,"lines":64,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-200x75","aliases":["darwin-200x75"],"cols":200,"lines":75,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-200x75-m","aliases":["darwin-200x75-m"],"cols":200,"lines":75,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-256x96","aliases":["darwin-256x96"],"cols":256,"lines":96,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-256x96-m","aliases":["darwin-256x96-m"],"cols":256,"lines":96,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-80x25","aliases":["darwin-80x25"],"cols":80,"lines":25,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-80x25-m","aliases":["darwin-80x25-m"],"cols":80,"lines":25,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-80x30","aliases":["darwin-80x30"],"cols":80,"lines":30,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-80x30-m","aliases":["darwin-80x30-m"],"cols":80,"lines":30,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-90x30","aliases":["darwin-90x30"],"cols":90,"lines":30,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-90x30-m","aliases":["darwin-90x30-m"],"cols":90,"lines":30,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-b","aliases":["darwin-b"],"cols":-1,"lines":-1,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[35m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-f","aliases":["darwin-f"],"cols":-1,"lines":-1,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[36;4m","bold":"\u001b[35m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-f2","aliases":["darwin-f2"],"cols":-1,"lines":-1,"colors":8,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[34m","bold":"\u001b[33m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xnuppc-m","aliases":["darwin-m"],"cols":-1,"lines":-1,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-m-b","aliases":["darwin-m-b"],"cols":-1,"lines":-1,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[35m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-m-f","aliases":["darwin-m-f"],"cols":-1,"lines":-1,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[36;4m","bold":"\u001b[35m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xnuppc-m-f2","aliases":["darwin-m-f2"],"cols":-1,"lines":-1,"clear":"\u001b[H\u001b[J","sgr0":"\u001b[m\u000f","smul":"\u001b[34m","bold":"\u001b[33m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[D","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC"} -{"name":"xtalk","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[J$\u003c50\u003e","sgr0":"\u001b[m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH$\u003c5\u003e","cub1":"\u0008","cuu1":"\u001b[A$\u003c2\u003e","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOt","kf6":"\u001bOu","kf7":"\u001bOv","kf8":"\u001bOl","kf9":"\u001bOw","kf10":"\u001bOx","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"xterm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm+sl","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm+sl-twm","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-1002","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"\u001b[?1002%?%p1%{1}%=%th%el%;","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-1003","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"\u001b[?1003%?%p1%{1}%=%th%el%;","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-16color","cols":80,"lines":24,"colors":16,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%dm","setbg":"\u001b[%?%p1%{8}%\u003c%t%p1%'('%+%e%p1%{92}%+%;%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t%p1%{30}%+%e%p1%'R'%+%;%d;%?%p2%{8}%\u003c%t%p2%'('%+%e%p2%{92}%+%;%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-24","aliases":["vs100","xterms"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"xterm-256color","cols":80,"lines":24,"colors":256,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-88color","cols":80,"lines":24,"colors":88,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;m","setbg":"\u001b[%?%p1%{8}%\u003c%t4%p1%d%e%p1%{16}%\u003c%t10%p1%{8}%-%d%e48;5;%p1%d%;m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[%?%p1%{8}%\u003c%t3%p1%d%e%p1%{16}%\u003c%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%\u003c%t4%p2%d%e%p2%{16}%\u003c%t10%p2%{8}%-%d%e48;5;%p2%d%;m","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-8bit","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\ufffdH\ufffd2J","smcup":"\ufffd?1049h","rmcup":"\ufffd?1049l","cnorm":"\ufffd?25l\ufffd?25h","civis":"\ufffd?25l","sgr0":"\ufffd0m\u001b(B","smul":"\ufffd4m","bold":"\ufffd1m","blink":"\ufffd5m","rev":"\ufffd7m","smkx":"\ufffd?1h\u001b=","rmkx":"\ufffd?1l\u001b\u003e","setaf":"\ufffd3%p1%dm","setbg":"\ufffd4%p1%dm","cup":"\ufffd%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\ufffdA","kbs":"\u0008","kf1":"\ufffd11~","kf2":"\ufffd12~","kf3":"\ufffd13~","kf4":"\ufffd14~","kf5":"\ufffd15~","kf6":"\ufffd17~","kf7":"\ufffd18~","kf8":"\ufffd19~","kf9":"\ufffd20~","kf10":"\ufffd21~","kf11":"\ufffd23~","kf12":"\ufffd24~","kf13":"\ufffd25~","kf14":"\ufffd26~","kf15":"\ufffd28~","kf16":"\ufffd29~","kf17":"\ufffd31~","kf18":"\ufffd32~","kf19":"\ufffd33~","kf20":"\ufffd34~","kich":"\ufffd2~","kdch":"\ufffd3~","khome":"\ufffd1~","kend":"\ufffd4~","kpp":"\ufffd5~","knp":"\ufffd6~","kcuu1":"\ufffdA","kcud1":"\ufffdB","kcub1":"\ufffdD","kcuf1":"\ufffdC","kcbt":"\ufffdZ","kmous":"\ufffdM","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"xterm-basic","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm-bold","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m","smul":"\u001b[1m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"xterm-color","aliases":["nxterm"],"cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm-hp","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bp","kf2":"\u001bq","kf3":"\u001br","kf4":"\u001bs","kf5":"\u001bt","kf6":"\u001bu","kf7":"\u001bv","kf8":"\u001bw","kich":"\u001bQ","kdch":"\u001bP","khome":"\u001bh","kend":"\u001bF","kpp":"\u001bT","knp":"\u001bS","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","kclr":"\u001bJ","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm-new","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-nic","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-noapp","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b=","rmkx":"\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-pcolor","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m\u001b[42m","bold":"\u001b[1m\u001b[43m","blink":"\u001b[5m","rev":"\u001b[7m\u001b[34m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","enacs":"\u001b)0","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-r5","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c"} -{"name":"xterm-r6","aliases":["xterm-old"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b)0"} -{"name":"xterm-sco","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[M","kf2":"\u001b[N","kf3":"\u001b[O","kf4":"\u001b[P","kf5":"\u001b[Q","kf6":"\u001b[R","kf7":"\u001b[S","kf8":"\u001b[T","kf9":"\u001b[U","kf10":"\u001b[V","kf11":"\u001b[W","kf12":"\u001b[X","kf13":"\u001b[Y","kf14":"\u001b[Z","kf15":"\u001b[a","kf16":"\u001b[b","kf17":"\u001b[c","kf18":"\u001b[d","kf19":"\u001b[e","kf20":"\u001b[f","kf21":"\u001b[g","kf22":"\u001b[h","kf23":"\u001b[i","kf24":"\u001b[j","kf25":"\u001b[k","kf26":"\u001b[l","kf27":"\u001b[m","kf28":"\u001b[n","kf29":"\u001b[o","kf30":"\u001b[p","kf31":"\u001b[q","kf32":"\u001b[r","kf33":"\u001b[s","kf34":"\u001b[t","kf35":"\u001b[u","kf36":"\u001b[v","kf37":"\u001b[w","kf38":"\u001b[x","kf39":"\u001b[y","kf40":"\u001b[z","kf41":"\u001b[@","kf42":"\u001b[[","kf43":"\u001b[\\","kf44":"\u001b[]","kf45":"\u001b[^","kf46":"\u001b[_","kf47":"\u001b[`","kf48":"\u001b[{","kich":"\u001b[L","kdch":"","khome":"\u001b[H","kend":"\u001b[F","kpp":"\u001b[I","knp":"\u001b[G","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","kmous":"\u001b[\u003eM","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm-sun","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[192z","kf12":"\u001b[193z","kf13":"\u001b[194z","kf14":"\u001b[195z","kf15":"\u001b[196z","kf17":"\u001b[198z","kf18":"\u001b[199z","kf19":"\u001b[200z","kf20":"\u001b[201z","kf31":"\u001b[208z","kf32":"\u001b[209z","kf33":"\u001b[210z","kf34":"\u001b[211z","kf35":"\u001b[212z","kf36":"\u001b[213z","kf38":"\u001b[215z","kf40":"\u001b[217z","kf42":"\u001b[219z","kf44":"\u001b[221z","kf45":"\u001b[222z","kf46":"\u001b[234z","kf47":"\u001b[235z","kich":"\u001b[2z","kdch":"\u001b[3z","khome":"\u001b[214z","kend":"\u001b[220z","khlp":"\u001b[196z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm-vt220","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kend":"\u001b[4~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm-vt52","cols":80,"lines":24,"bell":"\u0007","clear":"\u001bH\u001bJ","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u001bD","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"xterm-xf86-v32","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[11~","kf2":"\u001b[12~","kf3":"\u001b[13~","kf4":"\u001b[14~","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm-xf86-v33","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm-xf86-v333","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1048h\u001b[?1047h","rmcup":"\u001b[?1047l\u001b[?1048l","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm-xf86-v40","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001bO5C","kLFT":"\u001bO5D","kHOM":"\u001bO5H","kEND":"\u001bO5F","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm-xf86-v43","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-xf86-v44","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-xfree86","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001bO2P","kf14":"\u001bO2Q","kf15":"\u001bO2R","kf16":"\u001bO2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001bO5P","kf26":"\u001bO5Q","kf27":"\u001bO5R","kf28":"\u001bO5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001bO6P","kf38":"\u001bO6Q","kf39":"\u001bO6R","kf40":"\u001bO6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xterm-xi","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b7\u001b[?47h","rmcup":"\u001b[2J\u001b[?47l\u001b8","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u000f","smul":"\u001b[4m","bold":"\u001b[1m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xterm1","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001b[15~","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[1;2P","kf14":"\u001b[1;2Q","kf15":"\u001b[1;2R","kf16":"\u001b[1;2S","kf17":"\u001b[15;2~","kf18":"\u001b[17;2~","kf19":"\u001b[18;2~","kf20":"\u001b[19;2~","kf21":"\u001b[20;2~","kf22":"\u001b[21;2~","kf23":"\u001b[23;2~","kf24":"\u001b[24;2~","kf25":"\u001b[1;5P","kf26":"\u001b[1;5Q","kf27":"\u001b[1;5R","kf28":"\u001b[1;5S","kf29":"\u001b[15;5~","kf30":"\u001b[17;5~","kf31":"\u001b[18;5~","kf32":"\u001b[19;5~","kf33":"\u001b[20;5~","kf34":"\u001b[21;5~","kf35":"\u001b[23;5~","kf36":"\u001b[24;5~","kf37":"\u001b[1;6P","kf38":"\u001b[1;6Q","kf39":"\u001b[1;6R","kf40":"\u001b[1;6S","kf41":"\u001b[15;6~","kf42":"\u001b[17;6~","kf43":"\u001b[18;6~","kf44":"\u001b[19;6~","kf45":"\u001b[20;6~","kf46":"\u001b[21;6~","kf47":"\u001b[23;6~","kf48":"\u001b[24;6~","kf49":"\u001b[1;3P","kf50":"\u001b[1;3Q","kf51":"\u001b[1;3R","kf52":"\u001b[1;3S","kf53":"\u001b[15;3~","kf54":"\u001b[17;3~","kf55":"\u001b[18;3~","kf56":"\u001b[19;3~","kf57":"\u001b[20;3~","kf58":"\u001b[21;3~","kf59":"\u001b[23;3~","kf60":"\u001b[24;3~","kf61":"\u001b[1;4P","kf62":"\u001b[1;4Q","kf63":"\u001b[1;4R","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001bOH","kend":"\u001bOF","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kcbt":"\u001b[Z","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","kRIT":"\u001b[1;2C","kLFT":"\u001b[1;2D","kHOM":"\u001b[1;2H","kEND":"\u001b[1;2F","_setfgbg":"\u001b[3%p1%d;4%p2%dm","_kscu1":"\u001b[1;2A","_kscud1":"\u001b[1;2B","_kccu1":"\u001b[1;5A","_kccud1":"\u001b[1;5B","_kccuf1":"\u001b[1;5C","_kccub1":"\u001b[1;5D","_kmcu1":"\u001b[1;9A","_kmcud1":"\u001b[1;9B","_kmcuf1":"\u001b[1;9C","_kmcub1":"\u001b[1;9D","_kacu1":"\u001b[1;3A","_kacud1":"\u001b[1;3B","_kacuf1":"\u001b[1;3C","_kacub1":"\u001b[1;3D","_kchome":"\u001b[1;5H","_kcend":"\u001b[1;5F","_kahome":"\u001b[1;9H","_kaend":"\u001b[1;9F","_kascu1":"\u001b[1;4A","_kascud1":"\u001b[1;4B","_kascub1":"\u001b[1;4D","_kascuf1":"\u001b[1;4C","_kmscu1":"\u001b[1;10A","_kmscud1":"\u001b[1;10B","_kmscub1":"\u001b[1;10D","_kmscuf1":"\u001b[1;10C","_kcscu1":"\u001b[1;6A","_kcscud1":"\u001b[1;6B","_kcscub1":"\u001b[1;6D","_kcscuf1":"\u001b[1;6C","_kcHOME":"\u001b[1;6H","_kcEND":"\u001b[1;6F","_kaHOME":"\u001b[1;4H","_kaEND":"\u001b[1;4F","_kmHOME":"\u001b[1;10H","_kmEND":"\u001b[1;10F"} -{"name":"xtermc","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b@0\u001b[?4s\u001b[?4h\u001b@1","rmcup":"\u001b@0\u001b[?4r","sgr0":"\u001b[m\u000f","bold":"\u001b[1m","rev":"\u001b[7m","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[1D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kf11":"\u001bOZ","kf12":"\u001bOA","khome":"\u001b[H","kend":"\u001b[Y","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[\u001f","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"xtermm","cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b@0\u001b[?4s\u001b[?4h\u001b@1","rmcup":"\u001b@0\u001b[?4r","sgr0":"\u001b[m\u000f","bold":"\u001b[1m","rev":"\u001b[7m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u001b[1D","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf5":"\u001bOT","kf6":"\u001bOU","kf7":"\u001bOV","kf8":"\u001bOW","kf9":"\u001bOX","kf10":"\u001bOY","kf11":"\u001bOZ","kf12":"\u001bOA","khome":"\u001b[H","kend":"\u001b[Y","kpp":"\u001b[V","knp":"\u001b[U","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[\u001f","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u000e","rmacs":"\u000f","enacs":"\u001b(B\u001b)0"} -{"name":"xterms-sun","cols":80,"lines":24,"colors":8,"bell":"\u0007","clear":"\u001b[H\u001b[2J","smcup":"\u001b[?1049h","rmcup":"\u001b[?1049l","cnorm":"\u001b[?12l\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b(B\u001b[m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","setaf":"\u001b[3%p1%dm","setbg":"\u001b[4%p1%dm","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001b[224z","kf2":"\u001b[225z","kf3":"\u001b[226z","kf4":"\u001b[227z","kf5":"\u001b[228z","kf6":"\u001b[229z","kf7":"\u001b[230z","kf8":"\u001b[231z","kf9":"\u001b[232z","kf10":"\u001b[233z","kf11":"\u001b[192z","kf12":"\u001b[193z","kf13":"\u001b[194z","kf14":"\u001b[195z","kf15":"\u001b[196z","kf17":"\u001b[198z","kf18":"\u001b[199z","kf19":"\u001b[200z","kf20":"\u001b[201z","kf31":"\u001b[208z","kf32":"\u001b[209z","kf33":"\u001b[210z","kf34":"\u001b[211z","kf35":"\u001b[212z","kf36":"\u001b[213z","kf38":"\u001b[215z","kf40":"\u001b[217z","kf42":"\u001b[219z","kf44":"\u001b[221z","kf45":"\u001b[222z","kf46":"\u001b[234z","kf47":"\u001b[235z","kich":"\u001b[2z","kdch":"\u001b[3z","khome":"\u001b[214z","kend":"\u001b[220z","khlp":"\u001b[196z","kpp":"\u001b[216z","knp":"\u001b[222z","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kmous":"\u001b[M","XM":"%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\u001b[?1000%ga%c\u001b[?1002%ga%c\u001b[?1003%ga%c\u001b[?1006%ga%c","acsc":"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B","_setfgbg":"\u001b[3%p1%d;4%p2%dm"} -{"name":"z100","aliases":["h-100","h100","z-100","z110"],"cols":80,"lines":24,"clear":"\u001bE$\u003c5*/\u003e","cnorm":"\u001by4\u001bm70","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c$\u003c1*/\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bOI","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"~^x`qanbkcjdmelfgg+hai.kwsutvutvozs{","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"z100bw","aliases":["h-100bw","h100bw","z-100bw","z110bw"],"cols":80,"lines":24,"clear":"\u001bE$\u003c5*/\u003e","cnorm":"\u001by4","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c$\u003c1*/\u003e","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001bOI","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","acsc":"~^x`qanbkcjdmelfgg+hai.kwsutvutvozs{","smacs":"\u001bF","rmacs":"\u001bG"} -{"name":"z29","aliases":["z29b","zenith29"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001bE$\u003c14\u003e","cnorm":"\u001by4","smul":"\u001bs8","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001b$\u003c1\u003eA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bS","kf2":"\u001bT","kf3":"\u001bU","kf4":"\u001bV","kf5":"\u001bW","kf6":"\u001bP","kf7":"\u001bQ","kf8":"\u001bR","kf9":"\u001b0I","khome":"\u001bH","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC","smacs":"\u001bG","rmacs":"\u001bF"} -{"name":"z29a","aliases":["h29a-kc-bc","z29a-kc-bc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[?7l","rmcup":"\u001b[?7h","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[2m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOS","kf2":"\u001bOT","kf3":"\u001bOU","kf4":"\u001bOV","kf5":"\u001bOW","kf6":"\u001bOP","kf7":"\u001bOQ","kf8":"\u001bOR","kf9":"\u001bOX","khome":"\u001b[H","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kclr":"\u001b[J"} -{"name":"z29a-kc-uc","aliases":["h29a-kc-uc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[?7l","rmcup":"\u001b[?7h","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[2m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOS","kf2":"\u001bOT","kf3":"\u001bOU","kf4":"\u001bOV","kf5":"\u001bOW","kf6":"\u001bOP","kf7":"\u001bOQ","kf8":"\u001bOR","kf9":"\u001bOX","khome":"\u001b[H","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kclr":"\u001b[J"} -{"name":"z29a-nkc-bc","aliases":["h29a-nkc-bc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[?7l","rmcup":"\u001b[?7h","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[2m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOS","kf2":"\u001bOT","kf3":"\u001bOU","kf4":"\u001bOV","kf5":"\u001bOW","kf6":"\u001bOP","kf7":"\u001bOQ","kf8":"\u001bOR","kf9":"\u001bOX","khome":"\u001b[H","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kclr":"\u001b[J"} -{"name":"z29a-nkc-uc","aliases":["h29a-nkc-uc"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J","smcup":"\u001b[?7l","rmcup":"\u001b[?7h","sgr0":"\u001b[m","smul":"\u001b[4m","bold":"\u001b[2m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOS","kf2":"\u001bOT","kf3":"\u001bOU","kf4":"\u001bOV","kf5":"\u001bOW","kf6":"\u001bOP","kf7":"\u001bOQ","kf8":"\u001bOR","kf9":"\u001bOX","khome":"\u001b[H","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","kclr":"\u001b[J"} -{"name":"z340","cols":132,"lines":42,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"z340-nam","cols":132,"lines":42,"bell":"\u0007","clear":"\u001b[H\u001b[2J","cnorm":"\u001b[?25h","civis":"\u001b[?25l","sgr0":"\u001b[m\u001b(B","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","smkx":"\u001b[?1h\u001b=","rmkx":"\u001b[?1l\u001b\u003e","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"","kf1":"\u001bOP","kf2":"\u001bOQ","kf3":"\u001bOR","kf4":"\u001bOS","kf6":"\u001b[17~","kf7":"\u001b[18~","kf8":"\u001b[19~","kf9":"\u001b[20~","kf10":"\u001b[21~","kf11":"\u001b[23~","kf12":"\u001b[24~","kf13":"\u001b[25~","kf14":"\u001b[26~","kf15":"\u001b[28~","kf16":"\u001b[29~","kf17":"\u001b[31~","kf18":"\u001b[32~","kf19":"\u001b[33~","kf20":"\u001b[34~","kich":"\u001b[2~","kdch":"\u001b[3~","khome":"\u001b[1~","kpp":"\u001b[5~","knp":"\u001b[6~","kcuu1":"\u001bOA","kcud1":"\u001bOB","kcub1":"\u001bOD","kcuf1":"\u001bOC","acsc":"``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"z39-a","aliases":["z39a","zenith39-a","zenith39-ansi"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b[2J\u001b[H","cnorm":"\u001b[\u003e5l","civis":"\u001b[\u003e5h","sgr0":"\u001b[0m","smul":"\u001b[4m","bold":"\u001b[1m","blink":"\u001b[5m","rev":"\u001b[7m","dim":"\u001b[2m","smkx":"\u001b[\u003e7h","rmkx":"\u001b[\u003e7l","cup":"\u001b[%i%p1%d;%p2%dH","cub1":"\u0008","cuu1":"\u001b[A","pad":"\u0000","kbs":"\u0008","kf1":"\u001bOS","kf2":"\u001bOT","kf3":"\u001bOU","kf4":"\u001bOV","kf5":"\u001bOW","kf6":"\u001bOP","kf7":"\u001bOQ","kf8":"\u001bOR","kf9":"\u001bOX","khome":"\u001b[H","khlp":"\u001b[~","kcuu1":"\u001b[A","kcud1":"\u001b[B","kcub1":"\u001b[D","kcuf1":"\u001b[C","acsc":"0a``aaffggjjkkllmmnnooqqssttuuvvwwxx~~","smacs":"\u001b(0","rmacs":"\u001b(B"} -{"name":"zen30","aliases":["z30"],"cols":80,"lines":24,"bell":"\u0007","clear":"\u001b*","sgr0":"\u001bG0","rev":"\u001bG4","dim":"\u001bG2","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000"} -{"name":"zen50","aliases":["z50"],"cols":80,"lines":24,"clear":"\u001b+","sgr0":"\u001bG0","rev":"\u001bG4","cup":"\u001b=%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u000b","pad":"\u0000","khome":"\u001e","kcuu1":"\u000b","kcud1":"\n","kcub1":"\u0008","kcuf1":"\u000c"} -{"name":"ztx","aliases":["htx11","zt-1","ztx-1-a","ztx11"],"cols":80,"lines":24,"clear":"\u001bE","smul":"\u001bs2","cup":"\u001bY%p1%' '%+%c%p2%' '%+%c","cub1":"\u0008","cuu1":"\u001bA","pad":"\u0000","kbs":"\u0008","kf1":"\u001bB","kf2":"\u001bU","kf3":"\u001bV","kf4":"\u001bW","kf5":"\u001bP","kf6":"\u001bQ","kf7":"\u001bR","kcuu1":"\u001bA","kcud1":"\u001bB","kcub1":"\u001bD","kcuf1":"\u001bC"} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_adm3a.go b/vendor/github.com/gdamore/tcell/terminfo/a/adm3a/term.go similarity index 79% rename from vendor/github.com/gdamore/tcell/terminfo/term_adm3a.go rename to vendor/github.com/gdamore/tcell/terminfo/a/adm3a/term.go index d8709dac..dd8cf0f4 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_adm3a.go +++ b/vendor/github.com/gdamore/tcell/terminfo/a/adm3a/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package adm3a + +import "github.com/gdamore/tcell/terminfo" func init() { + // lsi adm3a - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "adm3a", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_aixterm.go b/vendor/github.com/gdamore/tcell/terminfo/a/aixterm/term.go similarity index 92% rename from vendor/github.com/gdamore/tcell/terminfo/term_aixterm.go rename to vendor/github.com/gdamore/tcell/terminfo/a/aixterm/term.go index e1d2146a..9dc082c8 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_aixterm.go +++ b/vendor/github.com/gdamore/tcell/terminfo/a/aixterm/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package aixterm + +import "github.com/gdamore/tcell/terminfo" func init() { + // IBM Aixterm Terminal Emulator - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "aixterm", Columns: 80, Lines: 25, @@ -20,6 +23,8 @@ func init() { SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "jjkkllmmnnqqttuuvvwwxx", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_ansi.go b/vendor/github.com/gdamore/tcell/terminfo/a/ansi/term.go similarity index 91% rename from vendor/github.com/gdamore/tcell/terminfo/term_ansi.go rename to vendor/github.com/gdamore/tcell/terminfo/a/ansi/term.go index a7909931..4500c17c 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_ansi.go +++ b/vendor/github.com/gdamore/tcell/terminfo/a/ansi/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package ansi + +import "github.com/gdamore/tcell/terminfo" func init() { + // ansi/pc-term compatible with color - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "ansi", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_aterm.go b/vendor/github.com/gdamore/tcell/terminfo/a/aterm/term.go similarity index 95% rename from vendor/github.com/gdamore/tcell/terminfo/term_aterm.go rename to vendor/github.com/gdamore/tcell/terminfo/a/aterm/term.go index 77177a22..429d29e6 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_aterm.go +++ b/vendor/github.com/gdamore/tcell/terminfo/a/aterm/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package aterm + +import "github.com/gdamore/tcell/terminfo" func init() { + // AfterStep terminal - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "aterm", Columns: 80, Lines: 24, @@ -41,7 +44,7 @@ func init() { KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", + KeyBackspace: "\xff", KeyHome: "\x1b[7~", KeyEnd: "\x1b[8~", KeyPgUp: "\x1b[5~", diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_beterm.go b/vendor/github.com/gdamore/tcell/terminfo/b/beterm/term.go similarity index 92% rename from vendor/github.com/gdamore/tcell/terminfo/term_beterm.go rename to vendor/github.com/gdamore/tcell/terminfo/b/beterm/term.go index de1b5d9f..184d0467 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_beterm.go +++ b/vendor/github.com/gdamore/tcell/terminfo/b/beterm/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package beterm + +import "github.com/gdamore/tcell/terminfo" func init() { + // BeOS Terminal - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "beterm", Columns: 80, Lines: 25, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_bsdos_pc.go b/vendor/github.com/gdamore/tcell/terminfo/b/bsdos_pc/term.go similarity index 90% rename from vendor/github.com/gdamore/tcell/terminfo/term_bsdos_pc.go rename to vendor/github.com/gdamore/tcell/terminfo/b/bsdos_pc/term.go index c0561261..3174cc7d 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_bsdos_pc.go +++ b/vendor/github.com/gdamore/tcell/terminfo/b/bsdos_pc/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package bsdos_pc + +import "github.com/gdamore/tcell/terminfo" func init() { + // IBM PC BSD/OS Console - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "bsdos-pc", Columns: 80, Lines: 25, diff --git a/vendor/github.com/gdamore/tcell/terminfo/base/base.go b/vendor/github.com/gdamore/tcell/terminfo/base/base.go new file mode 100644 index 00000000..49e6c013 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/terminfo/base/base.go @@ -0,0 +1,32 @@ +// Copyright 2019 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This is just a "minimalist" set of the base terminal descriptions. +// It should be sufficient for most applications. + +// Package base contains the base terminal descriptions that are likely +// to be needed by any stock application. It is imported by default in the +// terminfo package, so terminal types listed here will be available to any +// tcell application. +package base + +import ( + // The following imports just register themselves -- + // thse are the terminal types we aggregate in this package. + _ "github.com/gdamore/tcell/terminfo/a/ansi" + _ "github.com/gdamore/tcell/terminfo/v/vt100" + _ "github.com/gdamore/tcell/terminfo/v/vt102" + _ "github.com/gdamore/tcell/terminfo/v/vt220" + _ "github.com/gdamore/tcell/terminfo/x/xterm" +) diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_cygwin.go b/vendor/github.com/gdamore/tcell/terminfo/c/cygwin/term.go similarity index 94% rename from vendor/github.com/gdamore/tcell/terminfo/term_cygwin.go rename to vendor/github.com/gdamore/tcell/terminfo/c/cygwin/term.go index 568bbe14..e734ef5c 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_cygwin.go +++ b/vendor/github.com/gdamore/tcell/terminfo/c/cygwin/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package cygwin + +import "github.com/gdamore/tcell/terminfo" func init() { + // ansi emulation for Cygwin - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "cygwin", Colors: 8, Bell: "\a", diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_d200.go b/vendor/github.com/gdamore/tcell/terminfo/d/d200/term.go similarity index 95% rename from vendor/github.com/gdamore/tcell/terminfo/term_d200.go rename to vendor/github.com/gdamore/tcell/terminfo/d/d200/term.go index 611f6ee8..5950d5c8 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_d200.go +++ b/vendor/github.com/gdamore/tcell/terminfo/d/d200/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package d200 + +import "github.com/gdamore/tcell/terminfo" func init() { + // Data General DASHER D200 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "d200", Aliases: []string{"d200-dg"}, Columns: 80, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_d210.go b/vendor/github.com/gdamore/tcell/terminfo/d/d210/term.go similarity index 95% rename from vendor/github.com/gdamore/tcell/terminfo/term_d210.go rename to vendor/github.com/gdamore/tcell/terminfo/d/d210/term.go index 87e0662d..13a56cce 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_d210.go +++ b/vendor/github.com/gdamore/tcell/terminfo/d/d210/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package d210 + +import "github.com/gdamore/tcell/terminfo" func init() { + // Data General DASHER D210 series - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "d210", Aliases: []string{"d214"}, Columns: 80, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_dtterm.go b/vendor/github.com/gdamore/tcell/terminfo/d/dtterm/term.go similarity index 94% rename from vendor/github.com/gdamore/tcell/terminfo/term_dtterm.go rename to vendor/github.com/gdamore/tcell/terminfo/d/dtterm/term.go index 9c563c50..a6366f22 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_dtterm.go +++ b/vendor/github.com/gdamore/tcell/terminfo/d/dtterm/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package dtterm + +import "github.com/gdamore/tcell/terminfo" func init() { + // CDE desktop terminal - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "dtterm", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/e/emacs/term.go b/vendor/github.com/gdamore/tcell/terminfo/e/emacs/term.go new file mode 100644 index 00000000..91418b64 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/terminfo/e/emacs/term.go @@ -0,0 +1,60 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package emacs + +import "github.com/gdamore/tcell/terminfo" + +func init() { + + // gnu emacs term.el terminal emulation + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "eterm", + Columns: 80, + Lines: 24, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + AttrOff: "\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Reverse: "\x1b[7m", + PadChar: "\x00", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + }) + + // Emacs term.el terminal emulator term-protocol-version 0.96 + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "eterm-color", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + AttrOff: "\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + SetFg: "\x1b[%p1%{30}%+%dm", + SetBg: "\x1b[%p1%'('%+%dm", + SetFgBg: "\x1b[%p1%{30}%+%d;%p2%'('%+%dm", + PadChar: "\x00", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + }) +} diff --git a/vendor/github.com/gdamore/tcell/terminfo/e/eterm/term.go b/vendor/github.com/gdamore/tcell/terminfo/e/eterm/term.go new file mode 100644 index 00000000..e5bd99fd --- /dev/null +++ b/vendor/github.com/gdamore/tcell/terminfo/e/eterm/term.go @@ -0,0 +1,309 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package eterm + +import "github.com/gdamore/tcell/terminfo" + +func init() { + + // Eterm with xterm-style color support (X Window System) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "Eterm", + Aliases: []string{"Eterm-color"}, + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyF21: "\x1b[23$", + KeyF22: "\x1b[24$", + KeyF23: "\x1b[11^", + KeyF24: "\x1b[12^", + KeyF25: "\x1b[13^", + KeyF26: "\x1b[14^", + KeyF27: "\x1b[15^", + KeyF28: "\x1b[17^", + KeyF29: "\x1b[18^", + KeyF30: "\x1b[19^", + KeyF31: "\x1b[20^", + KeyF32: "\x1b[21^", + KeyF33: "\x1b[23^", + KeyF34: "\x1b[24^", + KeyF35: "\x1b[25^", + KeyF36: "\x1b[26^", + KeyF37: "\x1b[28^", + KeyF38: "\x1b[29^", + KeyF39: "\x1b[31^", + KeyF40: "\x1b[32^", + KeyF41: "\x1b[33^", + KeyF42: "\x1b[34^", + KeyF43: "\x1b[23@", + KeyF44: "\x1b[24@", + KeyHelp: "\x1b[28~", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + }) + + // Eterm with 88 colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "Eterm-88color", + Columns: 80, + Lines: 24, + Colors: 88, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyF21: "\x1b[23$", + KeyF22: "\x1b[24$", + KeyF23: "\x1b[11^", + KeyF24: "\x1b[12^", + KeyF25: "\x1b[13^", + KeyF26: "\x1b[14^", + KeyF27: "\x1b[15^", + KeyF28: "\x1b[17^", + KeyF29: "\x1b[18^", + KeyF30: "\x1b[19^", + KeyF31: "\x1b[20^", + KeyF32: "\x1b[21^", + KeyF33: "\x1b[23^", + KeyF34: "\x1b[24^", + KeyF35: "\x1b[25^", + KeyF36: "\x1b[26^", + KeyF37: "\x1b[28^", + KeyF38: "\x1b[29^", + KeyF39: "\x1b[31^", + KeyF40: "\x1b[32^", + KeyF41: "\x1b[33^", + KeyF42: "\x1b[34^", + KeyF43: "\x1b[23@", + KeyF44: "\x1b[24@", + KeyHelp: "\x1b[28~", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + }) + + // Eterm with xterm 256-colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "Eterm-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyF21: "\x1b[23$", + KeyF22: "\x1b[24$", + KeyF23: "\x1b[11^", + KeyF24: "\x1b[12^", + KeyF25: "\x1b[13^", + KeyF26: "\x1b[14^", + KeyF27: "\x1b[15^", + KeyF28: "\x1b[17^", + KeyF29: "\x1b[18^", + KeyF30: "\x1b[19^", + KeyF31: "\x1b[20^", + KeyF32: "\x1b[21^", + KeyF33: "\x1b[23^", + KeyF34: "\x1b[24^", + KeyF35: "\x1b[25^", + KeyF36: "\x1b[26^", + KeyF37: "\x1b[28^", + KeyF38: "\x1b[29^", + KeyF39: "\x1b[31^", + KeyF40: "\x1b[32^", + KeyF41: "\x1b[33^", + KeyF42: "\x1b[34^", + KeyF43: "\x1b[23@", + KeyF44: "\x1b[24@", + KeyHelp: "\x1b[28~", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + }) +} diff --git a/vendor/github.com/gdamore/tcell/terminfo/extended/extended.go b/vendor/github.com/gdamore/tcell/terminfo/extended/extended.go new file mode 100644 index 00000000..891220db --- /dev/null +++ b/vendor/github.com/gdamore/tcell/terminfo/extended/extended.go @@ -0,0 +1,67 @@ +// Copyright 2019 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package extended contains an extended set of terminal descriptions. +// Applications desiring to have a better chance of Just Working by +// default should include this package. This will significantly increase +// the size of the program. +package extended + +import ( + // The following imports just register themselves -- + // these are the terminal types we aggregate in this package. + _ "github.com/gdamore/tcell/terminfo/a/adm3a" + _ "github.com/gdamore/tcell/terminfo/a/aixterm" + _ "github.com/gdamore/tcell/terminfo/a/ansi" + _ "github.com/gdamore/tcell/terminfo/a/aterm" + _ "github.com/gdamore/tcell/terminfo/b/beterm" + _ "github.com/gdamore/tcell/terminfo/b/bsdos_pc" + _ "github.com/gdamore/tcell/terminfo/c/cygwin" + _ "github.com/gdamore/tcell/terminfo/d/d200" + _ "github.com/gdamore/tcell/terminfo/d/d210" + _ "github.com/gdamore/tcell/terminfo/d/dtterm" + _ "github.com/gdamore/tcell/terminfo/e/emacs" + _ "github.com/gdamore/tcell/terminfo/e/eterm" + _ "github.com/gdamore/tcell/terminfo/g/gnome" + _ "github.com/gdamore/tcell/terminfo/h/hpterm" + _ "github.com/gdamore/tcell/terminfo/h/hz1500" + _ "github.com/gdamore/tcell/terminfo/k/konsole" + _ "github.com/gdamore/tcell/terminfo/k/kterm" + _ "github.com/gdamore/tcell/terminfo/l/linux" + _ "github.com/gdamore/tcell/terminfo/p/pcansi" + _ "github.com/gdamore/tcell/terminfo/r/rxvt" + _ "github.com/gdamore/tcell/terminfo/s/screen" + _ "github.com/gdamore/tcell/terminfo/s/simpleterm" + _ "github.com/gdamore/tcell/terminfo/s/sun" + _ "github.com/gdamore/tcell/terminfo/t/termite" + _ "github.com/gdamore/tcell/terminfo/t/tvi910" + _ "github.com/gdamore/tcell/terminfo/t/tvi912" + _ "github.com/gdamore/tcell/terminfo/t/tvi921" + _ "github.com/gdamore/tcell/terminfo/t/tvi925" + _ "github.com/gdamore/tcell/terminfo/t/tvi950" + _ "github.com/gdamore/tcell/terminfo/t/tvi970" + _ "github.com/gdamore/tcell/terminfo/v/vt100" + _ "github.com/gdamore/tcell/terminfo/v/vt102" + _ "github.com/gdamore/tcell/terminfo/v/vt220" + _ "github.com/gdamore/tcell/terminfo/v/vt320" + _ "github.com/gdamore/tcell/terminfo/v/vt400" + _ "github.com/gdamore/tcell/terminfo/v/vt420" + _ "github.com/gdamore/tcell/terminfo/v/vt52" + _ "github.com/gdamore/tcell/terminfo/w/wy50" + _ "github.com/gdamore/tcell/terminfo/w/wy60" + _ "github.com/gdamore/tcell/terminfo/w/wy99_ansi" + _ "github.com/gdamore/tcell/terminfo/x/xfce" + _ "github.com/gdamore/tcell/terminfo/x/xnuppc" + _ "github.com/gdamore/tcell/terminfo/x/xterm" +) diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_gnome_256color.go b/vendor/github.com/gdamore/tcell/terminfo/g/gnome/term.go similarity index 50% rename from vendor/github.com/gdamore/tcell/terminfo/term_gnome_256color.go rename to vendor/github.com/gdamore/tcell/terminfo/g/gnome/term.go index 342699d4..08b913eb 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_gnome_256color.go +++ b/vendor/github.com/gdamore/tcell/terminfo/g/gnome/term.go @@ -1,10 +1,162 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package gnome + +import "github.com/gdamore/tcell/terminfo" func init() { + + // GNOME Terminal + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "gnome", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + PadChar: "\x00", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1bO1;2P", + KeyF14: "\x1bO1;2Q", + KeyF15: "\x1bO1;2R", + KeyF16: "\x1bO1;2S", + KeyF17: "\x1b[15;2~", + KeyF18: "\x1b[17;2~", + KeyF19: "\x1b[18;2~", + KeyF20: "\x1b[19;2~", + KeyF21: "\x1b[20;2~", + KeyF22: "\x1b[21;2~", + KeyF23: "\x1b[23;2~", + KeyF24: "\x1b[24;2~", + KeyF25: "\x1bO1;5P", + KeyF26: "\x1bO1;5Q", + KeyF27: "\x1bO1;5R", + KeyF28: "\x1bO1;5S", + KeyF29: "\x1b[15;5~", + KeyF30: "\x1b[17;5~", + KeyF31: "\x1b[18;5~", + KeyF32: "\x1b[19;5~", + KeyF33: "\x1b[20;5~", + KeyF34: "\x1b[21;5~", + KeyF35: "\x1b[23;5~", + KeyF36: "\x1b[24;5~", + KeyF37: "\x1bO1;6P", + KeyF38: "\x1bO1;6Q", + KeyF39: "\x1bO1;6R", + KeyF40: "\x1bO1;6S", + KeyF41: "\x1b[15;6~", + KeyF42: "\x1b[17;6~", + KeyF43: "\x1b[18;6~", + KeyF44: "\x1b[19;6~", + KeyF45: "\x1b[20;6~", + KeyF46: "\x1b[21;6~", + KeyF47: "\x1b[23;6~", + KeyF48: "\x1b[24;6~", + KeyF49: "\x1bO1;3P", + KeyF50: "\x1bO1;3Q", + KeyF51: "\x1bO1;3R", + KeyF52: "\x1bO1;3S", + KeyF53: "\x1b[15;3~", + KeyF54: "\x1b[17;3~", + KeyF55: "\x1b[18;3~", + KeyF56: "\x1b[19;3~", + KeyF57: "\x1b[20;3~", + KeyF58: "\x1b[21;3~", + KeyF59: "\x1b[23;3~", + KeyF60: "\x1b[24;3~", + KeyF61: "\x1bO1;4P", + KeyF62: "\x1bO1;4Q", + KeyF63: "\x1bO1;4R", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[1;2D", + KeyShfRight: "\x1b[1;2C", + KeyShfUp: "\x1b[1;2A", + KeyShfDown: "\x1b[1;2B", + KeyCtrlLeft: "\x1b[1;5D", + KeyCtrlRight: "\x1b[1;5C", + KeyCtrlUp: "\x1b[1;5A", + KeyCtrlDown: "\x1b[1;5B", + KeyMetaLeft: "\x1b[1;9D", + KeyMetaRight: "\x1b[1;9C", + KeyMetaUp: "\x1b[1;9A", + KeyMetaDown: "\x1b[1;9B", + KeyAltLeft: "\x1b[1;3D", + KeyAltRight: "\x1b[1;3C", + KeyAltUp: "\x1b[1;3A", + KeyAltDown: "\x1b[1;3B", + KeyAltShfLeft: "\x1b[1;4D", + KeyAltShfRight: "\x1b[1;4C", + KeyAltShfUp: "\x1b[1;4A", + KeyAltShfDown: "\x1b[1;4B", + KeyMetaShfLeft: "\x1b[1;10D", + KeyMetaShfRight: "\x1b[1;10C", + KeyMetaShfUp: "\x1b[1;10A", + KeyMetaShfDown: "\x1b[1;10B", + KeyCtrlShfLeft: "\x1b[1;6D", + KeyCtrlShfRight: "\x1b[1;6C", + KeyCtrlShfUp: "\x1b[1;6A", + KeyCtrlShfDown: "\x1b[1;6B", + KeyShfHome: "\x1b[1;2H", + KeyShfEnd: "\x1b[1;2F", + KeyCtrlHome: "\x1b[1;5H", + KeyCtrlEnd: "\x1b[1;5F", + KeyAltHome: "\x1b[1;9H", + KeyAltEnd: "\x1b[1;9F", + KeyCtrlShfHome: "\x1b[1;6H", + KeyCtrlShfEnd: "\x1b[1;6F", + KeyMetaShfHome: "\x1b[1;10H", + KeyMetaShfEnd: "\x1b[1;10F", + KeyAltShfHome: "\x1b[1;4H", + KeyAltShfEnd: "\x1b[1;4F", + }) + // GNOME Terminal with xterm 256-colors - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "gnome-256color", Columns: 80, Lines: 24, @@ -30,7 +182,7 @@ func init() { EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", - Mouse: "\x1b[M", + Mouse: "\x1b[<", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", @@ -41,7 +193,7 @@ func init() { KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", + KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", diff --git a/vendor/github.com/gdamore/tcell/terminfo/gen.sh b/vendor/github.com/gdamore/tcell/terminfo/gen.sh new file mode 100644 index 00000000..2fc06112 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/terminfo/gen.sh @@ -0,0 +1,18 @@ +while read line +do + case "$line" in + *'|'*) + alias=${line#*|} + line=${line%|*} + ;; + *) + alias=${line%%,*} + ;; + esac + + alias=${alias//-/_} + direc=${alias:0:1} + + mkdir -p ${direc}/${alias} + go run mkinfo.go -P ${alias} -go ${direc}/${alias}/term.go ${line//,/ } +done < models.txt diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_hpterm.go b/vendor/github.com/gdamore/tcell/terminfo/h/hpterm/term.go similarity index 88% rename from vendor/github.com/gdamore/tcell/terminfo/term_hpterm.go rename to vendor/github.com/gdamore/tcell/terminfo/h/hpterm/term.go index 0fa30bc6..5e73e044 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_hpterm.go +++ b/vendor/github.com/gdamore/tcell/terminfo/h/hpterm/term.go @@ -1,17 +1,20 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package hpterm + +import "github.com/gdamore/tcell/terminfo" func init() { + // hp X11 terminal emulator - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "hpterm", Aliases: []string{"X-hpterm"}, Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b&a0y0C\x1bJ", - AttrOff: "\x1b&d@", + AttrOff: "\x1b&d@\x0f", Underline: "\x1b&dD", Bold: "\x1b&dB", Dim: "\x1b&dH", diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_hz1500.go b/vendor/github.com/gdamore/tcell/terminfo/h/hz1500/term.go similarity index 81% rename from vendor/github.com/gdamore/tcell/terminfo/term_hz1500.go rename to vendor/github.com/gdamore/tcell/terminfo/h/hz1500/term.go index 34ef6efa..3ad18109 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_hz1500.go +++ b/vendor/github.com/gdamore/tcell/terminfo/h/hz1500/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package hz1500 + +import "github.com/gdamore/tcell/terminfo" func init() { + // hazeltine 1500 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "hz1500", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/k/konsole/term.go b/vendor/github.com/gdamore/tcell/terminfo/k/konsole/term.go new file mode 100644 index 00000000..21cd72ae --- /dev/null +++ b/vendor/github.com/gdamore/tcell/terminfo/k/konsole/term.go @@ -0,0 +1,304 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package konsole + +import "github.com/gdamore/tcell/terminfo" + +func init() { + + // KDE console window + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "konsole", + Columns: 80, + Lines: 24, + Colors: 8, + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1bO2P", + KeyF14: "\x1bO2Q", + KeyF15: "\x1bO2R", + KeyF16: "\x1bO2S", + KeyF17: "\x1b[15;2~", + KeyF18: "\x1b[17;2~", + KeyF19: "\x1b[18;2~", + KeyF20: "\x1b[19;2~", + KeyF21: "\x1b[20;2~", + KeyF22: "\x1b[21;2~", + KeyF23: "\x1b[23;2~", + KeyF24: "\x1b[24;2~", + KeyF25: "\x1bO5P", + KeyF26: "\x1bO5Q", + KeyF27: "\x1bO5R", + KeyF28: "\x1bO5S", + KeyF29: "\x1b[15;5~", + KeyF30: "\x1b[17;5~", + KeyF31: "\x1b[18;5~", + KeyF32: "\x1b[19;5~", + KeyF33: "\x1b[20;5~", + KeyF34: "\x1b[21;5~", + KeyF35: "\x1b[23;5~", + KeyF36: "\x1b[24;5~", + KeyF37: "\x1bO6P", + KeyF38: "\x1bO6Q", + KeyF39: "\x1bO6R", + KeyF40: "\x1bO6S", + KeyF41: "\x1b[15;6~", + KeyF42: "\x1b[17;6~", + KeyF43: "\x1b[18;6~", + KeyF44: "\x1b[19;6~", + KeyF45: "\x1b[20;6~", + KeyF46: "\x1b[21;6~", + KeyF47: "\x1b[23;6~", + KeyF48: "\x1b[24;6~", + KeyF49: "\x1bO3P", + KeyF50: "\x1bO3Q", + KeyF51: "\x1bO3R", + KeyF52: "\x1bO3S", + KeyF53: "\x1b[15;3~", + KeyF54: "\x1b[17;3~", + KeyF55: "\x1b[18;3~", + KeyF56: "\x1b[19;3~", + KeyF57: "\x1b[20;3~", + KeyF58: "\x1b[21;3~", + KeyF59: "\x1b[23;3~", + KeyF60: "\x1b[24;3~", + KeyF61: "\x1bO4P", + KeyF62: "\x1bO4Q", + KeyF63: "\x1bO4R", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[1;2D", + KeyShfRight: "\x1b[1;2C", + KeyShfUp: "\x1b[1;2A", + KeyShfDown: "\x1b[1;2B", + KeyCtrlLeft: "\x1b[1;5D", + KeyCtrlRight: "\x1b[1;5C", + KeyCtrlUp: "\x1b[1;5A", + KeyCtrlDown: "\x1b[1;5B", + KeyMetaLeft: "\x1b[1;9D", + KeyMetaRight: "\x1b[1;9C", + KeyMetaUp: "\x1b[1;9A", + KeyMetaDown: "\x1b[1;9B", + KeyAltLeft: "\x1b[1;3D", + KeyAltRight: "\x1b[1;3C", + KeyAltUp: "\x1b[1;3A", + KeyAltDown: "\x1b[1;3B", + KeyAltShfLeft: "\x1b[1;4D", + KeyAltShfRight: "\x1b[1;4C", + KeyAltShfUp: "\x1b[1;4A", + KeyAltShfDown: "\x1b[1;4B", + KeyMetaShfLeft: "\x1b[1;10D", + KeyMetaShfRight: "\x1b[1;10C", + KeyMetaShfUp: "\x1b[1;10A", + KeyMetaShfDown: "\x1b[1;10B", + KeyCtrlShfLeft: "\x1b[1;6D", + KeyCtrlShfRight: "\x1b[1;6C", + KeyCtrlShfUp: "\x1b[1;6A", + KeyCtrlShfDown: "\x1b[1;6B", + KeyShfHome: "\x1b[1;2H", + KeyShfEnd: "\x1b[1;2F", + KeyCtrlHome: "\x1b[1;5H", + KeyCtrlEnd: "\x1b[1;5F", + KeyAltHome: "\x1b[1;9H", + KeyAltEnd: "\x1b[1;9F", + KeyCtrlShfHome: "\x1b[1;6H", + KeyCtrlShfEnd: "\x1b[1;6F", + KeyMetaShfHome: "\x1b[1;10H", + KeyMetaShfEnd: "\x1b[1;10F", + KeyAltShfHome: "\x1b[1;4H", + KeyAltShfEnd: "\x1b[1;4F", + }) + + // KDE console window with xterm 256-colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "konsole-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1bO2P", + KeyF14: "\x1bO2Q", + KeyF15: "\x1bO2R", + KeyF16: "\x1bO2S", + KeyF17: "\x1b[15;2~", + KeyF18: "\x1b[17;2~", + KeyF19: "\x1b[18;2~", + KeyF20: "\x1b[19;2~", + KeyF21: "\x1b[20;2~", + KeyF22: "\x1b[21;2~", + KeyF23: "\x1b[23;2~", + KeyF24: "\x1b[24;2~", + KeyF25: "\x1bO5P", + KeyF26: "\x1bO5Q", + KeyF27: "\x1bO5R", + KeyF28: "\x1bO5S", + KeyF29: "\x1b[15;5~", + KeyF30: "\x1b[17;5~", + KeyF31: "\x1b[18;5~", + KeyF32: "\x1b[19;5~", + KeyF33: "\x1b[20;5~", + KeyF34: "\x1b[21;5~", + KeyF35: "\x1b[23;5~", + KeyF36: "\x1b[24;5~", + KeyF37: "\x1bO6P", + KeyF38: "\x1bO6Q", + KeyF39: "\x1bO6R", + KeyF40: "\x1bO6S", + KeyF41: "\x1b[15;6~", + KeyF42: "\x1b[17;6~", + KeyF43: "\x1b[18;6~", + KeyF44: "\x1b[19;6~", + KeyF45: "\x1b[20;6~", + KeyF46: "\x1b[21;6~", + KeyF47: "\x1b[23;6~", + KeyF48: "\x1b[24;6~", + KeyF49: "\x1bO3P", + KeyF50: "\x1bO3Q", + KeyF51: "\x1bO3R", + KeyF52: "\x1bO3S", + KeyF53: "\x1b[15;3~", + KeyF54: "\x1b[17;3~", + KeyF55: "\x1b[18;3~", + KeyF56: "\x1b[19;3~", + KeyF57: "\x1b[20;3~", + KeyF58: "\x1b[21;3~", + KeyF59: "\x1b[23;3~", + KeyF60: "\x1b[24;3~", + KeyF61: "\x1bO4P", + KeyF62: "\x1bO4Q", + KeyF63: "\x1bO4R", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[1;2D", + KeyShfRight: "\x1b[1;2C", + KeyShfUp: "\x1b[1;2A", + KeyShfDown: "\x1b[1;2B", + KeyCtrlLeft: "\x1b[1;5D", + KeyCtrlRight: "\x1b[1;5C", + KeyCtrlUp: "\x1b[1;5A", + KeyCtrlDown: "\x1b[1;5B", + KeyMetaLeft: "\x1b[1;9D", + KeyMetaRight: "\x1b[1;9C", + KeyMetaUp: "\x1b[1;9A", + KeyMetaDown: "\x1b[1;9B", + KeyAltLeft: "\x1b[1;3D", + KeyAltRight: "\x1b[1;3C", + KeyAltUp: "\x1b[1;3A", + KeyAltDown: "\x1b[1;3B", + KeyAltShfLeft: "\x1b[1;4D", + KeyAltShfRight: "\x1b[1;4C", + KeyAltShfUp: "\x1b[1;4A", + KeyAltShfDown: "\x1b[1;4B", + KeyMetaShfLeft: "\x1b[1;10D", + KeyMetaShfRight: "\x1b[1;10C", + KeyMetaShfUp: "\x1b[1;10A", + KeyMetaShfDown: "\x1b[1;10B", + KeyCtrlShfLeft: "\x1b[1;6D", + KeyCtrlShfRight: "\x1b[1;6C", + KeyCtrlShfUp: "\x1b[1;6A", + KeyCtrlShfDown: "\x1b[1;6B", + KeyShfHome: "\x1b[1;2H", + KeyShfEnd: "\x1b[1;2F", + KeyCtrlHome: "\x1b[1;5H", + KeyCtrlEnd: "\x1b[1;5F", + KeyAltHome: "\x1b[1;9H", + KeyAltEnd: "\x1b[1;9F", + KeyCtrlShfHome: "\x1b[1;6H", + KeyCtrlShfEnd: "\x1b[1;6F", + KeyMetaShfHome: "\x1b[1;10H", + KeyMetaShfEnd: "\x1b[1;10F", + KeyAltShfHome: "\x1b[1;4H", + KeyAltShfEnd: "\x1b[1;4F", + }) +} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_kterm.go b/vendor/github.com/gdamore/tcell/terminfo/k/kterm/term.go similarity index 93% rename from vendor/github.com/gdamore/tcell/terminfo/term_kterm.go rename to vendor/github.com/gdamore/tcell/terminfo/k/kterm/term.go index a7ec2f10..f4478404 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_kterm.go +++ b/vendor/github.com/gdamore/tcell/terminfo/k/kterm/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package kterm + +import "github.com/gdamore/tcell/terminfo" func init() { + // kterm kanji terminal emulator (X window system) - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "kterm", Columns: 80, Lines: 24, @@ -37,7 +40,7 @@ func init() { KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", - KeyBackspace: "\b", + KeyBackspace: "\xff", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_linux.go b/vendor/github.com/gdamore/tcell/terminfo/l/linux/term.go similarity index 92% rename from vendor/github.com/gdamore/tcell/terminfo/term_linux.go rename to vendor/github.com/gdamore/tcell/terminfo/l/linux/term.go index a3d18720..1702c363 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_linux.go +++ b/vendor/github.com/gdamore/tcell/terminfo/l/linux/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package linux + +import "github.com/gdamore/tcell/terminfo" func init() { + // linux console - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "linux", Colors: 8, Bell: "\a", @@ -24,7 +27,7 @@ func init() { AltChars: "++,,--..00__``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}c~~", EnterAcs: "\x0e", ExitAcs: "\x0f", - EnableAcs: "\x1b(B\x1b)0", + EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", @@ -36,7 +39,7 @@ func init() { KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", + KeyBackspace: "\xff", KeyHome: "\x1b[1~", KeyEnd: "\x1b[4~", KeyPgUp: "\x1b[5~", diff --git a/vendor/github.com/gdamore/tcell/terminfo/mkinfo.go b/vendor/github.com/gdamore/tcell/terminfo/mkinfo.go deleted file mode 100644 index 53e8d873..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/mkinfo.go +++ /dev/null @@ -1,888 +0,0 @@ -// +build ignore - -// Copyright 2019 The TCell Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use file except in compliance with the License. -// You may obtain a copy of the license at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// This command is used to generate suitable configuration files in either -// go syntax or in JSON. It defaults to JSON output on stdout. If no -// term values are specified on the command line, then $TERM is used. -// -// Usage is like this: -// -// mkinfo [-init] [-go file.go] [-json file.json] [-quiet] [-nofatal] [...] -// -// -all scan terminfo to determine database entries to use -// -db generate database entries (database/*), implied for -all -// -gzip specifies output should be compressed (json only) -// -go specifies Go output into the named file. Use - for stdout. -// -json specifies JSON output in the named file. Use - for stdout -// -nofatal indicates that errors loading definitions should not be fatal -// - -package main - -import ( - "bufio" - "bytes" - "compress/gzip" - "crypto/sha1" - "encoding/json" - "errors" - "flag" - "fmt" - "io" - "os" - "os/exec" - "path" - "regexp" - "strconv" - "strings" - - "github.com/gdamore/tcell/terminfo" -) - -type termcap struct { - name string - desc string - aliases []string - bools map[string]bool - nums map[string]int - strs map[string]string -} - -func (tc *termcap) getnum(s string) int { - return (tc.nums[s]) -} - -func (tc *termcap) getflag(s string) bool { - return (tc.bools[s]) -} - -func (tc *termcap) getstr(s string) string { - return (tc.strs[s]) -} - -const ( - NONE = iota - CTRL - ESC -) - -var notaddressable = errors.New("terminal not cursor addressable") - -func unescape(s string) string { - // Various escapes are in \x format. Control codes are - // encoded as ^M (carat followed by ASCII equivalent). - // Escapes are: \e, \E - escape - // \0 NULL, \n \l \r \t \b \f \s for equivalent C escape. - buf := &bytes.Buffer{} - esc := NONE - - for i := 0; i < len(s); i++ { - c := s[i] - switch esc { - case NONE: - switch c { - case '\\': - esc = ESC - case '^': - esc = CTRL - default: - buf.WriteByte(c) - } - case CTRL: - buf.WriteByte(c - 0x40) - esc = NONE - case ESC: - switch c { - case 'E', 'e': - buf.WriteByte(0x1b) - case '0', '1', '2', '3', '4', '5', '6', '7': - if i+2 < len(s) && s[i+1] >= '0' && s[i+1] <= '7' && s[i+2] >= '0' && s[i+2] <= '7' { - buf.WriteByte(((c - '0') * 64) + ((s[i+1] - '0') * 8) + (s[i+2] - '0')) - i = i + 2 - } else if c == '0' { - buf.WriteByte(0) - } - case 'n': - buf.WriteByte('\n') - case 'r': - buf.WriteByte('\r') - case 't': - buf.WriteByte('\t') - case 'b': - buf.WriteByte('\b') - case 'f': - buf.WriteByte('\f') - case 's': - buf.WriteByte(' ') - case 'l': - panic("WTF: weird format: " + s) - default: - buf.WriteByte(c) - } - esc = NONE - } - } - return (buf.String()) -} - -func getallterms() ([]string, error) { - out := []string{} - cmd := exec.Command("toe", "-a") - output := &bytes.Buffer{} - cmd.Stdout = output - err := cmd.Run() - if err != nil { - return nil, err - } - lines := strings.Split(output.String(), "\n") - for _, l := range lines { - fields := strings.Fields(l) - if len(fields) > 0 { - out = append(out, fields[0]) - } - } - return out, nil -} - -func (tc *termcap) setupterm(name string) error { - cmd := exec.Command("infocmp", "-1", name) - output := &bytes.Buffer{} - cmd.Stdout = output - - tc.strs = make(map[string]string) - tc.bools = make(map[string]bool) - tc.nums = make(map[string]int) - - err := cmd.Run() - if err != nil { - return err - } - - // Now parse the output. - // We get comment lines (starting with "#"), followed by - // a header line that looks like "||...|" - // then capabilities, one per line, starting with a tab and ending - // with a comma and newline. - lines := strings.Split(output.String(), "\n") - for len(lines) > 0 && strings.HasPrefix(lines[0], "#") { - lines = lines[1:] - } - - // Ditch trailing empty last line - if lines[len(lines)-1] == "" { - lines = lines[:len(lines)-1] - } - header := lines[0] - if strings.HasSuffix(header, ",") { - header = header[:len(header)-1] - } - names := strings.Split(header, "|") - tc.name = names[0] - names = names[1:] - if len(names) > 0 { - tc.desc = names[len(names)-1] - names = names[:len(names)-1] - } - tc.aliases = names - for _, val := range lines[1:] { - if (!strings.HasPrefix(val, "\t")) || - (!strings.HasSuffix(val, ",")) { - return (errors.New("malformed infocmp: " + val)) - } - - val = val[1:] - val = val[:len(val)-1] - - if k := strings.SplitN(val, "=", 2); len(k) == 2 { - tc.strs[k[0]] = unescape(k[1]) - } else if k := strings.SplitN(val, "#", 2); len(k) == 2 { - if u, err := strconv.ParseUint(k[1], 0, 0); err != nil { - return (err) - } else { - tc.nums[k[0]] = int(u) - } - } else { - tc.bools[val] = true - } - } - return nil -} - -// This program is used to collect data from the system's terminfo library, -// and write it into Go source code. That is, we maintain our terminfo -// capabilities encoded in the program. It should never need to be run by -// an end user, but developers can use this to add codes for additional -// terminal types. -func getinfo(name string) (*terminfo.Terminfo, string, error) { - var tc termcap - if err := tc.setupterm(name); err != nil { - if err != nil { - return nil, "", err - } - } - t := &terminfo.Terminfo{} - // If this is an alias record, then just emit the alias - t.Name = tc.name - if t.Name != name { - return t, "", nil - } - t.Aliases = tc.aliases - t.Colors = tc.getnum("colors") - t.Columns = tc.getnum("cols") - t.Lines = tc.getnum("lines") - t.Bell = tc.getstr("bel") - t.Clear = tc.getstr("clear") - t.EnterCA = tc.getstr("smcup") - t.ExitCA = tc.getstr("rmcup") - t.ShowCursor = tc.getstr("cnorm") - t.HideCursor = tc.getstr("civis") - t.AttrOff = tc.getstr("sgr0") - t.Underline = tc.getstr("smul") - t.Bold = tc.getstr("bold") - t.Blink = tc.getstr("blink") - t.Dim = tc.getstr("dim") - t.Reverse = tc.getstr("rev") - t.EnterKeypad = tc.getstr("smkx") - t.ExitKeypad = tc.getstr("rmkx") - t.SetFg = tc.getstr("setaf") - t.SetBg = tc.getstr("setab") - t.SetCursor = tc.getstr("cup") - t.CursorBack1 = tc.getstr("cub1") - t.CursorUp1 = tc.getstr("cuu1") - t.KeyF1 = tc.getstr("kf1") - t.KeyF2 = tc.getstr("kf2") - t.KeyF3 = tc.getstr("kf3") - t.KeyF4 = tc.getstr("kf4") - t.KeyF5 = tc.getstr("kf5") - t.KeyF6 = tc.getstr("kf6") - t.KeyF7 = tc.getstr("kf7") - t.KeyF8 = tc.getstr("kf8") - t.KeyF9 = tc.getstr("kf9") - t.KeyF10 = tc.getstr("kf10") - t.KeyF11 = tc.getstr("kf11") - t.KeyF12 = tc.getstr("kf12") - t.KeyF13 = tc.getstr("kf13") - t.KeyF14 = tc.getstr("kf14") - t.KeyF15 = tc.getstr("kf15") - t.KeyF16 = tc.getstr("kf16") - t.KeyF17 = tc.getstr("kf17") - t.KeyF18 = tc.getstr("kf18") - t.KeyF19 = tc.getstr("kf19") - t.KeyF20 = tc.getstr("kf20") - t.KeyF21 = tc.getstr("kf21") - t.KeyF22 = tc.getstr("kf22") - t.KeyF23 = tc.getstr("kf23") - t.KeyF24 = tc.getstr("kf24") - t.KeyF25 = tc.getstr("kf25") - t.KeyF26 = tc.getstr("kf26") - t.KeyF27 = tc.getstr("kf27") - t.KeyF28 = tc.getstr("kf28") - t.KeyF29 = tc.getstr("kf29") - t.KeyF30 = tc.getstr("kf30") - t.KeyF31 = tc.getstr("kf31") - t.KeyF32 = tc.getstr("kf32") - t.KeyF33 = tc.getstr("kf33") - t.KeyF34 = tc.getstr("kf34") - t.KeyF35 = tc.getstr("kf35") - t.KeyF36 = tc.getstr("kf36") - t.KeyF37 = tc.getstr("kf37") - t.KeyF38 = tc.getstr("kf38") - t.KeyF39 = tc.getstr("kf39") - t.KeyF40 = tc.getstr("kf40") - t.KeyF41 = tc.getstr("kf41") - t.KeyF42 = tc.getstr("kf42") - t.KeyF43 = tc.getstr("kf43") - t.KeyF44 = tc.getstr("kf44") - t.KeyF45 = tc.getstr("kf45") - t.KeyF46 = tc.getstr("kf46") - t.KeyF47 = tc.getstr("kf47") - t.KeyF48 = tc.getstr("kf48") - t.KeyF49 = tc.getstr("kf49") - t.KeyF50 = tc.getstr("kf50") - t.KeyF51 = tc.getstr("kf51") - t.KeyF52 = tc.getstr("kf52") - t.KeyF53 = tc.getstr("kf53") - t.KeyF54 = tc.getstr("kf54") - t.KeyF55 = tc.getstr("kf55") - t.KeyF56 = tc.getstr("kf56") - t.KeyF57 = tc.getstr("kf57") - t.KeyF58 = tc.getstr("kf58") - t.KeyF59 = tc.getstr("kf59") - t.KeyF60 = tc.getstr("kf60") - t.KeyF61 = tc.getstr("kf61") - t.KeyF62 = tc.getstr("kf62") - t.KeyF63 = tc.getstr("kf63") - t.KeyF64 = tc.getstr("kf64") - t.KeyInsert = tc.getstr("kich1") - t.KeyDelete = tc.getstr("kdch1") - t.KeyBackspace = tc.getstr("kbs") - t.KeyHome = tc.getstr("khome") - t.KeyEnd = tc.getstr("kend") - t.KeyUp = tc.getstr("kcuu1") - t.KeyDown = tc.getstr("kcud1") - t.KeyRight = tc.getstr("kcuf1") - t.KeyLeft = tc.getstr("kcub1") - t.KeyPgDn = tc.getstr("knp") - t.KeyPgUp = tc.getstr("kpp") - t.KeyBacktab = tc.getstr("kcbt") - t.KeyExit = tc.getstr("kext") - t.KeyCancel = tc.getstr("kcan") - t.KeyPrint = tc.getstr("kprt") - t.KeyHelp = tc.getstr("khlp") - t.KeyClear = tc.getstr("kclr") - t.AltChars = tc.getstr("acsc") - t.EnterAcs = tc.getstr("smacs") - t.ExitAcs = tc.getstr("rmacs") - t.EnableAcs = tc.getstr("enacs") - t.Mouse = tc.getstr("kmous") - t.KeyShfRight = tc.getstr("kRIT") - t.KeyShfLeft = tc.getstr("kLFT") - t.KeyShfHome = tc.getstr("kHOM") - t.KeyShfEnd = tc.getstr("kEND") - - // Terminfo lacks descriptions for a bunch of modified keys, - // but modern XTerm and emulators often have them. Let's add them, - // if the shifted right and left arrows are defined. - if t.KeyShfRight == "\x1b[1;2C" && t.KeyShfLeft == "\x1b[1;2D" { - t.KeyShfUp = "\x1b[1;2A" - t.KeyShfDown = "\x1b[1;2B" - t.KeyMetaUp = "\x1b[1;9A" - t.KeyMetaDown = "\x1b[1;9B" - t.KeyMetaRight = "\x1b[1;9C" - t.KeyMetaLeft = "\x1b[1;9D" - t.KeyAltUp = "\x1b[1;3A" - t.KeyAltDown = "\x1b[1;3B" - t.KeyAltRight = "\x1b[1;3C" - t.KeyAltLeft = "\x1b[1;3D" - t.KeyCtrlUp = "\x1b[1;5A" - t.KeyCtrlDown = "\x1b[1;5B" - t.KeyCtrlRight = "\x1b[1;5C" - t.KeyCtrlLeft = "\x1b[1;5D" - t.KeyAltShfUp = "\x1b[1;4A" - t.KeyAltShfDown = "\x1b[1;4B" - t.KeyAltShfRight = "\x1b[1;4C" - t.KeyAltShfLeft = "\x1b[1;4D" - - t.KeyMetaShfUp = "\x1b[1;10A" - t.KeyMetaShfDown = "\x1b[1;10B" - t.KeyMetaShfRight = "\x1b[1;10C" - t.KeyMetaShfLeft = "\x1b[1;10D" - - t.KeyCtrlShfUp = "\x1b[1;6A" - t.KeyCtrlShfDown = "\x1b[1;6B" - t.KeyCtrlShfRight = "\x1b[1;6C" - t.KeyCtrlShfLeft = "\x1b[1;6D" - } - // And also for Home and End - if t.KeyShfHome == "\x1b[1;2H" && t.KeyShfEnd == "\x1b[1;2F" { - t.KeyCtrlHome = "\x1b[1;5H" - t.KeyCtrlEnd = "\x1b[1;5F" - t.KeyAltHome = "\x1b[1;9H" - t.KeyAltEnd = "\x1b[1;9F" - t.KeyCtrlShfHome = "\x1b[1;6H" - t.KeyCtrlShfEnd = "\x1b[1;6F" - t.KeyAltShfHome = "\x1b[1;4H" - t.KeyAltShfEnd = "\x1b[1;4F" - t.KeyMetaShfHome = "\x1b[1;10H" - t.KeyMetaShfEnd = "\x1b[1;10F" - } - - // And the same thing for rxvt and workalikes (Eterm, aterm, etc.) - // It seems that urxvt at least send ESC as ALT prefix for these, - // although some places seem to indicate a separate ALT key sesquence. - if t.KeyShfRight == "\x1b[c" && t.KeyShfLeft == "\x1b[d" { - t.KeyShfUp = "\x1b[a" - t.KeyShfDown = "\x1b[b" - t.KeyCtrlUp = "\x1b[Oa" - t.KeyCtrlDown = "\x1b[Ob" - t.KeyCtrlRight = "\x1b[Oc" - t.KeyCtrlLeft = "\x1b[Od" - } - if t.KeyShfHome == "\x1b[7$" && t.KeyShfEnd == "\x1b[8$" { - t.KeyCtrlHome = "\x1b[7^" - t.KeyCtrlEnd = "\x1b[8^" - } - - // If the kmous entry is present, then we need to record the - // the codes to enter and exit mouse mode. Sadly, this is not - // part of the terminfo databases anywhere that I've found, but - // is an extension. The escape codes are documented in the XTerm - // manual, and all terminals that have kmous are expected to - // use these same codes, unless explicitly configured otherwise - // vi XM. Note that in any event, we only known how to parse either - // x11 or SGR mouse events -- if your terminal doesn't support one - // of these two forms, you maybe out of luck. - t.MouseMode = tc.getstr("XM") - if t.Mouse != "" && t.MouseMode == "" { - // we anticipate that all xterm mouse tracking compatible - // terminals understand mouse tracking (1000), but we hope - // that those that don't understand any-event tracking (1003) - // will at least ignore it. Likewise we hope that terminals - // that don't understand SGR reporting (1006) just ignore it. - t.MouseMode = "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;" + - "\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c" - } - - // We only support colors in ANSI 8 or 256 color mode. - if t.Colors < 8 || t.SetFg == "" { - t.Colors = 0 - } - if t.SetCursor == "" { - return nil, "", notaddressable - } - - // For padding, we lookup the pad char. If that isn't present, - // and npc is *not* set, then we assume a null byte. - t.PadChar = tc.getstr("pad") - if t.PadChar == "" { - if !tc.getflag("npc") { - t.PadChar = "\u0000" - } - } - - // For terminals that use "standard" SGR sequences, lets combine the - // foreground and background together. - if strings.HasPrefix(t.SetFg, "\x1b[") && - strings.HasPrefix(t.SetBg, "\x1b[") && - strings.HasSuffix(t.SetFg, "m") && - strings.HasSuffix(t.SetBg, "m") { - fg := t.SetFg[:len(t.SetFg)-1] - r := regexp.MustCompile("%p1") - bg := r.ReplaceAllString(t.SetBg[2:], "%p2") - t.SetFgBg = fg + ";" + bg - } - - return t, tc.desc, nil -} - -func dotGoAddInt(w io.Writer, n string, i int) { - if i == 0 { - // initialized to 0, ignore - return - } - fmt.Fprintf(w, "\t\t%-13s %d,\n", n+":", i) -} -func dotGoAddStr(w io.Writer, n string, s string) { - if s == "" { - return - } - fmt.Fprintf(w, "\t\t%-13s %q,\n", n+":", s) -} - -func dotGoAddArr(w io.Writer, n string, a []string) { - if len(a) == 0 { - return - } - fmt.Fprintf(w, "\t\t%-13s []string{", n+":") - did := false - for _, b := range a { - if did { - fmt.Fprint(w, ", ") - } - did = true - fmt.Fprintf(w, "%q", b) - } - fmt.Fprintln(w, "},") -} - -func dotGoHeader(w io.Writer, packname string) { - fmt.Fprintln(w, "// Generated automatically. DO NOT HAND-EDIT.") - fmt.Fprintln(w, "") - fmt.Fprintf(w, "package %s\n", packname) - fmt.Fprintln(w, "") -} - -func dotGoTrailer(w io.Writer) { -} - -func dotGoInfo(w io.Writer, t *terminfo.Terminfo, desc string) { - - fmt.Fprintln(w, "") - fmt.Fprintln(w, "func init() {") - fmt.Fprintf(w, "\t// %s\n", desc) - fmt.Fprintln(w, "\tAddTerminfo(&Terminfo{") - dotGoAddStr(w, "Name", t.Name) - dotGoAddArr(w, "Aliases", t.Aliases) - dotGoAddInt(w, "Columns", t.Columns) - dotGoAddInt(w, "Lines", t.Lines) - dotGoAddInt(w, "Colors", t.Colors) - dotGoAddStr(w, "Bell", t.Bell) - dotGoAddStr(w, "Clear", t.Clear) - dotGoAddStr(w, "EnterCA", t.EnterCA) - dotGoAddStr(w, "ExitCA", t.ExitCA) - dotGoAddStr(w, "ShowCursor", t.ShowCursor) - dotGoAddStr(w, "HideCursor", t.HideCursor) - dotGoAddStr(w, "AttrOff", t.AttrOff) - dotGoAddStr(w, "Underline", t.Underline) - dotGoAddStr(w, "Bold", t.Bold) - dotGoAddStr(w, "Dim", t.Dim) - dotGoAddStr(w, "Blink", t.Blink) - dotGoAddStr(w, "Reverse", t.Reverse) - dotGoAddStr(w, "EnterKeypad", t.EnterKeypad) - dotGoAddStr(w, "ExitKeypad", t.ExitKeypad) - dotGoAddStr(w, "SetFg", t.SetFg) - dotGoAddStr(w, "SetBg", t.SetBg) - dotGoAddStr(w, "SetFgBg", t.SetFgBg) - dotGoAddStr(w, "PadChar", t.PadChar) - dotGoAddStr(w, "AltChars", t.AltChars) - dotGoAddStr(w, "EnterAcs", t.EnterAcs) - dotGoAddStr(w, "ExitAcs", t.ExitAcs) - dotGoAddStr(w, "EnableAcs", t.EnableAcs) - dotGoAddStr(w, "SetFgRGB", t.SetFgRGB) - dotGoAddStr(w, "SetBgRGB", t.SetBgRGB) - dotGoAddStr(w, "SetFgBgRGB", t.SetFgBgRGB) - dotGoAddStr(w, "Mouse", t.Mouse) - dotGoAddStr(w, "MouseMode", t.MouseMode) - dotGoAddStr(w, "SetCursor", t.SetCursor) - dotGoAddStr(w, "CursorBack1", t.CursorBack1) - dotGoAddStr(w, "CursorUp1", t.CursorUp1) - dotGoAddStr(w, "KeyUp", t.KeyUp) - dotGoAddStr(w, "KeyDown", t.KeyDown) - dotGoAddStr(w, "KeyRight", t.KeyRight) - dotGoAddStr(w, "KeyLeft", t.KeyLeft) - dotGoAddStr(w, "KeyInsert", t.KeyInsert) - dotGoAddStr(w, "KeyDelete", t.KeyDelete) - dotGoAddStr(w, "KeyBackspace", t.KeyBackspace) - dotGoAddStr(w, "KeyHome", t.KeyHome) - dotGoAddStr(w, "KeyEnd", t.KeyEnd) - dotGoAddStr(w, "KeyPgUp", t.KeyPgUp) - dotGoAddStr(w, "KeyPgDn", t.KeyPgDn) - dotGoAddStr(w, "KeyF1", t.KeyF1) - dotGoAddStr(w, "KeyF2", t.KeyF2) - dotGoAddStr(w, "KeyF3", t.KeyF3) - dotGoAddStr(w, "KeyF4", t.KeyF4) - dotGoAddStr(w, "KeyF5", t.KeyF5) - dotGoAddStr(w, "KeyF6", t.KeyF6) - dotGoAddStr(w, "KeyF7", t.KeyF7) - dotGoAddStr(w, "KeyF8", t.KeyF8) - dotGoAddStr(w, "KeyF9", t.KeyF9) - dotGoAddStr(w, "KeyF10", t.KeyF10) - dotGoAddStr(w, "KeyF11", t.KeyF11) - dotGoAddStr(w, "KeyF12", t.KeyF12) - dotGoAddStr(w, "KeyF13", t.KeyF13) - dotGoAddStr(w, "KeyF14", t.KeyF14) - dotGoAddStr(w, "KeyF15", t.KeyF15) - dotGoAddStr(w, "KeyF16", t.KeyF16) - dotGoAddStr(w, "KeyF17", t.KeyF17) - dotGoAddStr(w, "KeyF18", t.KeyF18) - dotGoAddStr(w, "KeyF19", t.KeyF19) - dotGoAddStr(w, "KeyF20", t.KeyF20) - dotGoAddStr(w, "KeyF21", t.KeyF21) - dotGoAddStr(w, "KeyF22", t.KeyF22) - dotGoAddStr(w, "KeyF23", t.KeyF23) - dotGoAddStr(w, "KeyF24", t.KeyF24) - dotGoAddStr(w, "KeyF25", t.KeyF25) - dotGoAddStr(w, "KeyF26", t.KeyF26) - dotGoAddStr(w, "KeyF27", t.KeyF27) - dotGoAddStr(w, "KeyF28", t.KeyF28) - dotGoAddStr(w, "KeyF29", t.KeyF29) - dotGoAddStr(w, "KeyF30", t.KeyF30) - dotGoAddStr(w, "KeyF31", t.KeyF31) - dotGoAddStr(w, "KeyF32", t.KeyF32) - dotGoAddStr(w, "KeyF33", t.KeyF33) - dotGoAddStr(w, "KeyF34", t.KeyF34) - dotGoAddStr(w, "KeyF35", t.KeyF35) - dotGoAddStr(w, "KeyF36", t.KeyF36) - dotGoAddStr(w, "KeyF37", t.KeyF37) - dotGoAddStr(w, "KeyF38", t.KeyF38) - dotGoAddStr(w, "KeyF39", t.KeyF39) - dotGoAddStr(w, "KeyF40", t.KeyF40) - dotGoAddStr(w, "KeyF41", t.KeyF41) - dotGoAddStr(w, "KeyF42", t.KeyF42) - dotGoAddStr(w, "KeyF43", t.KeyF43) - dotGoAddStr(w, "KeyF44", t.KeyF44) - dotGoAddStr(w, "KeyF45", t.KeyF45) - dotGoAddStr(w, "KeyF46", t.KeyF46) - dotGoAddStr(w, "KeyF47", t.KeyF47) - dotGoAddStr(w, "KeyF48", t.KeyF48) - dotGoAddStr(w, "KeyF49", t.KeyF49) - dotGoAddStr(w, "KeyF50", t.KeyF50) - dotGoAddStr(w, "KeyF51", t.KeyF51) - dotGoAddStr(w, "KeyF52", t.KeyF52) - dotGoAddStr(w, "KeyF53", t.KeyF53) - dotGoAddStr(w, "KeyF54", t.KeyF54) - dotGoAddStr(w, "KeyF55", t.KeyF55) - dotGoAddStr(w, "KeyF56", t.KeyF56) - dotGoAddStr(w, "KeyF57", t.KeyF57) - dotGoAddStr(w, "KeyF58", t.KeyF58) - dotGoAddStr(w, "KeyF59", t.KeyF59) - dotGoAddStr(w, "KeyF60", t.KeyF60) - dotGoAddStr(w, "KeyF61", t.KeyF61) - dotGoAddStr(w, "KeyF62", t.KeyF62) - dotGoAddStr(w, "KeyF63", t.KeyF63) - dotGoAddStr(w, "KeyF64", t.KeyF64) - dotGoAddStr(w, "KeyCancel", t.KeyCancel) - dotGoAddStr(w, "KeyPrint", t.KeyPrint) - dotGoAddStr(w, "KeyExit", t.KeyExit) - dotGoAddStr(w, "KeyHelp", t.KeyHelp) - dotGoAddStr(w, "KeyClear", t.KeyClear) - dotGoAddStr(w, "KeyBacktab", t.KeyBacktab) - dotGoAddStr(w, "KeyShfLeft", t.KeyShfLeft) - dotGoAddStr(w, "KeyShfRight", t.KeyShfRight) - dotGoAddStr(w, "KeyShfUp", t.KeyShfUp) - dotGoAddStr(w, "KeyShfDown", t.KeyShfDown) - dotGoAddStr(w, "KeyCtrlLeft", t.KeyCtrlLeft) - dotGoAddStr(w, "KeyCtrlRight", t.KeyCtrlRight) - dotGoAddStr(w, "KeyCtrlUp", t.KeyCtrlUp) - dotGoAddStr(w, "KeyCtrlDown", t.KeyCtrlDown) - dotGoAddStr(w, "KeyMetaLeft", t.KeyMetaLeft) - dotGoAddStr(w, "KeyMetaRight", t.KeyMetaRight) - dotGoAddStr(w, "KeyMetaUp", t.KeyMetaUp) - dotGoAddStr(w, "KeyMetaDown", t.KeyMetaDown) - dotGoAddStr(w, "KeyAltLeft", t.KeyAltLeft) - dotGoAddStr(w, "KeyAltRight", t.KeyAltRight) - dotGoAddStr(w, "KeyAltUp", t.KeyAltUp) - dotGoAddStr(w, "KeyAltDown", t.KeyAltDown) - dotGoAddStr(w, "KeyAltShfLeft", t.KeyAltShfLeft) - dotGoAddStr(w, "KeyAltShfRight", t.KeyAltShfRight) - dotGoAddStr(w, "KeyAltShfUp", t.KeyAltShfUp) - dotGoAddStr(w, "KeyAltShfDown", t.KeyAltShfDown) - dotGoAddStr(w, "KeyMetaShfLeft", t.KeyMetaShfLeft) - dotGoAddStr(w, "KeyMetaShfRight", t.KeyMetaShfRight) - dotGoAddStr(w, "KeyMetaShfUp", t.KeyMetaShfUp) - dotGoAddStr(w, "KeyMetaShfDown", t.KeyMetaShfDown) - dotGoAddStr(w, "KeyCtrlShfLeft", t.KeyCtrlShfLeft) - dotGoAddStr(w, "KeyCtrlShfRight", t.KeyCtrlShfRight) - dotGoAddStr(w, "KeyCtrlShfUp", t.KeyCtrlShfUp) - dotGoAddStr(w, "KeyCtrlShfDown", t.KeyCtrlShfDown) - dotGoAddStr(w, "KeyShfHome", t.KeyShfHome) - dotGoAddStr(w, "KeyShfEnd", t.KeyShfEnd) - dotGoAddStr(w, "KeyCtrlHome", t.KeyCtrlHome) - dotGoAddStr(w, "KeyCtrlEnd", t.KeyCtrlEnd) - dotGoAddStr(w, "KeyMetaHome", t.KeyMetaHome) - dotGoAddStr(w, "KeyMetaEnd", t.KeyMetaEnd) - dotGoAddStr(w, "KeyAltHome", t.KeyAltHome) - dotGoAddStr(w, "KeyAltEnd", t.KeyAltEnd) - dotGoAddStr(w, "KeyCtrlShfHome", t.KeyCtrlShfHome) - dotGoAddStr(w, "KeyCtrlShfEnd", t.KeyCtrlShfEnd) - dotGoAddStr(w, "KeyMetaShfHome", t.KeyMetaShfHome) - dotGoAddStr(w, "KeyMetaShfEnd", t.KeyMetaShfEnd) - dotGoAddStr(w, "KeyAltShfHome", t.KeyAltShfHome) - dotGoAddStr(w, "KeyAltShfEnd", t.KeyAltShfEnd) - fmt.Fprintln(w, "\t})") - fmt.Fprintln(w, "}") -} - -var packname = "terminfo" - -func dotGoFile(fname string, term *terminfo.Terminfo, desc string, makeDir bool) error { - w := os.Stdout - var e error - if fname != "-" && fname != "" { - if makeDir { - dname := path.Dir(fname) - _ = os.Mkdir(dname, 0777) - } - if w, e = os.Create(fname); e != nil { - return e - } - } - dotGoHeader(w, packname) - dotGoInfo(w, term, desc) - dotGoTrailer(w) - if w != os.Stdout { - w.Close() - } - cmd := exec.Command("go", "fmt", fname) - cmd.Run() - return nil -} - -func dotGzFile(fname string, term *terminfo.Terminfo, makeDir bool) error { - - var w io.WriteCloser = os.Stdout - var e error - if fname != "-" && fname != "" { - if makeDir { - dname := path.Dir(fname) - _ = os.Mkdir(dname, 0777) - } - if w, e = os.Create(fname); e != nil { - return e - } - } - - w = gzip.NewWriter(w) - - js, e := json.Marshal(term) - fmt.Fprintln(w, string(js)) - - if w != os.Stdout { - w.Close() - } - return nil -} - -func jsonFile(fname string, term *terminfo.Terminfo, makeDir bool) error { - w := os.Stdout - var e error - if fname != "-" && fname != "" { - if makeDir { - dname := path.Dir(fname) - _ = os.Mkdir(dname, 0777) - } - if w, e = os.Create(fname); e != nil { - return e - } - } - - js, e := json.Marshal(term) - fmt.Fprintln(w, string(js)) - - if w != os.Stdout { - w.Close() - } - return nil -} - -func dumpDatabase(terms map[string]*terminfo.Terminfo, descs map[string]string) { - - // Load models .text - mfile, e := os.Open("models.txt") - models := make(map[string]bool) - if e != nil { - fmt.Fprintf(os.Stderr, "Failed reading models.txt: %v", e) - } - scanner := bufio.NewScanner(mfile) - for scanner.Scan() { - models[scanner.Text()] = true - } - - for name, t := range terms { - - // If this is one of our builtin models, generate the GO file - if models[name] { - desc := descs[name] - safename := strings.Replace(name, "-", "_", -1) - goname := fmt.Sprintf("term_%s.go", safename) - e = dotGoFile(goname, t, desc, true) - if e != nil { - fmt.Fprintf(os.Stderr, "Failed creating %s: %v", goname, e) - os.Exit(1) - } - continue - } - - hash := fmt.Sprintf("%x", sha1.Sum([]byte(name))) - fname := fmt.Sprintf("%s.gz", hash[0:8]) - fname = path.Join("database", hash[0:2], fname) - e = dotGzFile(fname, t, true) - if e != nil { - fmt.Fprintf(os.Stderr, "Failed creating %s: %v", fname, e) - os.Exit(1) - } - - for _, a := range t.Aliases { - hash = fmt.Sprintf("%x", sha1.Sum([]byte(a))) - fname = path.Join("database", hash[0:2], hash[0:8]) - e = jsonFile(fname, &terminfo.Terminfo{Name: t.Name}, true) - if e != nil { - fmt.Fprintf(os.Stderr, "Failed creating %s: %v", fname, e) - os.Exit(1) - } - } - } -} - -func main() { - gofile := "" - jsonfile := "" - nofatal := false - quiet := false - dogzip := false - all := false - db := false - - flag.StringVar(&gofile, "go", "", "generate go source in named file") - flag.StringVar(&jsonfile, "json", "", "generate json in named file") - flag.StringVar(&packname, "P", packname, "package name (go source)") - flag.BoolVar(&nofatal, "nofatal", false, "errors are not fatal") - flag.BoolVar(&quiet, "quiet", false, "suppress error messages") - flag.BoolVar(&dogzip, "gzip", false, "compress json output") - flag.BoolVar(&all, "all", false, "load all terminals from terminfo") - flag.BoolVar(&db, "db", false, "generate json db file in place") - flag.Parse() - var e error - - args := flag.Args() - if all { - db = true // implied - allterms, e := getallterms() - if e != nil { - fmt.Fprintf(os.Stderr, "Failed: %v", e) - os.Exit(1) - } - args = append(args, allterms...) - } - if len(args) == 0 { - args = []string{os.Getenv("TERM")} - } - - tdata := make(map[string]*terminfo.Terminfo) - descs := make(map[string]string) - - for _, term := range args { - if t, desc, e := getinfo(term); e != nil { - if all && e == notaddressable { - continue - } - if !quiet { - fmt.Fprintf(os.Stderr, - "Failed loading %s: %v\n", term, e) - } - if !nofatal { - os.Exit(1) - } - } else { - tdata[term] = t - descs[term] = desc - } - } - - if len(tdata) == 0 { - // No data. - os.Exit(0) - } - - if db { - dumpDatabase(tdata, descs) - } else if gofile != "" { - for term, t := range tdata { - if t.Name == term { - e = dotGoFile(gofile, t, descs[term], false) - if e != nil { - fmt.Fprintf(os.Stderr, "Failed %s: %v", gofile, e) - os.Exit(1) - } - } - } - - } else { - for _, t := range tdata { - if dogzip { - if e = dotGzFile(jsonfile, t, false); e != nil { - fmt.Fprintf(os.Stderr, "Failed %s: %v", gofile, e) - os.Exit(1) - } - } else { - if e = jsonFile(jsonfile, t, false); e != nil { - fmt.Fprintf(os.Stderr, "Failed %s: %v", gofile, e) - os.Exit(1) - } - } - } - } -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/models.txt b/vendor/github.com/gdamore/tcell/terminfo/models.txt index 718eb9bc..7ed2adb7 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/models.txt +++ b/vendor/github.com/gdamore/tcell/terminfo/models.txt @@ -8,30 +8,20 @@ cygwin d200 d210 dtterm -eterm -gnome -gnome-256color +eterm,eterm-color|emacs +Eterm,Eterm-88color,Eterm-256color|eterm +gnome,gnome-256color hpterm hz1500 -konsole -konsole-256color +konsole,konsole-256color kterm linux pcansi -rxvt -rxvt-256color -rxvt-unicode -rxvt-unicode-256color -screen -screen-256color -st -st-256color -st-truecolor -st-meta -st-meta-256color -st-meta-truecolor -sun -sun-color +rxvt,rxvt-256color,rxvt-88color,rxvt-unicode,rxvt-unicode-256color +screen,screen-256color +st,st-256color|simpleterm +sun,sun-color +termite tvi910 tvi912 tvi921 @@ -47,11 +37,7 @@ vt400 vt420 wy50 wy60 -wy99-ansi -wy99a-ansi +wy99-ansi,wy99a-ansi xfce xnuppc -xterm -xterm -xterm-256color -xterm-truecolor +xterm,xterm-88color,xterm-256color diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_pcansi.go b/vendor/github.com/gdamore/tcell/terminfo/p/pcansi/term.go similarity index 90% rename from vendor/github.com/gdamore/tcell/terminfo/term_pcansi.go rename to vendor/github.com/gdamore/tcell/terminfo/p/pcansi/term.go index 270ee459..84bc400b 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_pcansi.go +++ b/vendor/github.com/gdamore/tcell/terminfo/p/pcansi/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package pcansi + +import "github.com/gdamore/tcell/terminfo" func init() { + // ibm-pc terminal programs claiming to be ansi - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "pcansi", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/r/rxvt/term.go b/vendor/github.com/gdamore/tcell/terminfo/r/rxvt/term.go new file mode 100644 index 00000000..776f750e --- /dev/null +++ b/vendor/github.com/gdamore/tcell/terminfo/r/rxvt/term.go @@ -0,0 +1,466 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package rxvt + +import "github.com/gdamore/tcell/terminfo" + +func init() { + + // rxvt terminal emulator (X Window System) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "rxvt", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyF21: "\x1b[23$", + KeyF22: "\x1b[24$", + KeyF23: "\x1b[11^", + KeyF24: "\x1b[12^", + KeyF25: "\x1b[13^", + KeyF26: "\x1b[14^", + KeyF27: "\x1b[15^", + KeyF28: "\x1b[17^", + KeyF29: "\x1b[18^", + KeyF30: "\x1b[19^", + KeyF31: "\x1b[20^", + KeyF32: "\x1b[21^", + KeyF33: "\x1b[23^", + KeyF34: "\x1b[24^", + KeyF35: "\x1b[25^", + KeyF36: "\x1b[26^", + KeyF37: "\x1b[28^", + KeyF38: "\x1b[29^", + KeyF39: "\x1b[31^", + KeyF40: "\x1b[32^", + KeyF41: "\x1b[33^", + KeyF42: "\x1b[34^", + KeyF43: "\x1b[23@", + KeyF44: "\x1b[24@", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + }) + + // rxvt 2.7.9 with xterm 256-colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "rxvt-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyF21: "\x1b[23$", + KeyF22: "\x1b[24$", + KeyF23: "\x1b[11^", + KeyF24: "\x1b[12^", + KeyF25: "\x1b[13^", + KeyF26: "\x1b[14^", + KeyF27: "\x1b[15^", + KeyF28: "\x1b[17^", + KeyF29: "\x1b[18^", + KeyF30: "\x1b[19^", + KeyF31: "\x1b[20^", + KeyF32: "\x1b[21^", + KeyF33: "\x1b[23^", + KeyF34: "\x1b[24^", + KeyF35: "\x1b[25^", + KeyF36: "\x1b[26^", + KeyF37: "\x1b[28^", + KeyF38: "\x1b[29^", + KeyF39: "\x1b[31^", + KeyF40: "\x1b[32^", + KeyF41: "\x1b[33^", + KeyF42: "\x1b[34^", + KeyF43: "\x1b[23@", + KeyF44: "\x1b[24@", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + }) + + // rxvt 2.7.9 with xterm 88-colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "rxvt-88color", + Columns: 80, + Lines: 24, + Colors: 88, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b7\x1b[?47h", + ExitCA: "\x1b[2J\x1b[?47l\x1b8", + ShowCursor: "\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyF21: "\x1b[23$", + KeyF22: "\x1b[24$", + KeyF23: "\x1b[11^", + KeyF24: "\x1b[12^", + KeyF25: "\x1b[13^", + KeyF26: "\x1b[14^", + KeyF27: "\x1b[15^", + KeyF28: "\x1b[17^", + KeyF29: "\x1b[18^", + KeyF30: "\x1b[19^", + KeyF31: "\x1b[20^", + KeyF32: "\x1b[21^", + KeyF33: "\x1b[23^", + KeyF34: "\x1b[24^", + KeyF35: "\x1b[25^", + KeyF36: "\x1b[26^", + KeyF37: "\x1b[28^", + KeyF38: "\x1b[29^", + KeyF39: "\x1b[31^", + KeyF40: "\x1b[32^", + KeyF41: "\x1b[33^", + KeyF42: "\x1b[34^", + KeyF43: "\x1b[23@", + KeyF44: "\x1b[24@", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + }) + + // rxvt-unicode terminal (X Window System) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "rxvt-unicode", + Columns: 80, + Lines: 24, + Colors: 88, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[r\x1b[?1049l", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x1b(B", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + SetFg: "\x1b[38;5;%p1%dm", + SetBg: "\x1b[48;5;%p1%dm", + SetFgBg: "\x1b[38;5;%p1%d;48;5;%p2%dm", + AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + }) + + // rxvt-unicode terminal with 256 colors (X Window System) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "rxvt-unicode-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[r\x1b[?1049l", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x1b(B", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b=", + ExitKeypad: "\x1b>", + SetFg: "\x1b[38;5;%p1%dm", + SetBg: "\x1b[48;5;%p1%dm", + SetFgBg: "\x1b[38;5;%p1%d;48;5;%p2%dm", + AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[7~", + KeyEnd: "\x1b[8~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1b[11~", + KeyF2: "\x1b[12~", + KeyF3: "\x1b[13~", + KeyF4: "\x1b[14~", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[25~", + KeyF14: "\x1b[26~", + KeyF15: "\x1b[28~", + KeyF16: "\x1b[29~", + KeyF17: "\x1b[31~", + KeyF18: "\x1b[32~", + KeyF19: "\x1b[33~", + KeyF20: "\x1b[34~", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[d", + KeyShfRight: "\x1b[c", + KeyShfUp: "\x1b[a", + KeyShfDown: "\x1b[b", + KeyCtrlLeft: "\x1b[Od", + KeyCtrlRight: "\x1b[Oc", + KeyCtrlUp: "\x1b[Oa", + KeyCtrlDown: "\x1b[Ob", + KeyShfHome: "\x1b[7$", + KeyShfEnd: "\x1b[8$", + KeyCtrlHome: "\x1b[7^", + KeyCtrlEnd: "\x1b[8^", + }) +} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_screen_256color.go b/vendor/github.com/gdamore/tcell/terminfo/s/screen/term.go similarity index 51% rename from vendor/github.com/gdamore/tcell/terminfo/term_screen_256color.go rename to vendor/github.com/gdamore/tcell/terminfo/s/screen/term.go index 40fda226..ab0d8eed 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_screen_256color.go +++ b/vendor/github.com/gdamore/tcell/terminfo/s/screen/term.go @@ -1,10 +1,72 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package screen + +import "github.com/gdamore/tcell/terminfo" func init() { + + // VT 100/ANSI X3.64 virtual terminal + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "screen", + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[34h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + PadChar: "\x00", + AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b(B\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1bM", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyBacktab: "\x1b[Z", + }) + // GNU Screen with 256 colors - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "screen-256color", Columns: 80, Lines: 24, @@ -42,7 +104,7 @@ func init() { KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", + KeyBackspace: "\xff", KeyHome: "\x1b[1~", KeyEnd: "\x1b[4~", KeyPgUp: "\x1b[5~", diff --git a/vendor/github.com/gdamore/tcell/terminfo/s/simpleterm/term.go b/vendor/github.com/gdamore/tcell/terminfo/s/simpleterm/term.go new file mode 100644 index 00000000..ad7c1e81 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/terminfo/s/simpleterm/term.go @@ -0,0 +1,308 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package simpleterm + +import "github.com/gdamore/tcell/terminfo" + +func init() { + + // simpleterm + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "st", + Aliases: []string{"stterm"}, + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAcs: "\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[1;2P", + KeyF14: "\x1b[1;2Q", + KeyF15: "\x1b[1;2R", + KeyF16: "\x1b[1;2S", + KeyF17: "\x1b[15;2~", + KeyF18: "\x1b[17;2~", + KeyF19: "\x1b[18;2~", + KeyF20: "\x1b[19;2~", + KeyF21: "\x1b[20;2~", + KeyF22: "\x1b[21;2~", + KeyF23: "\x1b[23;2~", + KeyF24: "\x1b[24;2~", + KeyF25: "\x1b[1;5P", + KeyF26: "\x1b[1;5Q", + KeyF27: "\x1b[1;5R", + KeyF28: "\x1b[1;5S", + KeyF29: "\x1b[15;5~", + KeyF30: "\x1b[17;5~", + KeyF31: "\x1b[18;5~", + KeyF32: "\x1b[19;5~", + KeyF33: "\x1b[20;5~", + KeyF34: "\x1b[21;5~", + KeyF35: "\x1b[23;5~", + KeyF36: "\x1b[24;5~", + KeyF37: "\x1b[1;6P", + KeyF38: "\x1b[1;6Q", + KeyF39: "\x1b[1;6R", + KeyF40: "\x1b[1;6S", + KeyF41: "\x1b[15;6~", + KeyF42: "\x1b[17;6~", + KeyF43: "\x1b[18;6~", + KeyF44: "\x1b[19;6~", + KeyF45: "\x1b[20;6~", + KeyF46: "\x1b[21;6~", + KeyF47: "\x1b[23;6~", + KeyF48: "\x1b[24;6~", + KeyF49: "\x1b[1;3P", + KeyF50: "\x1b[1;3Q", + KeyF51: "\x1b[1;3R", + KeyF52: "\x1b[1;3S", + KeyF53: "\x1b[15;3~", + KeyF54: "\x1b[17;3~", + KeyF55: "\x1b[18;3~", + KeyF56: "\x1b[19;3~", + KeyF57: "\x1b[20;3~", + KeyF58: "\x1b[21;3~", + KeyF59: "\x1b[23;3~", + KeyF60: "\x1b[24;3~", + KeyF61: "\x1b[1;4P", + KeyF62: "\x1b[1;4Q", + KeyF63: "\x1b[1;4R", + KeyClear: "\x1b[3;5~", + KeyShfLeft: "\x1b[1;2D", + KeyShfRight: "\x1b[1;2C", + KeyShfUp: "\x1b[1;2A", + KeyShfDown: "\x1b[1;2B", + KeyCtrlLeft: "\x1b[1;5D", + KeyCtrlRight: "\x1b[1;5C", + KeyCtrlUp: "\x1b[1;5A", + KeyCtrlDown: "\x1b[1;5B", + KeyMetaLeft: "\x1b[1;9D", + KeyMetaRight: "\x1b[1;9C", + KeyMetaUp: "\x1b[1;9A", + KeyMetaDown: "\x1b[1;9B", + KeyAltLeft: "\x1b[1;3D", + KeyAltRight: "\x1b[1;3C", + KeyAltUp: "\x1b[1;3A", + KeyAltDown: "\x1b[1;3B", + KeyAltShfLeft: "\x1b[1;4D", + KeyAltShfRight: "\x1b[1;4C", + KeyAltShfUp: "\x1b[1;4A", + KeyAltShfDown: "\x1b[1;4B", + KeyMetaShfLeft: "\x1b[1;10D", + KeyMetaShfRight: "\x1b[1;10C", + KeyMetaShfUp: "\x1b[1;10A", + KeyMetaShfDown: "\x1b[1;10B", + KeyCtrlShfLeft: "\x1b[1;6D", + KeyCtrlShfRight: "\x1b[1;6C", + KeyCtrlShfUp: "\x1b[1;6A", + KeyCtrlShfDown: "\x1b[1;6B", + KeyShfHome: "\x1b[1;2H", + KeyShfEnd: "\x1b[1;2F", + KeyCtrlHome: "\x1b[1;5H", + KeyCtrlEnd: "\x1b[1;5F", + KeyAltHome: "\x1b[1;9H", + KeyAltEnd: "\x1b[1;9F", + KeyCtrlShfHome: "\x1b[1;6H", + KeyCtrlShfEnd: "\x1b[1;6F", + KeyMetaShfHome: "\x1b[1;10H", + KeyMetaShfEnd: "\x1b[1;10F", + KeyAltShfHome: "\x1b[1;4H", + KeyAltShfEnd: "\x1b[1;4F", + }) + + // simpleterm with 256 colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "st-256color", + Aliases: []string{"stterm-256color"}, + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h", + ExitCA: "\x1b[?1049l", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[0m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + EnableAcs: "\x1b)0", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1b[1~", + KeyEnd: "\x1b[4~", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[1;2P", + KeyF14: "\x1b[1;2Q", + KeyF15: "\x1b[1;2R", + KeyF16: "\x1b[1;2S", + KeyF17: "\x1b[15;2~", + KeyF18: "\x1b[17;2~", + KeyF19: "\x1b[18;2~", + KeyF20: "\x1b[19;2~", + KeyF21: "\x1b[20;2~", + KeyF22: "\x1b[21;2~", + KeyF23: "\x1b[23;2~", + KeyF24: "\x1b[24;2~", + KeyF25: "\x1b[1;5P", + KeyF26: "\x1b[1;5Q", + KeyF27: "\x1b[1;5R", + KeyF28: "\x1b[1;5S", + KeyF29: "\x1b[15;5~", + KeyF30: "\x1b[17;5~", + KeyF31: "\x1b[18;5~", + KeyF32: "\x1b[19;5~", + KeyF33: "\x1b[20;5~", + KeyF34: "\x1b[21;5~", + KeyF35: "\x1b[23;5~", + KeyF36: "\x1b[24;5~", + KeyF37: "\x1b[1;6P", + KeyF38: "\x1b[1;6Q", + KeyF39: "\x1b[1;6R", + KeyF40: "\x1b[1;6S", + KeyF41: "\x1b[15;6~", + KeyF42: "\x1b[17;6~", + KeyF43: "\x1b[18;6~", + KeyF44: "\x1b[19;6~", + KeyF45: "\x1b[20;6~", + KeyF46: "\x1b[21;6~", + KeyF47: "\x1b[23;6~", + KeyF48: "\x1b[24;6~", + KeyF49: "\x1b[1;3P", + KeyF50: "\x1b[1;3Q", + KeyF51: "\x1b[1;3R", + KeyF52: "\x1b[1;3S", + KeyF53: "\x1b[15;3~", + KeyF54: "\x1b[17;3~", + KeyF55: "\x1b[18;3~", + KeyF56: "\x1b[19;3~", + KeyF57: "\x1b[20;3~", + KeyF58: "\x1b[21;3~", + KeyF59: "\x1b[23;3~", + KeyF60: "\x1b[24;3~", + KeyF61: "\x1b[1;4P", + KeyF62: "\x1b[1;4Q", + KeyF63: "\x1b[1;4R", + KeyClear: "\x1b[3;5~", + KeyShfLeft: "\x1b[1;2D", + KeyShfRight: "\x1b[1;2C", + KeyShfUp: "\x1b[1;2A", + KeyShfDown: "\x1b[1;2B", + KeyCtrlLeft: "\x1b[1;5D", + KeyCtrlRight: "\x1b[1;5C", + KeyCtrlUp: "\x1b[1;5A", + KeyCtrlDown: "\x1b[1;5B", + KeyMetaLeft: "\x1b[1;9D", + KeyMetaRight: "\x1b[1;9C", + KeyMetaUp: "\x1b[1;9A", + KeyMetaDown: "\x1b[1;9B", + KeyAltLeft: "\x1b[1;3D", + KeyAltRight: "\x1b[1;3C", + KeyAltUp: "\x1b[1;3A", + KeyAltDown: "\x1b[1;3B", + KeyAltShfLeft: "\x1b[1;4D", + KeyAltShfRight: "\x1b[1;4C", + KeyAltShfUp: "\x1b[1;4A", + KeyAltShfDown: "\x1b[1;4B", + KeyMetaShfLeft: "\x1b[1;10D", + KeyMetaShfRight: "\x1b[1;10C", + KeyMetaShfUp: "\x1b[1;10A", + KeyMetaShfDown: "\x1b[1;10B", + KeyCtrlShfLeft: "\x1b[1;6D", + KeyCtrlShfRight: "\x1b[1;6C", + KeyCtrlShfUp: "\x1b[1;6A", + KeyCtrlShfDown: "\x1b[1;6B", + KeyShfHome: "\x1b[1;2H", + KeyShfEnd: "\x1b[1;2F", + KeyCtrlHome: "\x1b[1;5H", + KeyCtrlEnd: "\x1b[1;5F", + KeyAltHome: "\x1b[1;9H", + KeyAltEnd: "\x1b[1;9F", + KeyCtrlShfHome: "\x1b[1;6H", + KeyCtrlShfEnd: "\x1b[1;6F", + KeyMetaShfHome: "\x1b[1;10H", + KeyMetaShfEnd: "\x1b[1;10F", + KeyAltShfHome: "\x1b[1;4H", + KeyAltShfEnd: "\x1b[1;4F", + }) +} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_sun_color.go b/vendor/github.com/gdamore/tcell/terminfo/s/sun/term.go similarity index 50% rename from vendor/github.com/gdamore/tcell/terminfo/term_sun_color.go rename to vendor/github.com/gdamore/tcell/terminfo/s/sun/term.go index e4ebe96b..f83cf957 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_sun_color.go +++ b/vendor/github.com/gdamore/tcell/terminfo/s/sun/term.go @@ -1,10 +1,52 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package sun + +import "github.com/gdamore/tcell/terminfo" func init() { + + // Sun Microsystems Inc. workstation console + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "sun", + Aliases: []string{"sun1", "sun2"}, + Columns: 80, + Lines: 34, + Bell: "\a", + Clear: "\f", + AttrOff: "\x1b[m", + Reverse: "\x1b[7m", + PadChar: "\x00", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1b[A", + KeyDown: "\x1b[B", + KeyRight: "\x1b[C", + KeyLeft: "\x1b[D", + KeyInsert: "\x1b[247z", + KeyDelete: "\xff", + KeyBackspace: "\b", + KeyHome: "\x1b[214z", + KeyEnd: "\x1b[220z", + KeyPgUp: "\x1b[216z", + KeyPgDn: "\x1b[222z", + KeyF1: "\x1b[224z", + KeyF2: "\x1b[225z", + KeyF3: "\x1b[226z", + KeyF4: "\x1b[227z", + KeyF5: "\x1b[228z", + KeyF6: "\x1b[229z", + KeyF7: "\x1b[230z", + KeyF8: "\x1b[231z", + KeyF9: "\x1b[232z", + KeyF10: "\x1b[233z", + KeyF11: "\x1b[234z", + KeyF12: "\x1b[235z", + }) + // Sun Microsystems Workstation console with color support (IA systems) - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "sun-color", Columns: 80, Lines: 34, @@ -26,7 +68,7 @@ func init() { KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[247z", - KeyDelete: "\u007f", + KeyDelete: "\xff", KeyBackspace: "\b", KeyHome: "\x1b[214z", KeyEnd: "\x1b[220z", diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_termite.go b/vendor/github.com/gdamore/tcell/terminfo/t/termite/term.go similarity index 97% rename from vendor/github.com/gdamore/tcell/terminfo/term_termite.go rename to vendor/github.com/gdamore/tcell/terminfo/t/termite/term.go index 8e7f683c..62b1c5b8 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_termite.go +++ b/vendor/github.com/gdamore/tcell/terminfo/t/termite/term.go @@ -1,11 +1,14 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package termite + +import "github.com/gdamore/tcell/terminfo" func init() { + // VTE-based terminal - AddTerminfo(&Terminfo{ - Name: "xterm-termite", + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "termite", Columns: 80, Lines: 24, Colors: 256, @@ -18,7 +21,6 @@ func init() { AttrOff: "\x1b(B\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[1m", - Dim: "\x1b[2m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_tvi910.go b/vendor/github.com/gdamore/tcell/terminfo/t/tvi910/term.go similarity index 88% rename from vendor/github.com/gdamore/tcell/terminfo/term_tvi910.go rename to vendor/github.com/gdamore/tcell/terminfo/t/tvi910/term.go index 03b4bf98..1c5f7a31 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_tvi910.go +++ b/vendor/github.com/gdamore/tcell/terminfo/t/tvi910/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package tvi910 + +import "github.com/gdamore/tcell/terminfo" func init() { + // televideo model 910 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi910", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_tvi912.go b/vendor/github.com/gdamore/tcell/terminfo/t/tvi912/term.go similarity index 88% rename from vendor/github.com/gdamore/tcell/terminfo/term_tvi912.go rename to vendor/github.com/gdamore/tcell/terminfo/t/tvi912/term.go index a6eeb8f7..5e52f5ce 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_tvi912.go +++ b/vendor/github.com/gdamore/tcell/terminfo/t/tvi912/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package tvi912 + +import "github.com/gdamore/tcell/terminfo" func init() { + // old televideo 912/914/920 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi912", Aliases: []string{"tvi914", "tvi920"}, Columns: 80, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_tvi921.go b/vendor/github.com/gdamore/tcell/terminfo/t/tvi921/term.go similarity index 87% rename from vendor/github.com/gdamore/tcell/terminfo/term_tvi921.go rename to vendor/github.com/gdamore/tcell/terminfo/t/tvi921/term.go index 10860cfa..1ec02879 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_tvi921.go +++ b/vendor/github.com/gdamore/tcell/terminfo/t/tvi921/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package tvi921 + +import "github.com/gdamore/tcell/terminfo" func init() { + // televideo model 921 with sysline same as page & real vi function - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi921", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_tvi925.go b/vendor/github.com/gdamore/tcell/terminfo/t/tvi925/term.go similarity index 89% rename from vendor/github.com/gdamore/tcell/terminfo/term_tvi925.go rename to vendor/github.com/gdamore/tcell/terminfo/t/tvi925/term.go index d678ac03..2020ccb9 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_tvi925.go +++ b/vendor/github.com/gdamore/tcell/terminfo/t/tvi925/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package tvi925 + +import "github.com/gdamore/tcell/terminfo" func init() { + // televideo 925 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi925", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_tvi950.go b/vendor/github.com/gdamore/tcell/terminfo/t/tvi950/term.go similarity index 90% rename from vendor/github.com/gdamore/tcell/terminfo/term_tvi950.go rename to vendor/github.com/gdamore/tcell/terminfo/t/tvi950/term.go index 49d9e4ba..fc6f2575 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_tvi950.go +++ b/vendor/github.com/gdamore/tcell/terminfo/t/tvi950/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package tvi950 + +import "github.com/gdamore/tcell/terminfo" func init() { + // televideo 950 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi950", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_tvi970.go b/vendor/github.com/gdamore/tcell/terminfo/t/tvi970/term.go similarity index 89% rename from vendor/github.com/gdamore/tcell/terminfo/term_tvi970.go rename to vendor/github.com/gdamore/tcell/terminfo/t/tvi970/term.go index ef9166ee..e6a1dfb1 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_tvi970.go +++ b/vendor/github.com/gdamore/tcell/terminfo/t/tvi970/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package tvi970 + +import "github.com/gdamore/tcell/terminfo" func init() { + // televideo 970 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi970", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_gnome.go b/vendor/github.com/gdamore/tcell/terminfo/term_gnome.go deleted file mode 100644 index d7907f4c..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_gnome.go +++ /dev/null @@ -1,154 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // GNOME Terminal - AddTerminfo(&Terminfo{ - Name: "gnome", - Columns: 80, - Lines: 24, - Colors: 8, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b7\x1b[?47h", - ExitCA: "\x1b[2J\x1b[?47l\x1b8", - ShowCursor: "\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[0m\x0f", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Dim: "\x1b[2m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h\x1b=", - ExitKeypad: "\x1b[?1l\x1b>", - SetFg: "\x1b[3%p1%dm", - SetBg: "\x1b[4%p1%dm", - SetFgBg: "\x1b[3%p1%d;4%p2%dm", - PadChar: "\x00", - AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x0e", - ExitAcs: "\x0f", - EnableAcs: "\x1b)0", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1bOH", - KeyEnd: "\x1bOF", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1bO1;2P", - KeyF14: "\x1bO1;2Q", - KeyF15: "\x1bO1;2R", - KeyF16: "\x1bO1;2S", - KeyF17: "\x1b[15;2~", - KeyF18: "\x1b[17;2~", - KeyF19: "\x1b[18;2~", - KeyF20: "\x1b[19;2~", - KeyF21: "\x1b[20;2~", - KeyF22: "\x1b[21;2~", - KeyF23: "\x1b[23;2~", - KeyF24: "\x1b[24;2~", - KeyF25: "\x1bO1;5P", - KeyF26: "\x1bO1;5Q", - KeyF27: "\x1bO1;5R", - KeyF28: "\x1bO1;5S", - KeyF29: "\x1b[15;5~", - KeyF30: "\x1b[17;5~", - KeyF31: "\x1b[18;5~", - KeyF32: "\x1b[19;5~", - KeyF33: "\x1b[20;5~", - KeyF34: "\x1b[21;5~", - KeyF35: "\x1b[23;5~", - KeyF36: "\x1b[24;5~", - KeyF37: "\x1bO1;6P", - KeyF38: "\x1bO1;6Q", - KeyF39: "\x1bO1;6R", - KeyF40: "\x1bO1;6S", - KeyF41: "\x1b[15;6~", - KeyF42: "\x1b[17;6~", - KeyF43: "\x1b[18;6~", - KeyF44: "\x1b[19;6~", - KeyF45: "\x1b[20;6~", - KeyF46: "\x1b[21;6~", - KeyF47: "\x1b[23;6~", - KeyF48: "\x1b[24;6~", - KeyF49: "\x1bO1;3P", - KeyF50: "\x1bO1;3Q", - KeyF51: "\x1bO1;3R", - KeyF52: "\x1bO1;3S", - KeyF53: "\x1b[15;3~", - KeyF54: "\x1b[17;3~", - KeyF55: "\x1b[18;3~", - KeyF56: "\x1b[19;3~", - KeyF57: "\x1b[20;3~", - KeyF58: "\x1b[21;3~", - KeyF59: "\x1b[23;3~", - KeyF60: "\x1b[24;3~", - KeyF61: "\x1bO1;4P", - KeyF62: "\x1bO1;4Q", - KeyF63: "\x1bO1;4R", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[1;2D", - KeyShfRight: "\x1b[1;2C", - KeyShfUp: "\x1b[1;2A", - KeyShfDown: "\x1b[1;2B", - KeyCtrlLeft: "\x1b[1;5D", - KeyCtrlRight: "\x1b[1;5C", - KeyCtrlUp: "\x1b[1;5A", - KeyCtrlDown: "\x1b[1;5B", - KeyMetaLeft: "\x1b[1;9D", - KeyMetaRight: "\x1b[1;9C", - KeyMetaUp: "\x1b[1;9A", - KeyMetaDown: "\x1b[1;9B", - KeyAltLeft: "\x1b[1;3D", - KeyAltRight: "\x1b[1;3C", - KeyAltUp: "\x1b[1;3A", - KeyAltDown: "\x1b[1;3B", - KeyAltShfLeft: "\x1b[1;4D", - KeyAltShfRight: "\x1b[1;4C", - KeyAltShfUp: "\x1b[1;4A", - KeyAltShfDown: "\x1b[1;4B", - KeyMetaShfLeft: "\x1b[1;10D", - KeyMetaShfRight: "\x1b[1;10C", - KeyMetaShfUp: "\x1b[1;10A", - KeyMetaShfDown: "\x1b[1;10B", - KeyCtrlShfLeft: "\x1b[1;6D", - KeyCtrlShfRight: "\x1b[1;6C", - KeyCtrlShfUp: "\x1b[1;6A", - KeyCtrlShfDown: "\x1b[1;6B", - KeyShfHome: "\x1b[1;2H", - KeyShfEnd: "\x1b[1;2F", - KeyCtrlHome: "\x1b[1;5H", - KeyCtrlEnd: "\x1b[1;5F", - KeyAltHome: "\x1b[1;9H", - KeyAltEnd: "\x1b[1;9F", - KeyCtrlShfHome: "\x1b[1;6H", - KeyCtrlShfEnd: "\x1b[1;6F", - KeyMetaShfHome: "\x1b[1;10H", - KeyMetaShfEnd: "\x1b[1;10F", - KeyAltShfHome: "\x1b[1;4H", - KeyAltShfEnd: "\x1b[1;4F", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_konsole.go b/vendor/github.com/gdamore/tcell/terminfo/term_konsole.go deleted file mode 100644 index 5c4e4ec4..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_konsole.go +++ /dev/null @@ -1,112 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // KDE console window - AddTerminfo(&Terminfo{ - Name: "konsole", - Columns: 80, - Lines: 24, - Colors: 8, - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b7\x1b[?47h", - ExitCA: "\x1b[2J\x1b[?47l\x1b8", - ShowCursor: "\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[0m\x0f", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h\x1b=", - ExitKeypad: "\x1b[?1l\x1b>", - SetFg: "\x1b[3%p1%dm", - SetBg: "\x1b[4%p1%dm", - SetFgBg: "\x1b[3%p1%d;4%p2%dm", - AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x0e", - ExitAcs: "\x0f", - EnableAcs: "\x1b)0", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1bOH", - KeyEnd: "\x1bOF", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1bO2P", - KeyF14: "\x1bO2Q", - KeyF15: "\x1bO2R", - KeyF16: "\x1bO2S", - KeyF17: "\x1b[15;2~", - KeyF18: "\x1b[17;2~", - KeyF19: "\x1b[18;2~", - KeyF20: "\x1b[19;2~", - KeyF21: "\x1b[20;2~", - KeyF22: "\x1b[21;2~", - KeyF23: "\x1b[23;2~", - KeyF24: "\x1b[24;2~", - KeyF25: "\x1bO5P", - KeyF26: "\x1bO5Q", - KeyF27: "\x1bO5R", - KeyF28: "\x1bO5S", - KeyF29: "\x1b[15;5~", - KeyF30: "\x1b[17;5~", - KeyF31: "\x1b[18;5~", - KeyF32: "\x1b[19;5~", - KeyF33: "\x1b[20;5~", - KeyF34: "\x1b[21;5~", - KeyF35: "\x1b[23;5~", - KeyF36: "\x1b[24;5~", - KeyF37: "\x1bO6P", - KeyF38: "\x1bO6Q", - KeyF39: "\x1bO6R", - KeyF40: "\x1bO6S", - KeyF41: "\x1b[15;6~", - KeyF42: "\x1b[17;6~", - KeyF43: "\x1b[18;6~", - KeyF44: "\x1b[19;6~", - KeyF45: "\x1b[20;6~", - KeyF46: "\x1b[21;6~", - KeyF47: "\x1b[23;6~", - KeyF48: "\x1b[24;6~", - KeyF49: "\x1bO3P", - KeyF50: "\x1bO3Q", - KeyF51: "\x1bO3R", - KeyF52: "\x1bO3S", - KeyF53: "\x1b[15;3~", - KeyF54: "\x1b[17;3~", - KeyF55: "\x1b[18;3~", - KeyF56: "\x1b[19;3~", - KeyF57: "\x1b[20;3~", - KeyF58: "\x1b[21;3~", - KeyF59: "\x1b[23;3~", - KeyF60: "\x1b[24;3~", - KeyF61: "\x1bO4P", - KeyF62: "\x1bO4Q", - KeyF63: "\x1bO4R", - KeyBacktab: "\x1b[Z", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_konsole_256color.go b/vendor/github.com/gdamore/tcell/terminfo/term_konsole_256color.go deleted file mode 100644 index cbe0314d..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_konsole_256color.go +++ /dev/null @@ -1,112 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // KDE console window with xterm 256-colors - AddTerminfo(&Terminfo{ - Name: "konsole-256color", - Columns: 80, - Lines: 24, - Colors: 256, - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b7\x1b[?47h", - ExitCA: "\x1b[2J\x1b[?47l\x1b8", - ShowCursor: "\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[0m\x0f", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h\x1b=", - ExitKeypad: "\x1b[?1l\x1b>", - SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", - AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x0e", - ExitAcs: "\x0f", - EnableAcs: "\x1b)0", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1bOH", - KeyEnd: "\x1bOF", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1bO2P", - KeyF14: "\x1bO2Q", - KeyF15: "\x1bO2R", - KeyF16: "\x1bO2S", - KeyF17: "\x1b[15;2~", - KeyF18: "\x1b[17;2~", - KeyF19: "\x1b[18;2~", - KeyF20: "\x1b[19;2~", - KeyF21: "\x1b[20;2~", - KeyF22: "\x1b[21;2~", - KeyF23: "\x1b[23;2~", - KeyF24: "\x1b[24;2~", - KeyF25: "\x1bO5P", - KeyF26: "\x1bO5Q", - KeyF27: "\x1bO5R", - KeyF28: "\x1bO5S", - KeyF29: "\x1b[15;5~", - KeyF30: "\x1b[17;5~", - KeyF31: "\x1b[18;5~", - KeyF32: "\x1b[19;5~", - KeyF33: "\x1b[20;5~", - KeyF34: "\x1b[21;5~", - KeyF35: "\x1b[23;5~", - KeyF36: "\x1b[24;5~", - KeyF37: "\x1bO6P", - KeyF38: "\x1bO6Q", - KeyF39: "\x1bO6R", - KeyF40: "\x1bO6S", - KeyF41: "\x1b[15;6~", - KeyF42: "\x1b[17;6~", - KeyF43: "\x1b[18;6~", - KeyF44: "\x1b[19;6~", - KeyF45: "\x1b[20;6~", - KeyF46: "\x1b[21;6~", - KeyF47: "\x1b[23;6~", - KeyF48: "\x1b[24;6~", - KeyF49: "\x1bO3P", - KeyF50: "\x1bO3Q", - KeyF51: "\x1bO3R", - KeyF52: "\x1bO3S", - KeyF53: "\x1b[15;3~", - KeyF54: "\x1b[17;3~", - KeyF55: "\x1b[18;3~", - KeyF56: "\x1b[19;3~", - KeyF57: "\x1b[20;3~", - KeyF58: "\x1b[21;3~", - KeyF59: "\x1b[23;3~", - KeyF60: "\x1b[24;3~", - KeyF61: "\x1bO4P", - KeyF62: "\x1bO4Q", - KeyF63: "\x1bO4R", - KeyBacktab: "\x1b[Z", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_rxvt.go b/vendor/github.com/gdamore/tcell/terminfo/term_rxvt.go deleted file mode 100644 index 9ce8e805..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_rxvt.go +++ /dev/null @@ -1,107 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // rxvt terminal emulator (X Window System) - AddTerminfo(&Terminfo{ - Name: "rxvt", - Columns: 80, - Lines: 24, - Colors: 8, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b7\x1b[?47h", - ExitCA: "\x1b[2J\x1b[?47l\x1b8", - ShowCursor: "\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[m\x0f", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b=", - ExitKeypad: "\x1b>", - SetFg: "\x1b[3%p1%dm", - SetBg: "\x1b[4%p1%dm", - SetFgBg: "\x1b[3%p1%d;4%p2%dm", - PadChar: "\x00", - AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x0e", - ExitAcs: "\x0f", - EnableAcs: "\x1b(B\x1b)0", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1b[A", - KeyDown: "\x1b[B", - KeyRight: "\x1b[C", - KeyLeft: "\x1b[D", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1b[7~", - KeyEnd: "\x1b[8~", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1b[11~", - KeyF2: "\x1b[12~", - KeyF3: "\x1b[13~", - KeyF4: "\x1b[14~", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1b[25~", - KeyF14: "\x1b[26~", - KeyF15: "\x1b[28~", - KeyF16: "\x1b[29~", - KeyF17: "\x1b[31~", - KeyF18: "\x1b[32~", - KeyF19: "\x1b[33~", - KeyF20: "\x1b[34~", - KeyF21: "\x1b[23$", - KeyF22: "\x1b[24$", - KeyF23: "\x1b[11^", - KeyF24: "\x1b[12^", - KeyF25: "\x1b[13^", - KeyF26: "\x1b[14^", - KeyF27: "\x1b[15^", - KeyF28: "\x1b[17^", - KeyF29: "\x1b[18^", - KeyF30: "\x1b[19^", - KeyF31: "\x1b[20^", - KeyF32: "\x1b[21^", - KeyF33: "\x1b[23^", - KeyF34: "\x1b[24^", - KeyF35: "\x1b[25^", - KeyF36: "\x1b[26^", - KeyF37: "\x1b[28^", - KeyF38: "\x1b[29^", - KeyF39: "\x1b[31^", - KeyF40: "\x1b[32^", - KeyF41: "\x1b[33^", - KeyF42: "\x1b[34^", - KeyF43: "\x1b[23@", - KeyF44: "\x1b[24@", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[d", - KeyShfRight: "\x1b[c", - KeyShfUp: "\x1b[a", - KeyShfDown: "\x1b[b", - KeyCtrlLeft: "\x1b[Od", - KeyCtrlRight: "\x1b[Oc", - KeyCtrlUp: "\x1b[Oa", - KeyCtrlDown: "\x1b[Ob", - KeyShfHome: "\x1b[7$", - KeyShfEnd: "\x1b[8$", - KeyCtrlHome: "\x1b[7^", - KeyCtrlEnd: "\x1b[8^", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_rxvt_256color.go b/vendor/github.com/gdamore/tcell/terminfo/term_rxvt_256color.go deleted file mode 100644 index d2cd3108..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_rxvt_256color.go +++ /dev/null @@ -1,107 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // rxvt 2.7.9 with xterm 256-colors - AddTerminfo(&Terminfo{ - Name: "rxvt-256color", - Columns: 80, - Lines: 24, - Colors: 256, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b7\x1b[?47h", - ExitCA: "\x1b[2J\x1b[?47l\x1b8", - ShowCursor: "\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[m\x0f", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b=", - ExitKeypad: "\x1b>", - SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", - PadChar: "\x00", - AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x0e", - ExitAcs: "\x0f", - EnableAcs: "\x1b(B\x1b)0", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1b[A", - KeyDown: "\x1b[B", - KeyRight: "\x1b[C", - KeyLeft: "\x1b[D", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1b[7~", - KeyEnd: "\x1b[8~", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1b[11~", - KeyF2: "\x1b[12~", - KeyF3: "\x1b[13~", - KeyF4: "\x1b[14~", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1b[25~", - KeyF14: "\x1b[26~", - KeyF15: "\x1b[28~", - KeyF16: "\x1b[29~", - KeyF17: "\x1b[31~", - KeyF18: "\x1b[32~", - KeyF19: "\x1b[33~", - KeyF20: "\x1b[34~", - KeyF21: "\x1b[23$", - KeyF22: "\x1b[24$", - KeyF23: "\x1b[11^", - KeyF24: "\x1b[12^", - KeyF25: "\x1b[13^", - KeyF26: "\x1b[14^", - KeyF27: "\x1b[15^", - KeyF28: "\x1b[17^", - KeyF29: "\x1b[18^", - KeyF30: "\x1b[19^", - KeyF31: "\x1b[20^", - KeyF32: "\x1b[21^", - KeyF33: "\x1b[23^", - KeyF34: "\x1b[24^", - KeyF35: "\x1b[25^", - KeyF36: "\x1b[26^", - KeyF37: "\x1b[28^", - KeyF38: "\x1b[29^", - KeyF39: "\x1b[31^", - KeyF40: "\x1b[32^", - KeyF41: "\x1b[33^", - KeyF42: "\x1b[34^", - KeyF43: "\x1b[23@", - KeyF44: "\x1b[24@", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[d", - KeyShfRight: "\x1b[c", - KeyShfUp: "\x1b[a", - KeyShfDown: "\x1b[b", - KeyCtrlLeft: "\x1b[Od", - KeyCtrlRight: "\x1b[Oc", - KeyCtrlUp: "\x1b[Oa", - KeyCtrlDown: "\x1b[Ob", - KeyShfHome: "\x1b[7$", - KeyShfEnd: "\x1b[8$", - KeyCtrlHome: "\x1b[7^", - KeyCtrlEnd: "\x1b[8^", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_rxvt_unicode.go b/vendor/github.com/gdamore/tcell/terminfo/term_rxvt_unicode.go deleted file mode 100644 index 3aebf6b5..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_rxvt_unicode.go +++ /dev/null @@ -1,81 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // rxvt-unicode terminal (X Window System) - AddTerminfo(&Terminfo{ - Name: "rxvt-unicode", - Columns: 80, - Lines: 24, - Colors: 88, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b[?1049h", - ExitCA: "\x1b[r\x1b[?1049l", - ShowCursor: "\x1b[?12l\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[m\x1b(B", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b=", - ExitKeypad: "\x1b>", - SetFg: "\x1b[38;5;%p1%dm", - SetBg: "\x1b[48;5;%p1%dm", - SetFgBg: "\x1b[38;5;%p1%d;48;5;%p2%dm", - AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x1b(0", - ExitAcs: "\x1b(B", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1b[A", - KeyDown: "\x1b[B", - KeyRight: "\x1b[C", - KeyLeft: "\x1b[D", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1b[7~", - KeyEnd: "\x1b[8~", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1b[11~", - KeyF2: "\x1b[12~", - KeyF3: "\x1b[13~", - KeyF4: "\x1b[14~", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1b[25~", - KeyF14: "\x1b[26~", - KeyF15: "\x1b[28~", - KeyF16: "\x1b[29~", - KeyF17: "\x1b[31~", - KeyF18: "\x1b[32~", - KeyF19: "\x1b[33~", - KeyF20: "\x1b[34~", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[d", - KeyShfRight: "\x1b[c", - KeyShfUp: "\x1b[a", - KeyShfDown: "\x1b[b", - KeyCtrlLeft: "\x1b[Od", - KeyCtrlRight: "\x1b[Oc", - KeyCtrlUp: "\x1b[Oa", - KeyCtrlDown: "\x1b[Ob", - KeyShfHome: "\x1b[7$", - KeyShfEnd: "\x1b[8$", - KeyCtrlHome: "\x1b[7^", - KeyCtrlEnd: "\x1b[8^", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_rxvt_unicode_256color.go b/vendor/github.com/gdamore/tcell/terminfo/term_rxvt_unicode_256color.go deleted file mode 100644 index 276f5808..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_rxvt_unicode_256color.go +++ /dev/null @@ -1,81 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // rxvt-unicode terminal with 256 colors (X Window System) - AddTerminfo(&Terminfo{ - Name: "rxvt-unicode-256color", - Columns: 80, - Lines: 24, - Colors: 256, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b[?1049h", - ExitCA: "\x1b[r\x1b[?1049l", - ShowCursor: "\x1b[?12l\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[m\x1b(B", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b=", - ExitKeypad: "\x1b>", - SetFg: "\x1b[38;5;%p1%dm", - SetBg: "\x1b[48;5;%p1%dm", - SetFgBg: "\x1b[38;5;%p1%d;48;5;%p2%dm", - AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x1b(0", - ExitAcs: "\x1b(B", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1b[A", - KeyDown: "\x1b[B", - KeyRight: "\x1b[C", - KeyLeft: "\x1b[D", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1b[7~", - KeyEnd: "\x1b[8~", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1b[11~", - KeyF2: "\x1b[12~", - KeyF3: "\x1b[13~", - KeyF4: "\x1b[14~", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1b[25~", - KeyF14: "\x1b[26~", - KeyF15: "\x1b[28~", - KeyF16: "\x1b[29~", - KeyF17: "\x1b[31~", - KeyF18: "\x1b[32~", - KeyF19: "\x1b[33~", - KeyF20: "\x1b[34~", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[d", - KeyShfRight: "\x1b[c", - KeyShfUp: "\x1b[a", - KeyShfDown: "\x1b[b", - KeyCtrlLeft: "\x1b[Od", - KeyCtrlRight: "\x1b[Oc", - KeyCtrlUp: "\x1b[Oa", - KeyCtrlDown: "\x1b[Ob", - KeyShfHome: "\x1b[7$", - KeyShfEnd: "\x1b[8$", - KeyCtrlHome: "\x1b[7^", - KeyCtrlEnd: "\x1b[8^", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_screen.go b/vendor/github.com/gdamore/tcell/terminfo/term_screen.go deleted file mode 100644 index d9dca02b..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_screen.go +++ /dev/null @@ -1,64 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // VT 100/ANSI X3.64 virtual terminal - AddTerminfo(&Terminfo{ - Name: "screen", - Columns: 80, - Lines: 24, - Colors: 8, - Bell: "\a", - Clear: "\x1b[H\x1b[J", - EnterCA: "\x1b[?1049h", - ExitCA: "\x1b[?1049l", - ShowCursor: "\x1b[34h\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[m\x0f", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Dim: "\x1b[2m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h\x1b=", - ExitKeypad: "\x1b[?1l\x1b>", - SetFg: "\x1b[3%p1%dm", - SetBg: "\x1b[4%p1%dm", - SetFgBg: "\x1b[3%p1%d;4%p2%dm", - PadChar: "\x00", - AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x0e", - ExitAcs: "\x0f", - EnableAcs: "\x1b(B\x1b)0", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1bM", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1b[1~", - KeyEnd: "\x1b[4~", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyBacktab: "\x1b[Z", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_st.go b/vendor/github.com/gdamore/tcell/terminfo/term_st.go deleted file mode 100644 index 272af39c..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_st.go +++ /dev/null @@ -1,156 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // simpleterm 0.4.1 - AddTerminfo(&Terminfo{ - Name: "st", - Aliases: []string{"stterm"}, - Columns: 80, - Lines: 24, - Colors: 8, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b[?1049h", - ExitCA: "\x1b[?1049l", - ShowCursor: "\x1b[?12l\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[0m", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h\x1b=", - ExitKeypad: "\x1b[?1l\x1b>", - SetFg: "\x1b[3%p1%dm", - SetBg: "\x1b[4%p1%dm", - SetFgBg: "\x1b[3%p1%d;4%p2%dm", - PadChar: "\x00", - AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x1b(0", - ExitAcs: "\x1b(B", - EnableAcs: "\x1b)0", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1b[1~", - KeyEnd: "\x1b[4~", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1b[1;2P", - KeyF14: "\x1b[1;2Q", - KeyF15: "\x1b[1;2R", - KeyF16: "\x1b[1;2S", - KeyF17: "\x1b[15;2~", - KeyF18: "\x1b[17;2~", - KeyF19: "\x1b[18;2~", - KeyF20: "\x1b[19;2~", - KeyF21: "\x1b[20;2~", - KeyF22: "\x1b[21;2~", - KeyF23: "\x1b[23;2~", - KeyF24: "\x1b[24;2~", - KeyF25: "\x1b[1;5P", - KeyF26: "\x1b[1;5Q", - KeyF27: "\x1b[1;5R", - KeyF28: "\x1b[1;5S", - KeyF29: "\x1b[15;5~", - KeyF30: "\x1b[17;5~", - KeyF31: "\x1b[18;5~", - KeyF32: "\x1b[19;5~", - KeyF33: "\x1b[20;5~", - KeyF34: "\x1b[21;5~", - KeyF35: "\x1b[23;5~", - KeyF36: "\x1b[24;5~", - KeyF37: "\x1b[1;6P", - KeyF38: "\x1b[1;6Q", - KeyF39: "\x1b[1;6R", - KeyF40: "\x1b[1;6S", - KeyF41: "\x1b[15;6~", - KeyF42: "\x1b[17;6~", - KeyF43: "\x1b[18;6~", - KeyF44: "\x1b[19;6~", - KeyF45: "\x1b[20;6~", - KeyF46: "\x1b[21;6~", - KeyF47: "\x1b[23;6~", - KeyF48: "\x1b[24;6~", - KeyF49: "\x1b[1;3P", - KeyF50: "\x1b[1;3Q", - KeyF51: "\x1b[1;3R", - KeyF52: "\x1b[1;3S", - KeyF53: "\x1b[15;3~", - KeyF54: "\x1b[17;3~", - KeyF55: "\x1b[18;3~", - KeyF56: "\x1b[19;3~", - KeyF57: "\x1b[20;3~", - KeyF58: "\x1b[21;3~", - KeyF59: "\x1b[23;3~", - KeyF60: "\x1b[24;3~", - KeyF61: "\x1b[1;4P", - KeyF62: "\x1b[1;4Q", - KeyF63: "\x1b[1;4R", - KeyClear: "\x1b[3;5~", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[1;2D", - KeyShfRight: "\x1b[1;2C", - KeyShfUp: "\x1b[1;2A", - KeyShfDown: "\x1b[1;2B", - KeyCtrlLeft: "\x1b[1;5D", - KeyCtrlRight: "\x1b[1;5C", - KeyCtrlUp: "\x1b[1;5A", - KeyCtrlDown: "\x1b[1;5B", - KeyMetaLeft: "\x1b[1;9D", - KeyMetaRight: "\x1b[1;9C", - KeyMetaUp: "\x1b[1;9A", - KeyMetaDown: "\x1b[1;9B", - KeyAltLeft: "\x1b[1;3D", - KeyAltRight: "\x1b[1;3C", - KeyAltUp: "\x1b[1;3A", - KeyAltDown: "\x1b[1;3B", - KeyAltShfLeft: "\x1b[1;4D", - KeyAltShfRight: "\x1b[1;4C", - KeyAltShfUp: "\x1b[1;4A", - KeyAltShfDown: "\x1b[1;4B", - KeyMetaShfLeft: "\x1b[1;10D", - KeyMetaShfRight: "\x1b[1;10C", - KeyMetaShfUp: "\x1b[1;10A", - KeyMetaShfDown: "\x1b[1;10B", - KeyCtrlShfLeft: "\x1b[1;6D", - KeyCtrlShfRight: "\x1b[1;6C", - KeyCtrlShfUp: "\x1b[1;6A", - KeyCtrlShfDown: "\x1b[1;6B", - KeyShfHome: "\x1b[1;2H", - KeyShfEnd: "\x1b[1;2F", - KeyCtrlHome: "\x1b[1;5H", - KeyCtrlEnd: "\x1b[1;5F", - KeyAltHome: "\x1b[1;9H", - KeyAltEnd: "\x1b[1;9F", - KeyCtrlShfHome: "\x1b[1;6H", - KeyCtrlShfEnd: "\x1b[1;6F", - KeyMetaShfHome: "\x1b[1;10H", - KeyMetaShfEnd: "\x1b[1;10F", - KeyAltShfHome: "\x1b[1;4H", - KeyAltShfEnd: "\x1b[1;4F", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_st_256color.go b/vendor/github.com/gdamore/tcell/terminfo/term_st_256color.go deleted file mode 100644 index 9b4256f3..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_st_256color.go +++ /dev/null @@ -1,156 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // simpleterm with 256 colors - AddTerminfo(&Terminfo{ - Name: "st-256color", - Aliases: []string{"stterm-256color"}, - Columns: 80, - Lines: 24, - Colors: 256, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b[?1049h", - ExitCA: "\x1b[?1049l", - ShowCursor: "\x1b[?12l\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[0m", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h\x1b=", - ExitKeypad: "\x1b[?1l\x1b>", - SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", - PadChar: "\x00", - AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x1b(0", - ExitAcs: "\x1b(B", - EnableAcs: "\x1b)0", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1b[1~", - KeyEnd: "\x1b[4~", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1b[1;2P", - KeyF14: "\x1b[1;2Q", - KeyF15: "\x1b[1;2R", - KeyF16: "\x1b[1;2S", - KeyF17: "\x1b[15;2~", - KeyF18: "\x1b[17;2~", - KeyF19: "\x1b[18;2~", - KeyF20: "\x1b[19;2~", - KeyF21: "\x1b[20;2~", - KeyF22: "\x1b[21;2~", - KeyF23: "\x1b[23;2~", - KeyF24: "\x1b[24;2~", - KeyF25: "\x1b[1;5P", - KeyF26: "\x1b[1;5Q", - KeyF27: "\x1b[1;5R", - KeyF28: "\x1b[1;5S", - KeyF29: "\x1b[15;5~", - KeyF30: "\x1b[17;5~", - KeyF31: "\x1b[18;5~", - KeyF32: "\x1b[19;5~", - KeyF33: "\x1b[20;5~", - KeyF34: "\x1b[21;5~", - KeyF35: "\x1b[23;5~", - KeyF36: "\x1b[24;5~", - KeyF37: "\x1b[1;6P", - KeyF38: "\x1b[1;6Q", - KeyF39: "\x1b[1;6R", - KeyF40: "\x1b[1;6S", - KeyF41: "\x1b[15;6~", - KeyF42: "\x1b[17;6~", - KeyF43: "\x1b[18;6~", - KeyF44: "\x1b[19;6~", - KeyF45: "\x1b[20;6~", - KeyF46: "\x1b[21;6~", - KeyF47: "\x1b[23;6~", - KeyF48: "\x1b[24;6~", - KeyF49: "\x1b[1;3P", - KeyF50: "\x1b[1;3Q", - KeyF51: "\x1b[1;3R", - KeyF52: "\x1b[1;3S", - KeyF53: "\x1b[15;3~", - KeyF54: "\x1b[17;3~", - KeyF55: "\x1b[18;3~", - KeyF56: "\x1b[19;3~", - KeyF57: "\x1b[20;3~", - KeyF58: "\x1b[21;3~", - KeyF59: "\x1b[23;3~", - KeyF60: "\x1b[24;3~", - KeyF61: "\x1b[1;4P", - KeyF62: "\x1b[1;4Q", - KeyF63: "\x1b[1;4R", - KeyClear: "\x1b[3;5~", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[1;2D", - KeyShfRight: "\x1b[1;2C", - KeyShfUp: "\x1b[1;2A", - KeyShfDown: "\x1b[1;2B", - KeyCtrlLeft: "\x1b[1;5D", - KeyCtrlRight: "\x1b[1;5C", - KeyCtrlUp: "\x1b[1;5A", - KeyCtrlDown: "\x1b[1;5B", - KeyMetaLeft: "\x1b[1;9D", - KeyMetaRight: "\x1b[1;9C", - KeyMetaUp: "\x1b[1;9A", - KeyMetaDown: "\x1b[1;9B", - KeyAltLeft: "\x1b[1;3D", - KeyAltRight: "\x1b[1;3C", - KeyAltUp: "\x1b[1;3A", - KeyAltDown: "\x1b[1;3B", - KeyAltShfLeft: "\x1b[1;4D", - KeyAltShfRight: "\x1b[1;4C", - KeyAltShfUp: "\x1b[1;4A", - KeyAltShfDown: "\x1b[1;4B", - KeyMetaShfLeft: "\x1b[1;10D", - KeyMetaShfRight: "\x1b[1;10C", - KeyMetaShfUp: "\x1b[1;10A", - KeyMetaShfDown: "\x1b[1;10B", - KeyCtrlShfLeft: "\x1b[1;6D", - KeyCtrlShfRight: "\x1b[1;6C", - KeyCtrlShfUp: "\x1b[1;6A", - KeyCtrlShfDown: "\x1b[1;6B", - KeyShfHome: "\x1b[1;2H", - KeyShfEnd: "\x1b[1;2F", - KeyCtrlHome: "\x1b[1;5H", - KeyCtrlEnd: "\x1b[1;5F", - KeyAltHome: "\x1b[1;9H", - KeyAltEnd: "\x1b[1;9F", - KeyCtrlShfHome: "\x1b[1;6H", - KeyCtrlShfEnd: "\x1b[1;6F", - KeyMetaShfHome: "\x1b[1;10H", - KeyMetaShfEnd: "\x1b[1;10F", - KeyAltShfHome: "\x1b[1;4H", - KeyAltShfEnd: "\x1b[1;4F", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_st_meta.go b/vendor/github.com/gdamore/tcell/terminfo/term_st_meta.go deleted file mode 100644 index 1fd5f144..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_st_meta.go +++ /dev/null @@ -1,155 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // simpleterm with meta key - AddTerminfo(&Terminfo{ - Name: "st-meta", - Columns: 80, - Lines: 24, - Colors: 8, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b[?1049h", - ExitCA: "\x1b[?1049l", - ShowCursor: "\x1b[?12l\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[0m", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Dim: "\x1b[2m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h\x1b=", - ExitKeypad: "\x1b[?1l\x1b>", - SetFg: "\x1b[3%p1%dm", - SetBg: "\x1b[4%p1%dm", - SetFgBg: "\x1b[3%p1%d;4%p2%dm", - AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x1b(0", - ExitAcs: "\x1b(B", - EnableAcs: "\x1b)0", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1b[1~", - KeyEnd: "\x1b[4~", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1b[1;2P", - KeyF14: "\x1b[1;2Q", - KeyF15: "\x1b[1;2R", - KeyF16: "\x1b[1;2S", - KeyF17: "\x1b[15;2~", - KeyF18: "\x1b[17;2~", - KeyF19: "\x1b[18;2~", - KeyF20: "\x1b[19;2~", - KeyF21: "\x1b[20;2~", - KeyF22: "\x1b[21;2~", - KeyF23: "\x1b[23;2~", - KeyF24: "\x1b[24;2~", - KeyF25: "\x1b[1;5P", - KeyF26: "\x1b[1;5Q", - KeyF27: "\x1b[1;5R", - KeyF28: "\x1b[1;5S", - KeyF29: "\x1b[15;5~", - KeyF30: "\x1b[17;5~", - KeyF31: "\x1b[18;5~", - KeyF32: "\x1b[19;5~", - KeyF33: "\x1b[20;5~", - KeyF34: "\x1b[21;5~", - KeyF35: "\x1b[23;5~", - KeyF36: "\x1b[24;5~", - KeyF37: "\x1b[1;6P", - KeyF38: "\x1b[1;6Q", - KeyF39: "\x1b[1;6R", - KeyF40: "\x1b[1;6S", - KeyF41: "\x1b[15;6~", - KeyF42: "\x1b[17;6~", - KeyF43: "\x1b[18;6~", - KeyF44: "\x1b[19;6~", - KeyF45: "\x1b[20;6~", - KeyF46: "\x1b[21;6~", - KeyF47: "\x1b[23;6~", - KeyF48: "\x1b[24;6~", - KeyF49: "\x1b[1;3P", - KeyF50: "\x1b[1;3Q", - KeyF51: "\x1b[1;3R", - KeyF52: "\x1b[1;3S", - KeyF53: "\x1b[15;3~", - KeyF54: "\x1b[17;3~", - KeyF55: "\x1b[18;3~", - KeyF56: "\x1b[19;3~", - KeyF57: "\x1b[20;3~", - KeyF58: "\x1b[21;3~", - KeyF59: "\x1b[23;3~", - KeyF60: "\x1b[24;3~", - KeyF61: "\x1b[1;4P", - KeyF62: "\x1b[1;4Q", - KeyF63: "\x1b[1;4R", - KeyClear: "\x1b[3;5~", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[1;2D", - KeyShfRight: "\x1b[1;2C", - KeyShfUp: "\x1b[1;2A", - KeyShfDown: "\x1b[1;2B", - KeyCtrlLeft: "\x1b[1;5D", - KeyCtrlRight: "\x1b[1;5C", - KeyCtrlUp: "\x1b[1;5A", - KeyCtrlDown: "\x1b[1;5B", - KeyMetaLeft: "\x1b[1;9D", - KeyMetaRight: "\x1b[1;9C", - KeyMetaUp: "\x1b[1;9A", - KeyMetaDown: "\x1b[1;9B", - KeyAltLeft: "\x1b[1;3D", - KeyAltRight: "\x1b[1;3C", - KeyAltUp: "\x1b[1;3A", - KeyAltDown: "\x1b[1;3B", - KeyAltShfLeft: "\x1b[1;4D", - KeyAltShfRight: "\x1b[1;4C", - KeyAltShfUp: "\x1b[1;4A", - KeyAltShfDown: "\x1b[1;4B", - KeyMetaShfLeft: "\x1b[1;10D", - KeyMetaShfRight: "\x1b[1;10C", - KeyMetaShfUp: "\x1b[1;10A", - KeyMetaShfDown: "\x1b[1;10B", - KeyCtrlShfLeft: "\x1b[1;6D", - KeyCtrlShfRight: "\x1b[1;6C", - KeyCtrlShfUp: "\x1b[1;6A", - KeyCtrlShfDown: "\x1b[1;6B", - KeyShfHome: "\x1b[1;2H", - KeyShfEnd: "\x1b[1;2F", - KeyCtrlHome: "\x1b[1;5H", - KeyCtrlEnd: "\x1b[1;5F", - KeyAltHome: "\x1b[1;9H", - KeyAltEnd: "\x1b[1;9F", - KeyCtrlShfHome: "\x1b[1;6H", - KeyCtrlShfEnd: "\x1b[1;6F", - KeyMetaShfHome: "\x1b[1;10H", - KeyMetaShfEnd: "\x1b[1;10F", - KeyAltShfHome: "\x1b[1;4H", - KeyAltShfEnd: "\x1b[1;4F", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_st_meta_256color.go b/vendor/github.com/gdamore/tcell/terminfo/term_st_meta_256color.go deleted file mode 100644 index 5f181b2a..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_st_meta_256color.go +++ /dev/null @@ -1,155 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // simpleterm with meta key and 256 colors - AddTerminfo(&Terminfo{ - Name: "st-meta-256color", - Columns: 80, - Lines: 24, - Colors: 256, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b[?1049h", - ExitCA: "\x1b[?1049l", - ShowCursor: "\x1b[?12l\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[0m", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Dim: "\x1b[2m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h\x1b=", - ExitKeypad: "\x1b[?1l\x1b>", - SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", - AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x1b(0", - ExitAcs: "\x1b(B", - EnableAcs: "\x1b)0", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1b[1~", - KeyEnd: "\x1b[4~", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1b[1;2P", - KeyF14: "\x1b[1;2Q", - KeyF15: "\x1b[1;2R", - KeyF16: "\x1b[1;2S", - KeyF17: "\x1b[15;2~", - KeyF18: "\x1b[17;2~", - KeyF19: "\x1b[18;2~", - KeyF20: "\x1b[19;2~", - KeyF21: "\x1b[20;2~", - KeyF22: "\x1b[21;2~", - KeyF23: "\x1b[23;2~", - KeyF24: "\x1b[24;2~", - KeyF25: "\x1b[1;5P", - KeyF26: "\x1b[1;5Q", - KeyF27: "\x1b[1;5R", - KeyF28: "\x1b[1;5S", - KeyF29: "\x1b[15;5~", - KeyF30: "\x1b[17;5~", - KeyF31: "\x1b[18;5~", - KeyF32: "\x1b[19;5~", - KeyF33: "\x1b[20;5~", - KeyF34: "\x1b[21;5~", - KeyF35: "\x1b[23;5~", - KeyF36: "\x1b[24;5~", - KeyF37: "\x1b[1;6P", - KeyF38: "\x1b[1;6Q", - KeyF39: "\x1b[1;6R", - KeyF40: "\x1b[1;6S", - KeyF41: "\x1b[15;6~", - KeyF42: "\x1b[17;6~", - KeyF43: "\x1b[18;6~", - KeyF44: "\x1b[19;6~", - KeyF45: "\x1b[20;6~", - KeyF46: "\x1b[21;6~", - KeyF47: "\x1b[23;6~", - KeyF48: "\x1b[24;6~", - KeyF49: "\x1b[1;3P", - KeyF50: "\x1b[1;3Q", - KeyF51: "\x1b[1;3R", - KeyF52: "\x1b[1;3S", - KeyF53: "\x1b[15;3~", - KeyF54: "\x1b[17;3~", - KeyF55: "\x1b[18;3~", - KeyF56: "\x1b[19;3~", - KeyF57: "\x1b[20;3~", - KeyF58: "\x1b[21;3~", - KeyF59: "\x1b[23;3~", - KeyF60: "\x1b[24;3~", - KeyF61: "\x1b[1;4P", - KeyF62: "\x1b[1;4Q", - KeyF63: "\x1b[1;4R", - KeyClear: "\x1b[3;5~", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[1;2D", - KeyShfRight: "\x1b[1;2C", - KeyShfUp: "\x1b[1;2A", - KeyShfDown: "\x1b[1;2B", - KeyCtrlLeft: "\x1b[1;5D", - KeyCtrlRight: "\x1b[1;5C", - KeyCtrlUp: "\x1b[1;5A", - KeyCtrlDown: "\x1b[1;5B", - KeyMetaLeft: "\x1b[1;9D", - KeyMetaRight: "\x1b[1;9C", - KeyMetaUp: "\x1b[1;9A", - KeyMetaDown: "\x1b[1;9B", - KeyAltLeft: "\x1b[1;3D", - KeyAltRight: "\x1b[1;3C", - KeyAltUp: "\x1b[1;3A", - KeyAltDown: "\x1b[1;3B", - KeyAltShfLeft: "\x1b[1;4D", - KeyAltShfRight: "\x1b[1;4C", - KeyAltShfUp: "\x1b[1;4A", - KeyAltShfDown: "\x1b[1;4B", - KeyMetaShfLeft: "\x1b[1;10D", - KeyMetaShfRight: "\x1b[1;10C", - KeyMetaShfUp: "\x1b[1;10A", - KeyMetaShfDown: "\x1b[1;10B", - KeyCtrlShfLeft: "\x1b[1;6D", - KeyCtrlShfRight: "\x1b[1;6C", - KeyCtrlShfUp: "\x1b[1;6A", - KeyCtrlShfDown: "\x1b[1;6B", - KeyShfHome: "\x1b[1;2H", - KeyShfEnd: "\x1b[1;2F", - KeyCtrlHome: "\x1b[1;5H", - KeyCtrlEnd: "\x1b[1;5F", - KeyAltHome: "\x1b[1;9H", - KeyAltEnd: "\x1b[1;9F", - KeyCtrlShfHome: "\x1b[1;6H", - KeyCtrlShfEnd: "\x1b[1;6F", - KeyMetaShfHome: "\x1b[1;10H", - KeyMetaShfEnd: "\x1b[1;10F", - KeyAltShfHome: "\x1b[1;4H", - KeyAltShfEnd: "\x1b[1;4F", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_sun.go b/vendor/github.com/gdamore/tcell/terminfo/term_sun.go deleted file mode 100644 index 5858b4c2..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_sun.go +++ /dev/null @@ -1,44 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // Sun Microsystems Inc. workstation console - AddTerminfo(&Terminfo{ - Name: "sun", - Aliases: []string{"sun1", "sun2"}, - Columns: 80, - Lines: 34, - Bell: "\a", - Clear: "\f", - AttrOff: "\x1b[m", - Reverse: "\x1b[7m", - PadChar: "\x00", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1b[A", - KeyDown: "\x1b[B", - KeyRight: "\x1b[C", - KeyLeft: "\x1b[D", - KeyInsert: "\x1b[247z", - KeyDelete: "\u007f", - KeyBackspace: "\b", - KeyHome: "\x1b[214z", - KeyEnd: "\x1b[220z", - KeyPgUp: "\x1b[216z", - KeyPgDn: "\x1b[222z", - KeyF1: "\x1b[224z", - KeyF2: "\x1b[225z", - KeyF3: "\x1b[226z", - KeyF4: "\x1b[227z", - KeyF5: "\x1b[228z", - KeyF6: "\x1b[229z", - KeyF7: "\x1b[230z", - KeyF8: "\x1b[231z", - KeyF9: "\x1b[232z", - KeyF10: "\x1b[233z", - KeyF11: "\x1b[234z", - KeyF12: "\x1b[235z", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_wy99_ansi.go b/vendor/github.com/gdamore/tcell/terminfo/term_wy99_ansi.go deleted file mode 100644 index 6bf0d69c..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_wy99_ansi.go +++ /dev/null @@ -1,58 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // Wyse WY-99GT in ansi mode (int'l PC keyboard) - AddTerminfo(&Terminfo{ - Name: "wy99-ansi", - Columns: 80, - Lines: 25, - Bell: "\a", - Clear: "\x1b[H\x1b[J$<200>", - ShowCursor: "\x1b[34h\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[m\x0f\x1b[\"q", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Dim: "\x1b[2m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h", - ExitKeypad: "\x1b[?1l", - PadChar: "\x00", - AltChars: "``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~", - EnterAcs: "\x0e", - ExitAcs: "\x0f", - EnableAcs: "\x1b)0", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b$<1>", - CursorUp1: "\x1bM", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyBackspace: "\b", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[M", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF17: "\x1b[K", - KeyF18: "\x1b[31~", - KeyF19: "\x1b[32~", - KeyF20: "\x1b[33~", - KeyF21: "\x1b[34~", - KeyF22: "\x1b[35~", - KeyF23: "\x1b[1~", - KeyF24: "\x1b[2~", - KeyBacktab: "\x1b[z", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_wy99a_ansi.go b/vendor/github.com/gdamore/tcell/terminfo/term_wy99a_ansi.go deleted file mode 100644 index 1d7f6f21..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_wy99a_ansi.go +++ /dev/null @@ -1,58 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // Wyse WY-99GT in ansi mode (US PC keyboard) - AddTerminfo(&Terminfo{ - Name: "wy99a-ansi", - Columns: 80, - Lines: 25, - Bell: "\a", - Clear: "\x1b[H\x1b[J$<200>", - ShowCursor: "\x1b[34h\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b[m\x0f\x1b[\"q", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Dim: "\x1b[2m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h", - ExitKeypad: "\x1b[?1l", - PadChar: "\x00", - AltChars: "``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~", - EnterAcs: "\x0e", - ExitAcs: "\x0f", - EnableAcs: "\x1b)0", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b$<1>", - CursorUp1: "\x1bM", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyBackspace: "\b", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[M", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF17: "\x1b[K", - KeyF18: "\x1b[31~", - KeyF19: "\x1b[32~", - KeyF20: "\x1b[33~", - KeyF21: "\x1b[34~", - KeyF22: "\x1b[35~", - KeyF23: "\x1b[1~", - KeyF24: "\x1b[2~", - KeyBacktab: "\x1b[z", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_xterm.go b/vendor/github.com/gdamore/tcell/terminfo/term_xterm.go deleted file mode 100644 index 1e4d296e..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_xterm.go +++ /dev/null @@ -1,154 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // X11 terminal emulator - AddTerminfo(&Terminfo{ - Name: "xterm", - Aliases: []string{"xterm-debian"}, - Columns: 80, - Lines: 24, - Colors: 8, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b[?1049h", - ExitCA: "\x1b[?1049l", - ShowCursor: "\x1b[?12l\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b(B\x1b[m", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Dim: "\x1b[2m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h\x1b=", - ExitKeypad: "\x1b[?1l\x1b>", - SetFg: "\x1b[3%p1%dm", - SetBg: "\x1b[4%p1%dm", - SetFgBg: "\x1b[3%p1%d;4%p2%dm", - AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x1b(0", - ExitAcs: "\x1b(B", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1bOH", - KeyEnd: "\x1bOF", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1b[1;2P", - KeyF14: "\x1b[1;2Q", - KeyF15: "\x1b[1;2R", - KeyF16: "\x1b[1;2S", - KeyF17: "\x1b[15;2~", - KeyF18: "\x1b[17;2~", - KeyF19: "\x1b[18;2~", - KeyF20: "\x1b[19;2~", - KeyF21: "\x1b[20;2~", - KeyF22: "\x1b[21;2~", - KeyF23: "\x1b[23;2~", - KeyF24: "\x1b[24;2~", - KeyF25: "\x1b[1;5P", - KeyF26: "\x1b[1;5Q", - KeyF27: "\x1b[1;5R", - KeyF28: "\x1b[1;5S", - KeyF29: "\x1b[15;5~", - KeyF30: "\x1b[17;5~", - KeyF31: "\x1b[18;5~", - KeyF32: "\x1b[19;5~", - KeyF33: "\x1b[20;5~", - KeyF34: "\x1b[21;5~", - KeyF35: "\x1b[23;5~", - KeyF36: "\x1b[24;5~", - KeyF37: "\x1b[1;6P", - KeyF38: "\x1b[1;6Q", - KeyF39: "\x1b[1;6R", - KeyF40: "\x1b[1;6S", - KeyF41: "\x1b[15;6~", - KeyF42: "\x1b[17;6~", - KeyF43: "\x1b[18;6~", - KeyF44: "\x1b[19;6~", - KeyF45: "\x1b[20;6~", - KeyF46: "\x1b[21;6~", - KeyF47: "\x1b[23;6~", - KeyF48: "\x1b[24;6~", - KeyF49: "\x1b[1;3P", - KeyF50: "\x1b[1;3Q", - KeyF51: "\x1b[1;3R", - KeyF52: "\x1b[1;3S", - KeyF53: "\x1b[15;3~", - KeyF54: "\x1b[17;3~", - KeyF55: "\x1b[18;3~", - KeyF56: "\x1b[19;3~", - KeyF57: "\x1b[20;3~", - KeyF58: "\x1b[21;3~", - KeyF59: "\x1b[23;3~", - KeyF60: "\x1b[24;3~", - KeyF61: "\x1b[1;4P", - KeyF62: "\x1b[1;4Q", - KeyF63: "\x1b[1;4R", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[1;2D", - KeyShfRight: "\x1b[1;2C", - KeyShfUp: "\x1b[1;2A", - KeyShfDown: "\x1b[1;2B", - KeyCtrlLeft: "\x1b[1;5D", - KeyCtrlRight: "\x1b[1;5C", - KeyCtrlUp: "\x1b[1;5A", - KeyCtrlDown: "\x1b[1;5B", - KeyMetaLeft: "\x1b[1;9D", - KeyMetaRight: "\x1b[1;9C", - KeyMetaUp: "\x1b[1;9A", - KeyMetaDown: "\x1b[1;9B", - KeyAltLeft: "\x1b[1;3D", - KeyAltRight: "\x1b[1;3C", - KeyAltUp: "\x1b[1;3A", - KeyAltDown: "\x1b[1;3B", - KeyAltShfLeft: "\x1b[1;4D", - KeyAltShfRight: "\x1b[1;4C", - KeyAltShfUp: "\x1b[1;4A", - KeyAltShfDown: "\x1b[1;4B", - KeyMetaShfLeft: "\x1b[1;10D", - KeyMetaShfRight: "\x1b[1;10C", - KeyMetaShfUp: "\x1b[1;10A", - KeyMetaShfDown: "\x1b[1;10B", - KeyCtrlShfLeft: "\x1b[1;6D", - KeyCtrlShfRight: "\x1b[1;6C", - KeyCtrlShfUp: "\x1b[1;6A", - KeyCtrlShfDown: "\x1b[1;6B", - KeyShfHome: "\x1b[1;2H", - KeyShfEnd: "\x1b[1;2F", - KeyCtrlHome: "\x1b[1;5H", - KeyCtrlEnd: "\x1b[1;5F", - KeyAltHome: "\x1b[1;9H", - KeyAltEnd: "\x1b[1;9F", - KeyCtrlShfHome: "\x1b[1;6H", - KeyCtrlShfEnd: "\x1b[1;6F", - KeyMetaShfHome: "\x1b[1;10H", - KeyMetaShfEnd: "\x1b[1;10F", - KeyAltShfHome: "\x1b[1;4H", - KeyAltShfEnd: "\x1b[1;4F", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_xterm_256color.go b/vendor/github.com/gdamore/tcell/terminfo/term_xterm_256color.go deleted file mode 100644 index f95d21e8..00000000 --- a/vendor/github.com/gdamore/tcell/terminfo/term_xterm_256color.go +++ /dev/null @@ -1,153 +0,0 @@ -// Generated automatically. DO NOT HAND-EDIT. - -package terminfo - -func init() { - // xterm with 256 colors - AddTerminfo(&Terminfo{ - Name: "xterm-256color", - Columns: 80, - Lines: 24, - Colors: 256, - Bell: "\a", - Clear: "\x1b[H\x1b[2J", - EnterCA: "\x1b[?1049h", - ExitCA: "\x1b[?1049l", - ShowCursor: "\x1b[?12l\x1b[?25h", - HideCursor: "\x1b[?25l", - AttrOff: "\x1b(B\x1b[m", - Underline: "\x1b[4m", - Bold: "\x1b[1m", - Dim: "\x1b[2m", - Blink: "\x1b[5m", - Reverse: "\x1b[7m", - EnterKeypad: "\x1b[?1h\x1b=", - ExitKeypad: "\x1b[?1l\x1b>", - SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", - AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", - EnterAcs: "\x1b(0", - ExitAcs: "\x1b(B", - Mouse: "\x1b[M", - MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", - SetCursor: "\x1b[%i%p1%d;%p2%dH", - CursorBack1: "\b", - CursorUp1: "\x1b[A", - KeyUp: "\x1bOA", - KeyDown: "\x1bOB", - KeyRight: "\x1bOC", - KeyLeft: "\x1bOD", - KeyInsert: "\x1b[2~", - KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", - KeyHome: "\x1bOH", - KeyEnd: "\x1bOF", - KeyPgUp: "\x1b[5~", - KeyPgDn: "\x1b[6~", - KeyF1: "\x1bOP", - KeyF2: "\x1bOQ", - KeyF3: "\x1bOR", - KeyF4: "\x1bOS", - KeyF5: "\x1b[15~", - KeyF6: "\x1b[17~", - KeyF7: "\x1b[18~", - KeyF8: "\x1b[19~", - KeyF9: "\x1b[20~", - KeyF10: "\x1b[21~", - KeyF11: "\x1b[23~", - KeyF12: "\x1b[24~", - KeyF13: "\x1b[1;2P", - KeyF14: "\x1b[1;2Q", - KeyF15: "\x1b[1;2R", - KeyF16: "\x1b[1;2S", - KeyF17: "\x1b[15;2~", - KeyF18: "\x1b[17;2~", - KeyF19: "\x1b[18;2~", - KeyF20: "\x1b[19;2~", - KeyF21: "\x1b[20;2~", - KeyF22: "\x1b[21;2~", - KeyF23: "\x1b[23;2~", - KeyF24: "\x1b[24;2~", - KeyF25: "\x1b[1;5P", - KeyF26: "\x1b[1;5Q", - KeyF27: "\x1b[1;5R", - KeyF28: "\x1b[1;5S", - KeyF29: "\x1b[15;5~", - KeyF30: "\x1b[17;5~", - KeyF31: "\x1b[18;5~", - KeyF32: "\x1b[19;5~", - KeyF33: "\x1b[20;5~", - KeyF34: "\x1b[21;5~", - KeyF35: "\x1b[23;5~", - KeyF36: "\x1b[24;5~", - KeyF37: "\x1b[1;6P", - KeyF38: "\x1b[1;6Q", - KeyF39: "\x1b[1;6R", - KeyF40: "\x1b[1;6S", - KeyF41: "\x1b[15;6~", - KeyF42: "\x1b[17;6~", - KeyF43: "\x1b[18;6~", - KeyF44: "\x1b[19;6~", - KeyF45: "\x1b[20;6~", - KeyF46: "\x1b[21;6~", - KeyF47: "\x1b[23;6~", - KeyF48: "\x1b[24;6~", - KeyF49: "\x1b[1;3P", - KeyF50: "\x1b[1;3Q", - KeyF51: "\x1b[1;3R", - KeyF52: "\x1b[1;3S", - KeyF53: "\x1b[15;3~", - KeyF54: "\x1b[17;3~", - KeyF55: "\x1b[18;3~", - KeyF56: "\x1b[19;3~", - KeyF57: "\x1b[20;3~", - KeyF58: "\x1b[21;3~", - KeyF59: "\x1b[23;3~", - KeyF60: "\x1b[24;3~", - KeyF61: "\x1b[1;4P", - KeyF62: "\x1b[1;4Q", - KeyF63: "\x1b[1;4R", - KeyBacktab: "\x1b[Z", - KeyShfLeft: "\x1b[1;2D", - KeyShfRight: "\x1b[1;2C", - KeyShfUp: "\x1b[1;2A", - KeyShfDown: "\x1b[1;2B", - KeyCtrlLeft: "\x1b[1;5D", - KeyCtrlRight: "\x1b[1;5C", - KeyCtrlUp: "\x1b[1;5A", - KeyCtrlDown: "\x1b[1;5B", - KeyMetaLeft: "\x1b[1;9D", - KeyMetaRight: "\x1b[1;9C", - KeyMetaUp: "\x1b[1;9A", - KeyMetaDown: "\x1b[1;9B", - KeyAltLeft: "\x1b[1;3D", - KeyAltRight: "\x1b[1;3C", - KeyAltUp: "\x1b[1;3A", - KeyAltDown: "\x1b[1;3B", - KeyAltShfLeft: "\x1b[1;4D", - KeyAltShfRight: "\x1b[1;4C", - KeyAltShfUp: "\x1b[1;4A", - KeyAltShfDown: "\x1b[1;4B", - KeyMetaShfLeft: "\x1b[1;10D", - KeyMetaShfRight: "\x1b[1;10C", - KeyMetaShfUp: "\x1b[1;10A", - KeyMetaShfDown: "\x1b[1;10B", - KeyCtrlShfLeft: "\x1b[1;6D", - KeyCtrlShfRight: "\x1b[1;6C", - KeyCtrlShfUp: "\x1b[1;6A", - KeyCtrlShfDown: "\x1b[1;6B", - KeyShfHome: "\x1b[1;2H", - KeyShfEnd: "\x1b[1;2F", - KeyCtrlHome: "\x1b[1;5H", - KeyCtrlEnd: "\x1b[1;5F", - KeyAltHome: "\x1b[1;9H", - KeyAltEnd: "\x1b[1;9F", - KeyCtrlShfHome: "\x1b[1;6H", - KeyCtrlShfEnd: "\x1b[1;6F", - KeyMetaShfHome: "\x1b[1;10H", - KeyMetaShfEnd: "\x1b[1;10F", - KeyAltShfHome: "\x1b[1;4H", - KeyAltShfEnd: "\x1b[1;4F", - }) -} diff --git a/vendor/github.com/gdamore/tcell/terminfo/terminfo.go b/vendor/github.com/gdamore/tcell/terminfo/terminfo.go index a307f765..d0f46e93 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/terminfo.go +++ b/vendor/github.com/gdamore/tcell/terminfo/terminfo.go @@ -16,18 +16,14 @@ package terminfo import ( "bytes" - "compress/gzip" - "crypto/sha1" - "encoding/json" "errors" "fmt" "io" "os" - "path" - "path/filepath" "strconv" "strings" "sync" + "time" ) var ( @@ -45,122 +41,122 @@ var ( // in Go, but when we write out JSON, we use the same names as terminfo. // The name, aliases and smous, rmous fields do not come from terminfo directly. type Terminfo struct { - Name string `json:"name"` - Aliases []string `json:"aliases,omitempty"` - Columns int `json:"cols,omitempty"` // cols - Lines int `json:"lines,omitempty"` // lines - Colors int `json:"colors,omitempty"` // colors - Bell string `json:"bell,omitempty"` // bell - Clear string `json:"clear,omitempty"` // clear - EnterCA string `json:"smcup,omitempty"` // smcup - ExitCA string `json:"rmcup,omitempty"` // rmcup - ShowCursor string `json:"cnorm,omitempty"` // cnorm - HideCursor string `json:"civis,omitempty"` // civis - AttrOff string `json:"sgr0,omitempty"` // sgr0 - Underline string `json:"smul,omitempty"` // smul - Bold string `json:"bold,omitempty"` // bold - Blink string `json:"blink,omitempty"` // blink - Reverse string `json:"rev,omitempty"` // rev - Dim string `json:"dim,omitempty"` // dim - EnterKeypad string `json:"smkx,omitempty"` // smkx - ExitKeypad string `json:"rmkx,omitempty"` // rmkx - SetFg string `json:"setaf,omitempty"` // setaf - SetBg string `json:"setbg,omitempty"` // setab - SetCursor string `json:"cup,omitempty"` // cup - CursorBack1 string `json:"cub1,omitempty"` // cub1 - CursorUp1 string `json:"cuu1,omitempty"` // cuu1 - PadChar string `json:"pad,omitempty"` // pad - KeyBackspace string `json:"kbs,omitempty"` // kbs - KeyF1 string `json:"kf1,omitempty"` // kf1 - KeyF2 string `json:"kf2,omitempty"` // kf2 - KeyF3 string `json:"kf3,omitempty"` // kf3 - KeyF4 string `json:"kf4,omitempty"` // kf4 - KeyF5 string `json:"kf5,omitempty"` // kf5 - KeyF6 string `json:"kf6,omitempty"` // kf6 - KeyF7 string `json:"kf7,omitempty"` // kf7 - KeyF8 string `json:"kf8,omitempty"` // kf8 - KeyF9 string `json:"kf9,omitempty"` // kf9 - KeyF10 string `json:"kf10,omitempty"` // kf10 - KeyF11 string `json:"kf11,omitempty"` // kf11 - KeyF12 string `json:"kf12,omitempty"` // kf12 - KeyF13 string `json:"kf13,omitempty"` // kf13 - KeyF14 string `json:"kf14,omitempty"` // kf14 - KeyF15 string `json:"kf15,omitempty"` // kf15 - KeyF16 string `json:"kf16,omitempty"` // kf16 - KeyF17 string `json:"kf17,omitempty"` // kf17 - KeyF18 string `json:"kf18,omitempty"` // kf18 - KeyF19 string `json:"kf19,omitempty"` // kf19 - KeyF20 string `json:"kf20,omitempty"` // kf20 - KeyF21 string `json:"kf21,omitempty"` // kf21 - KeyF22 string `json:"kf22,omitempty"` // kf22 - KeyF23 string `json:"kf23,omitempty"` // kf23 - KeyF24 string `json:"kf24,omitempty"` // kf24 - KeyF25 string `json:"kf25,omitempty"` // kf25 - KeyF26 string `json:"kf26,omitempty"` // kf26 - KeyF27 string `json:"kf27,omitempty"` // kf27 - KeyF28 string `json:"kf28,omitempty"` // kf28 - KeyF29 string `json:"kf29,omitempty"` // kf29 - KeyF30 string `json:"kf30,omitempty"` // kf30 - KeyF31 string `json:"kf31,omitempty"` // kf31 - KeyF32 string `json:"kf32,omitempty"` // kf32 - KeyF33 string `json:"kf33,omitempty"` // kf33 - KeyF34 string `json:"kf34,omitempty"` // kf34 - KeyF35 string `json:"kf35,omitempty"` // kf35 - KeyF36 string `json:"kf36,omitempty"` // kf36 - KeyF37 string `json:"kf37,omitempty"` // kf37 - KeyF38 string `json:"kf38,omitempty"` // kf38 - KeyF39 string `json:"kf39,omitempty"` // kf39 - KeyF40 string `json:"kf40,omitempty"` // kf40 - KeyF41 string `json:"kf41,omitempty"` // kf41 - KeyF42 string `json:"kf42,omitempty"` // kf42 - KeyF43 string `json:"kf43,omitempty"` // kf43 - KeyF44 string `json:"kf44,omitempty"` // kf44 - KeyF45 string `json:"kf45,omitempty"` // kf45 - KeyF46 string `json:"kf46,omitempty"` // kf46 - KeyF47 string `json:"kf47,omitempty"` // kf47 - KeyF48 string `json:"kf48,omitempty"` // kf48 - KeyF49 string `json:"kf49,omitempty"` // kf49 - KeyF50 string `json:"kf50,omitempty"` // kf50 - KeyF51 string `json:"kf51,omitempty"` // kf51 - KeyF52 string `json:"kf52,omitempty"` // kf52 - KeyF53 string `json:"kf53,omitempty"` // kf53 - KeyF54 string `json:"kf54,omitempty"` // kf54 - KeyF55 string `json:"kf55,omitempty"` // kf55 - KeyF56 string `json:"kf56,omitempty"` // kf56 - KeyF57 string `json:"kf57,omitempty"` // kf57 - KeyF58 string `json:"kf58,omitempty"` // kf58 - KeyF59 string `json:"kf59,omitempty"` // kf59 - KeyF60 string `json:"kf60,omitempty"` // kf60 - KeyF61 string `json:"kf61,omitempty"` // kf61 - KeyF62 string `json:"kf62,omitempty"` // kf62 - KeyF63 string `json:"kf63,omitempty"` // kf63 - KeyF64 string `json:"kf64,omitempty"` // kf64 - KeyInsert string `json:"kich,omitempty"` // kich1 - KeyDelete string `json:"kdch,omitempty"` // kdch1 - KeyHome string `json:"khome,omitempty"` // khome - KeyEnd string `json:"kend,omitempty"` // kend - KeyHelp string `json:"khlp,omitempty"` // khlp - KeyPgUp string `json:"kpp,omitempty"` // kpp - KeyPgDn string `json:"knp,omitempty"` // knp - KeyUp string `json:"kcuu1,omitempty"` // kcuu1 - KeyDown string `json:"kcud1,omitempty"` // kcud1 - KeyLeft string `json:"kcub1,omitempty"` // kcub1 - KeyRight string `json:"kcuf1,omitempty"` // kcuf1 - KeyBacktab string `json:"kcbt,omitempty"` // kcbt - KeyExit string `json:"kext,omitempty"` // kext - KeyClear string `json:"kclr,omitempty"` // kclr - KeyPrint string `json:"kprt,omitempty"` // kprt - KeyCancel string `json:"kcan,omitempty"` // kcan - Mouse string `json:"kmous,omitempty"` // kmous - MouseMode string `json:"XM,omitempty"` // XM - AltChars string `json:"acsc,omitempty"` // acsc - EnterAcs string `json:"smacs,omitempty"` // smacs - ExitAcs string `json:"rmacs,omitempty"` // rmacs - EnableAcs string `json:"enacs,omitempty"` // enacs - KeyShfRight string `json:"kRIT,omitempty"` // kRIT - KeyShfLeft string `json:"kLFT,omitempty"` // kLFT - KeyShfHome string `json:"kHOM,omitempty"` // kHOM - KeyShfEnd string `json:"kEND,omitempty"` // kEND + Name string + Aliases []string + Columns int // cols + Lines int // lines + Colors int // colors + Bell string // bell + Clear string // clear + EnterCA string // smcup + ExitCA string // rmcup + ShowCursor string // cnorm + HideCursor string // civis + AttrOff string // sgr0 + Underline string // smul + Bold string // bold + Blink string // blink + Reverse string // rev + Dim string // dim + EnterKeypad string // smkx + ExitKeypad string // rmkx + SetFg string // setaf + SetBg string // setab + SetCursor string // cup + CursorBack1 string // cub1 + CursorUp1 string // cuu1 + PadChar string // pad + KeyBackspace string // kbs + KeyF1 string // kf1 + KeyF2 string // kf2 + KeyF3 string // kf3 + KeyF4 string // kf4 + KeyF5 string // kf5 + KeyF6 string // kf6 + KeyF7 string // kf7 + KeyF8 string // kf8 + KeyF9 string // kf9 + KeyF10 string // kf10 + KeyF11 string // kf11 + KeyF12 string // kf12 + KeyF13 string // kf13 + KeyF14 string // kf14 + KeyF15 string // kf15 + KeyF16 string // kf16 + KeyF17 string // kf17 + KeyF18 string // kf18 + KeyF19 string // kf19 + KeyF20 string // kf20 + KeyF21 string // kf21 + KeyF22 string // kf22 + KeyF23 string // kf23 + KeyF24 string // kf24 + KeyF25 string // kf25 + KeyF26 string // kf26 + KeyF27 string // kf27 + KeyF28 string // kf28 + KeyF29 string // kf29 + KeyF30 string // kf30 + KeyF31 string // kf31 + KeyF32 string // kf32 + KeyF33 string // kf33 + KeyF34 string // kf34 + KeyF35 string // kf35 + KeyF36 string // kf36 + KeyF37 string // kf37 + KeyF38 string // kf38 + KeyF39 string // kf39 + KeyF40 string // kf40 + KeyF41 string // kf41 + KeyF42 string // kf42 + KeyF43 string // kf43 + KeyF44 string // kf44 + KeyF45 string // kf45 + KeyF46 string // kf46 + KeyF47 string // kf47 + KeyF48 string // kf48 + KeyF49 string // kf49 + KeyF50 string // kf50 + KeyF51 string // kf51 + KeyF52 string // kf52 + KeyF53 string // kf53 + KeyF54 string // kf54 + KeyF55 string // kf55 + KeyF56 string // kf56 + KeyF57 string // kf57 + KeyF58 string // kf58 + KeyF59 string // kf59 + KeyF60 string // kf60 + KeyF61 string // kf61 + KeyF62 string // kf62 + KeyF63 string // kf63 + KeyF64 string // kf64 + KeyInsert string // kich1 + KeyDelete string // kdch1 + KeyHome string // khome + KeyEnd string // kend + KeyHelp string // khlp + KeyPgUp string // kpp + KeyPgDn string // knp + KeyUp string // kcuu1 + KeyDown string // kcud1 + KeyLeft string // kcub1 + KeyRight string // kcuf1 + KeyBacktab string // kcbt + KeyExit string // kext + KeyClear string // kclr + KeyPrint string // kprt + KeyCancel string // kcan + Mouse string // kmous + MouseMode string // XM + AltChars string // acsc + EnterAcs string // smacs + ExitAcs string // rmacs + EnableAcs string // enacs + KeyShfRight string // kRIT + KeyShfLeft string // kLFT + KeyShfHome string // kHOM + KeyShfEnd string // kEND // These are non-standard extensions to terminfo. This includes // true color support, and some additional keys. Its kind of bizarre @@ -168,48 +164,48 @@ type Terminfo struct { // Terminal support for these are going to vary amongst XTerm // emulations, so don't depend too much on them in your application. - SetFgBg string `json:"_setfgbg,omitempty"` // setfgbg - SetFgBgRGB string `json:"_setfgbgrgb,omitempty"` // setfgbgrgb - SetFgRGB string `json:"_setfrgb,omitempty"` // setfrgb - SetBgRGB string `json:"_setbrgb,omitempty"` // setbrgb - KeyShfUp string `json:"_kscu1,omitempty"` // shift-up - KeyShfDown string `json:"_kscud1,omitempty"` // shift-down - KeyCtrlUp string `json:"_kccu1,omitempty"` // ctrl-up - KeyCtrlDown string `json:"_kccud1,omitempty"` // ctrl-left - KeyCtrlRight string `json:"_kccuf1,omitempty"` // ctrl-right - KeyCtrlLeft string `json:"_kccub1,omitempty"` // ctrl-left - KeyMetaUp string `json:"_kmcu1,omitempty"` // meta-up - KeyMetaDown string `json:"_kmcud1,omitempty"` // meta-left - KeyMetaRight string `json:"_kmcuf1,omitempty"` // meta-right - KeyMetaLeft string `json:"_kmcub1,omitempty"` // meta-left - KeyAltUp string `json:"_kacu1,omitempty"` // alt-up - KeyAltDown string `json:"_kacud1,omitempty"` // alt-left - KeyAltRight string `json:"_kacuf1,omitempty"` // alt-right - KeyAltLeft string `json:"_kacub1,omitempty"` // alt-left - KeyCtrlHome string `json:"_kchome,omitempty"` - KeyCtrlEnd string `json:"_kcend,omitempty"` - KeyMetaHome string `json:"_kmhome,omitempty"` - KeyMetaEnd string `json:"_kmend,omitempty"` - KeyAltHome string `json:"_kahome,omitempty"` - KeyAltEnd string `json:"_kaend,omitempty"` - KeyAltShfUp string `json:"_kascu1,omitempty"` - KeyAltShfDown string `json:"_kascud1,omitempty"` - KeyAltShfLeft string `json:"_kascub1,omitempty"` - KeyAltShfRight string `json:"_kascuf1,omitempty"` - KeyMetaShfUp string `json:"_kmscu1,omitempty"` - KeyMetaShfDown string `json:"_kmscud1,omitempty"` - KeyMetaShfLeft string `json:"_kmscub1,omitempty"` - KeyMetaShfRight string `json:"_kmscuf1,omitempty"` - KeyCtrlShfUp string `json:"_kcscu1,omitempty"` - KeyCtrlShfDown string `json:"_kcscud1,omitempty"` - KeyCtrlShfLeft string `json:"_kcscub1,omitempty"` - KeyCtrlShfRight string `json:"_kcscuf1,omitempty"` - KeyCtrlShfHome string `json:"_kcHOME,omitempty"` - KeyCtrlShfEnd string `json:"_kcEND,omitempty"` - KeyAltShfHome string `json:"_kaHOME,omitempty"` - KeyAltShfEnd string `json:"_kaEND,omitempty"` - KeyMetaShfHome string `json:"_kmHOME,omitempty"` - KeyMetaShfEnd string `json:"_kmEND,omitempty"` + SetFgBg string // setfgbg + SetFgBgRGB string // setfgbgrgb + SetFgRGB string // setfrgb + SetBgRGB string // setbrgb + KeyShfUp string // shift-up + KeyShfDown string // shift-down + KeyCtrlUp string // ctrl-up + KeyCtrlDown string // ctrl-left + KeyCtrlRight string // ctrl-right + KeyCtrlLeft string // ctrl-left + KeyMetaUp string // meta-up + KeyMetaDown string // meta-left + KeyMetaRight string // meta-right + KeyMetaLeft string // meta-left + KeyAltUp string // alt-up + KeyAltDown string // alt-left + KeyAltRight string // alt-right + KeyAltLeft string // alt-left + KeyCtrlHome string + KeyCtrlEnd string + KeyMetaHome string + KeyMetaEnd string + KeyAltHome string + KeyAltEnd string + KeyAltShfUp string + KeyAltShfDown string + KeyAltShfLeft string + KeyAltShfRight string + KeyMetaShfUp string + KeyMetaShfDown string + KeyMetaShfLeft string + KeyMetaShfRight string + KeyCtrlShfUp string + KeyCtrlShfDown string + KeyCtrlShfLeft string + KeyCtrlShfRight string + KeyCtrlShfHome string + KeyCtrlShfEnd string + KeyAltShfHome string + KeyAltShfEnd string + KeyMetaShfHome string + KeyMetaShfEnd string } type stackElem struct { @@ -618,11 +614,10 @@ func (t *Terminfo) TParm(s string, p ...int) string { // TPuts emits the string to the writer, but expands inline padding // indications (of the form $<[delay]> where [delay] is msec) to -// a suitable number of padding characters (usually null bytes) based -// upon the supplied baud. At high baud rates, more padding characters -// will be inserted. All Terminfo based strings should be emitted using -// this function. -func (t *Terminfo) TPuts(w io.Writer, s string, baud int) { +// a suitable time (unless the terminfo string indicates this isn't needed +// by specifying npc - no padding). All Terminfo based strings should be +// emitted using this function. +func (t *Terminfo) TPuts(w io.Writer, s string) { for { beg := strings.Index(s, "$<") if beg < 0 { @@ -641,7 +636,7 @@ func (t *Terminfo) TPuts(w io.Writer, s string, baud int) { val := s[:end] s = s[end+1:] padus := 0 - unit := 1000 + unit := time.Millisecond dot := false loop: for i := range val { @@ -650,7 +645,7 @@ func (t *Terminfo) TPuts(w io.Writer, s string, baud int) { padus *= 10 padus += int(val[i] - '0') if dot { - unit *= 10 + unit /= 10 } case '.': if !dot { @@ -662,10 +657,12 @@ func (t *Terminfo) TPuts(w io.Writer, s string, baud int) { break loop } } - cnt := int(((baud / 8) * padus) / unit) - for cnt > 0 { - io.WriteString(w, t.PadChar) - cnt-- + + // Curses historically uses padding to achieve "fine grained" + // delays. We have much better clocks these days, and so we + // do not rely on padding but simply sleep a bit. + if len(t.PadChar) > 0 { + time.Sleep(unit * time.Duration(padus)) } } } @@ -717,54 +714,7 @@ func AddTerminfo(t *Terminfo) { dblock.Unlock() } -func loadFromFile(fname string, term string) (*Terminfo, error) { - var e error - var f io.Reader - if f, e = os.Open(fname); e != nil { - return nil, e - } - if strings.HasSuffix(fname, ".gz") { - if f, e = gzip.NewReader(f); e != nil { - return nil, e - } - } - d := json.NewDecoder(f) - for { - t := &Terminfo{} - if e := d.Decode(t); e != nil { - if e == io.EOF { - return nil, ErrTermNotFound - } - return nil, e - } - if t.SetCursor == "" { - // This must be an alias record, return it. - return t, nil - } - if t.Name == term { - return t, nil - } - for _, a := range t.Aliases { - if a == term { - return t, nil - } - } - } -} - // LookupTerminfo attempts to find a definition for the named $TERM. -// It first looks in the builtin database, which should cover just about -// everyone. If it can't find one there, then it will attempt to read -// one from the JSON file located in either $TCELLDB, $HOME/.tcelldb, -// or as a database file. -// -// The database files are named by taking terminal name, hashing it through -// sha1, and then a subdirectory of the form database/hash[0:2]/hash[0:8] -// (with an optional .gz extension). -// -// For other local database files, we will look for the database file using -// the terminal name, so database/term[0:2]/term[0:8], again with optional -// .gz extension. func LookupTerminfo(name string) (*Terminfo, error) { if name == "" { // else on windows: index out of bounds @@ -781,98 +731,6 @@ func LookupTerminfo(name string) (*Terminfo, error) { t := terminfos[name] dblock.Unlock() - if t == nil { - - var files []string - letter := fmt.Sprintf("%02x", name[0]) - gzfile := path.Join(letter, name+".gz") - jsfile := path.Join(letter, name) - hash := fmt.Sprintf("%x", sha1.Sum([]byte(name))) - gzhfile := path.Join(hash[0:2], hash[0:8]+".gz") - jshfile := path.Join(hash[0:2], hash[0:8]) - - // Build up the search path. Old versions of tcell used a - // single database file, whereas the new ones locate them - // in JSON (optionally compressed) files. - // - // The search path for "xterm" (SHA1 sig e2e28a8e...) looks - // like this: - // - // $TCELLDB/78/xterm.gz - // $TCELLDB/78/xterm - // $TCELLDB - // $HOME/.tcelldb/e2/e2e28a8e.gz - // $HOME/.tcelldb/e2/e2e28a8e - // $HOME/.tcelldb/78/xterm.gz - // $HOME/.tcelldb/78/xterm - // $HOME/.tcelldb - // $GOPATH/terminfo/database/e2/e2e28a8e.gz - // $GOPATH/terminfo/database/e2/e2e28a8e - // $GOPATH/terminfo/database/78/xterm.gz - // $GOPATH/terminfo/database/78/xterm - // - // Note that the legacy name lookups (78/xterm etc.) are - // provided for compatibility. We do not actually deliver - // any files with this style of naming, to avoid collisions - // on case insensitive filesystems. (*cough* mac *cough*). - - // If $GOPATH set, honor it, else assume $HOME/go just like - // modern golang does. - gopath := os.Getenv("GOPATH") - if gopath == "" { - gopath = path.Join(os.Getenv("HOME"), "go") - } - if pth := os.Getenv("TCELLDB"); pth != "" { - files = append(files, - path.Join(pth, gzfile), - path.Join(pth, jsfile), - pth) - } - if pth := os.Getenv("HOME"); pth != "" { - pth = path.Join(pth, ".tcelldb") - files = append(files, - path.Join(pth, gzhfile), - path.Join(pth, jshfile), - path.Join(pth, gzfile), - path.Join(pth, jsfile), - pth) - } - - for _, pth := range filepath.SplitList(gopath) { - pth = path.Join(pth, "src", "github.com", - "gdamore", "tcell", "terminfo", "database") - files = append(files, - path.Join(pth, gzhfile), - path.Join(pth, jshfile), - path.Join(pth, gzfile), - path.Join(pth, jsfile)) - } - - for _, fname := range files { - t, _ = loadFromFile(fname, name) - if t != nil { - break - } - } - if t != nil { - if t.Name != name { - // Check for a database loop (no infinite - // recursion). - dblock.Lock() - if aliases[name] != "" { - dblock.Unlock() - return nil, ErrTermNotFound - } - aliases[name] = t.Name - dblock.Unlock() - return LookupTerminfo(t.Name) - } - dblock.Lock() - terminfos[name] = t - dblock.Unlock() - } - } - // If the name ends in -truecolor, then fabricate an entry // from the corresponding -256color, -color, or bare terminal. if t == nil && strings.HasSuffix(name, "-truecolor") { diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_vt100.go b/vendor/github.com/gdamore/tcell/terminfo/v/vt100/term.go similarity index 91% rename from vendor/github.com/gdamore/tcell/terminfo/term_vt100.go rename to vendor/github.com/gdamore/tcell/terminfo/v/vt100/term.go index 8293cdaa..666e8b11 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_vt100.go +++ b/vendor/github.com/gdamore/tcell/terminfo/v/vt100/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package vt100 + +import "github.com/gdamore/tcell/terminfo" func init() { + // dec vt100 (w/advanced video) - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt100", Aliases: []string{"vt100-am"}, Columns: 80, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_vt102.go b/vendor/github.com/gdamore/tcell/terminfo/v/vt102/term.go similarity index 91% rename from vendor/github.com/gdamore/tcell/terminfo/term_vt102.go rename to vendor/github.com/gdamore/tcell/terminfo/v/vt102/term.go index 414d36b3..0dfbe61c 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_vt102.go +++ b/vendor/github.com/gdamore/tcell/terminfo/v/vt102/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package vt102 + +import "github.com/gdamore/tcell/terminfo" func init() { + // dec vt102 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt102", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_vt220.go b/vendor/github.com/gdamore/tcell/terminfo/v/vt220/term.go similarity index 93% rename from vendor/github.com/gdamore/tcell/terminfo/term_vt220.go rename to vendor/github.com/gdamore/tcell/terminfo/v/vt220/term.go index 5d0d7489..9104b173 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_vt220.go +++ b/vendor/github.com/gdamore/tcell/terminfo/v/vt220/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package vt220 + +import "github.com/gdamore/tcell/terminfo" func init() { + // dec vt220 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt220", Aliases: []string{"vt200"}, Columns: 80, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_vt320.go b/vendor/github.com/gdamore/tcell/terminfo/v/vt320/term.go similarity index 92% rename from vendor/github.com/gdamore/tcell/terminfo/term_vt320.go rename to vendor/github.com/gdamore/tcell/terminfo/v/vt320/term.go index 7832e082..29bd0d39 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_vt320.go +++ b/vendor/github.com/gdamore/tcell/terminfo/v/vt320/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package vt320 + +import "github.com/gdamore/tcell/terminfo" func init() { + // dec vt320 7 bit terminal - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt320", Aliases: []string{"vt300"}, Columns: 80, @@ -33,7 +36,7 @@ func init() { KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", + KeyBackspace: "\xff", KeyHome: "\x1b[1~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_vt400.go b/vendor/github.com/gdamore/tcell/terminfo/v/vt400/term.go similarity index 91% rename from vendor/github.com/gdamore/tcell/terminfo/term_vt400.go rename to vendor/github.com/gdamore/tcell/terminfo/v/vt400/term.go index 2a7cadad..4c7b8bc0 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_vt400.go +++ b/vendor/github.com/gdamore/tcell/terminfo/v/vt400/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package vt400 + +import "github.com/gdamore/tcell/terminfo" func init() { + // dec vt400 24x80 column autowrap - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt400", Aliases: []string{"vt400-24", "dec-vt400"}, Columns: 80, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_vt420.go b/vendor/github.com/gdamore/tcell/terminfo/v/vt420/term.go similarity index 92% rename from vendor/github.com/gdamore/tcell/terminfo/term_vt420.go rename to vendor/github.com/gdamore/tcell/terminfo/v/vt420/term.go index b8a4a1c2..5ec1cef7 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_vt420.go +++ b/vendor/github.com/gdamore/tcell/terminfo/v/vt420/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package vt420 + +import "github.com/gdamore/tcell/terminfo" func init() { + // DEC VT420 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt420", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_vt52.go b/vendor/github.com/gdamore/tcell/terminfo/v/vt52/term.go similarity index 84% rename from vendor/github.com/gdamore/tcell/terminfo/term_vt52.go rename to vendor/github.com/gdamore/tcell/terminfo/v/vt52/term.go index 2bf190b7..c9560aef 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_vt52.go +++ b/vendor/github.com/gdamore/tcell/terminfo/v/vt52/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package vt52 + +import "github.com/gdamore/tcell/terminfo" func init() { + // dec vt52 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt52", Columns: 80, Lines: 24, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_wy50.go b/vendor/github.com/gdamore/tcell/terminfo/w/wy50/term.go similarity index 93% rename from vendor/github.com/gdamore/tcell/terminfo/term_wy50.go rename to vendor/github.com/gdamore/tcell/terminfo/w/wy50/term.go index 022dda9d..4521932f 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_wy50.go +++ b/vendor/github.com/gdamore/tcell/terminfo/w/wy50/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package wy50 + +import "github.com/gdamore/tcell/terminfo" func init() { + // Wyse 50 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "wy50", Aliases: []string{"wyse50"}, Columns: 80, diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_wy60.go b/vendor/github.com/gdamore/tcell/terminfo/w/wy60/term.go similarity index 93% rename from vendor/github.com/gdamore/tcell/terminfo/term_wy60.go rename to vendor/github.com/gdamore/tcell/terminfo/w/wy60/term.go index a737bb85..ff519408 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_wy60.go +++ b/vendor/github.com/gdamore/tcell/terminfo/w/wy60/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package wy60 + +import "github.com/gdamore/tcell/terminfo" func init() { + // Wyse 60 - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "wy60", Aliases: []string{"wyse60"}, Columns: 80, diff --git a/vendor/github.com/gdamore/tcell/terminfo/w/wy99_ansi/term.go b/vendor/github.com/gdamore/tcell/terminfo/w/wy99_ansi/term.go new file mode 100644 index 00000000..fbe85699 --- /dev/null +++ b/vendor/github.com/gdamore/tcell/terminfo/w/wy99_ansi/term.go @@ -0,0 +1,114 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package wy99_ansi + +import "github.com/gdamore/tcell/terminfo" + +func init() { + + // Wyse WY-99GT in ansi mode (int'l PC keyboard) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "wy99-ansi", + Columns: 80, + Lines: 25, + Bell: "\a", + Clear: "\x1b[H\x1b[J$<200>", + ShowCursor: "\x1b[34h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f\x1b[\"q", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h", + ExitKeypad: "\x1b[?1l", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b$<1>", + CursorUp1: "\x1bM", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyBackspace: "\b", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[M", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF17: "\x1b[K", + KeyF18: "\x1b[31~", + KeyF19: "\x1b[32~", + KeyF20: "\x1b[33~", + KeyF21: "\x1b[34~", + KeyF22: "\x1b[35~", + KeyF23: "\x1b[1~", + KeyF24: "\x1b[2~", + KeyBacktab: "\x1b[z", + }) + + // Wyse WY-99GT in ansi mode (US PC keyboard) + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "wy99a-ansi", + Columns: 80, + Lines: 25, + Bell: "\a", + Clear: "\x1b[H\x1b[J$<200>", + ShowCursor: "\x1b[34h\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b[m\x0f\x1b[\"q", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h", + ExitKeypad: "\x1b[?1l", + PadChar: "\x00", + AltChars: "``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~", + EnterAcs: "\x0e", + ExitAcs: "\x0f", + EnableAcs: "\x1b)0", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b$<1>", + CursorUp1: "\x1bM", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyBackspace: "\b", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[M", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF17: "\x1b[K", + KeyF18: "\x1b[31~", + KeyF19: "\x1b[32~", + KeyF20: "\x1b[33~", + KeyF21: "\x1b[34~", + KeyF22: "\x1b[35~", + KeyF23: "\x1b[1~", + KeyF24: "\x1b[2~", + KeyBacktab: "\x1b[z", + }) +} diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_xfce.go b/vendor/github.com/gdamore/tcell/terminfo/x/xfce/term.go similarity index 97% rename from vendor/github.com/gdamore/tcell/terminfo/term_xfce.go rename to vendor/github.com/gdamore/tcell/terminfo/x/xfce/term.go index bb39be95..219cc6fd 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_xfce.go +++ b/vendor/github.com/gdamore/tcell/terminfo/x/xfce/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package xfce + +import "github.com/gdamore/tcell/terminfo" func init() { + // Xfce Terminal - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "xfce", Columns: 80, Lines: 24, @@ -40,7 +43,7 @@ func init() { KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", - KeyBackspace: "\u007f", + KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", diff --git a/vendor/github.com/gdamore/tcell/terminfo/term_xnuppc.go b/vendor/github.com/gdamore/tcell/terminfo/x/xnuppc/term.go similarity index 84% rename from vendor/github.com/gdamore/tcell/terminfo/term_xnuppc.go rename to vendor/github.com/gdamore/tcell/terminfo/x/xnuppc/term.go index b1dafd6b..b1f9ad78 100644 --- a/vendor/github.com/gdamore/tcell/terminfo/term_xnuppc.go +++ b/vendor/github.com/gdamore/tcell/terminfo/x/xnuppc/term.go @@ -1,10 +1,13 @@ // Generated automatically. DO NOT HAND-EDIT. -package terminfo +package xnuppc + +import "github.com/gdamore/tcell/terminfo" func init() { + // Darwin PowerPC Console (color) - AddTerminfo(&Terminfo{ + terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "xnuppc", Aliases: []string{"darwin"}, Colors: 8, @@ -26,6 +29,6 @@ func init() { KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", - KeyBackspace: "\u007f", + KeyBackspace: "\xff", }) } diff --git a/vendor/github.com/gdamore/tcell/terminfo/x/xterm/term.go b/vendor/github.com/gdamore/tcell/terminfo/x/xterm/term.go new file mode 100644 index 00000000..0e4c175f --- /dev/null +++ b/vendor/github.com/gdamore/tcell/terminfo/x/xterm/term.go @@ -0,0 +1,453 @@ +// Generated automatically. DO NOT HAND-EDIT. + +package xterm + +import "github.com/gdamore/tcell/terminfo" + +func init() { + + // X11 terminal emulator + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "xterm", + Aliases: []string{"xterm-debian"}, + Columns: 80, + Lines: 24, + Colors: 8, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h\x1b[22;0;0t", + ExitCA: "\x1b[?1049l\x1b[23;0;0t", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[3%p1%dm", + SetBg: "\x1b[4%p1%dm", + SetFgBg: "\x1b[3%p1%d;4%p2%dm", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[1;2P", + KeyF14: "\x1b[1;2Q", + KeyF15: "\x1b[1;2R", + KeyF16: "\x1b[1;2S", + KeyF17: "\x1b[15;2~", + KeyF18: "\x1b[17;2~", + KeyF19: "\x1b[18;2~", + KeyF20: "\x1b[19;2~", + KeyF21: "\x1b[20;2~", + KeyF22: "\x1b[21;2~", + KeyF23: "\x1b[23;2~", + KeyF24: "\x1b[24;2~", + KeyF25: "\x1b[1;5P", + KeyF26: "\x1b[1;5Q", + KeyF27: "\x1b[1;5R", + KeyF28: "\x1b[1;5S", + KeyF29: "\x1b[15;5~", + KeyF30: "\x1b[17;5~", + KeyF31: "\x1b[18;5~", + KeyF32: "\x1b[19;5~", + KeyF33: "\x1b[20;5~", + KeyF34: "\x1b[21;5~", + KeyF35: "\x1b[23;5~", + KeyF36: "\x1b[24;5~", + KeyF37: "\x1b[1;6P", + KeyF38: "\x1b[1;6Q", + KeyF39: "\x1b[1;6R", + KeyF40: "\x1b[1;6S", + KeyF41: "\x1b[15;6~", + KeyF42: "\x1b[17;6~", + KeyF43: "\x1b[18;6~", + KeyF44: "\x1b[19;6~", + KeyF45: "\x1b[20;6~", + KeyF46: "\x1b[21;6~", + KeyF47: "\x1b[23;6~", + KeyF48: "\x1b[24;6~", + KeyF49: "\x1b[1;3P", + KeyF50: "\x1b[1;3Q", + KeyF51: "\x1b[1;3R", + KeyF52: "\x1b[1;3S", + KeyF53: "\x1b[15;3~", + KeyF54: "\x1b[17;3~", + KeyF55: "\x1b[18;3~", + KeyF56: "\x1b[19;3~", + KeyF57: "\x1b[20;3~", + KeyF58: "\x1b[21;3~", + KeyF59: "\x1b[23;3~", + KeyF60: "\x1b[24;3~", + KeyF61: "\x1b[1;4P", + KeyF62: "\x1b[1;4Q", + KeyF63: "\x1b[1;4R", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[1;2D", + KeyShfRight: "\x1b[1;2C", + KeyShfUp: "\x1b[1;2A", + KeyShfDown: "\x1b[1;2B", + KeyCtrlLeft: "\x1b[1;5D", + KeyCtrlRight: "\x1b[1;5C", + KeyCtrlUp: "\x1b[1;5A", + KeyCtrlDown: "\x1b[1;5B", + KeyMetaLeft: "\x1b[1;9D", + KeyMetaRight: "\x1b[1;9C", + KeyMetaUp: "\x1b[1;9A", + KeyMetaDown: "\x1b[1;9B", + KeyAltLeft: "\x1b[1;3D", + KeyAltRight: "\x1b[1;3C", + KeyAltUp: "\x1b[1;3A", + KeyAltDown: "\x1b[1;3B", + KeyAltShfLeft: "\x1b[1;4D", + KeyAltShfRight: "\x1b[1;4C", + KeyAltShfUp: "\x1b[1;4A", + KeyAltShfDown: "\x1b[1;4B", + KeyMetaShfLeft: "\x1b[1;10D", + KeyMetaShfRight: "\x1b[1;10C", + KeyMetaShfUp: "\x1b[1;10A", + KeyMetaShfDown: "\x1b[1;10B", + KeyCtrlShfLeft: "\x1b[1;6D", + KeyCtrlShfRight: "\x1b[1;6C", + KeyCtrlShfUp: "\x1b[1;6A", + KeyCtrlShfDown: "\x1b[1;6B", + KeyShfHome: "\x1b[1;2H", + KeyShfEnd: "\x1b[1;2F", + KeyCtrlHome: "\x1b[1;5H", + KeyCtrlEnd: "\x1b[1;5F", + KeyAltHome: "\x1b[1;9H", + KeyAltEnd: "\x1b[1;9F", + KeyCtrlShfHome: "\x1b[1;6H", + KeyCtrlShfEnd: "\x1b[1;6F", + KeyMetaShfHome: "\x1b[1;10H", + KeyMetaShfEnd: "\x1b[1;10F", + KeyAltShfHome: "\x1b[1;4H", + KeyAltShfEnd: "\x1b[1;4F", + }) + + // xterm with 88 colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "xterm-88color", + Columns: 80, + Lines: 24, + Colors: 88, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h\x1b[22;0;0t", + ExitCA: "\x1b[?1049l\x1b[23;0;0t", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[1;2P", + KeyF14: "\x1b[1;2Q", + KeyF15: "\x1b[1;2R", + KeyF16: "\x1b[1;2S", + KeyF17: "\x1b[15;2~", + KeyF18: "\x1b[17;2~", + KeyF19: "\x1b[18;2~", + KeyF20: "\x1b[19;2~", + KeyF21: "\x1b[20;2~", + KeyF22: "\x1b[21;2~", + KeyF23: "\x1b[23;2~", + KeyF24: "\x1b[24;2~", + KeyF25: "\x1b[1;5P", + KeyF26: "\x1b[1;5Q", + KeyF27: "\x1b[1;5R", + KeyF28: "\x1b[1;5S", + KeyF29: "\x1b[15;5~", + KeyF30: "\x1b[17;5~", + KeyF31: "\x1b[18;5~", + KeyF32: "\x1b[19;5~", + KeyF33: "\x1b[20;5~", + KeyF34: "\x1b[21;5~", + KeyF35: "\x1b[23;5~", + KeyF36: "\x1b[24;5~", + KeyF37: "\x1b[1;6P", + KeyF38: "\x1b[1;6Q", + KeyF39: "\x1b[1;6R", + KeyF40: "\x1b[1;6S", + KeyF41: "\x1b[15;6~", + KeyF42: "\x1b[17;6~", + KeyF43: "\x1b[18;6~", + KeyF44: "\x1b[19;6~", + KeyF45: "\x1b[20;6~", + KeyF46: "\x1b[21;6~", + KeyF47: "\x1b[23;6~", + KeyF48: "\x1b[24;6~", + KeyF49: "\x1b[1;3P", + KeyF50: "\x1b[1;3Q", + KeyF51: "\x1b[1;3R", + KeyF52: "\x1b[1;3S", + KeyF53: "\x1b[15;3~", + KeyF54: "\x1b[17;3~", + KeyF55: "\x1b[18;3~", + KeyF56: "\x1b[19;3~", + KeyF57: "\x1b[20;3~", + KeyF58: "\x1b[21;3~", + KeyF59: "\x1b[23;3~", + KeyF60: "\x1b[24;3~", + KeyF61: "\x1b[1;4P", + KeyF62: "\x1b[1;4Q", + KeyF63: "\x1b[1;4R", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[1;2D", + KeyShfRight: "\x1b[1;2C", + KeyShfUp: "\x1b[1;2A", + KeyShfDown: "\x1b[1;2B", + KeyCtrlLeft: "\x1b[1;5D", + KeyCtrlRight: "\x1b[1;5C", + KeyCtrlUp: "\x1b[1;5A", + KeyCtrlDown: "\x1b[1;5B", + KeyMetaLeft: "\x1b[1;9D", + KeyMetaRight: "\x1b[1;9C", + KeyMetaUp: "\x1b[1;9A", + KeyMetaDown: "\x1b[1;9B", + KeyAltLeft: "\x1b[1;3D", + KeyAltRight: "\x1b[1;3C", + KeyAltUp: "\x1b[1;3A", + KeyAltDown: "\x1b[1;3B", + KeyAltShfLeft: "\x1b[1;4D", + KeyAltShfRight: "\x1b[1;4C", + KeyAltShfUp: "\x1b[1;4A", + KeyAltShfDown: "\x1b[1;4B", + KeyMetaShfLeft: "\x1b[1;10D", + KeyMetaShfRight: "\x1b[1;10C", + KeyMetaShfUp: "\x1b[1;10A", + KeyMetaShfDown: "\x1b[1;10B", + KeyCtrlShfLeft: "\x1b[1;6D", + KeyCtrlShfRight: "\x1b[1;6C", + KeyCtrlShfUp: "\x1b[1;6A", + KeyCtrlShfDown: "\x1b[1;6B", + KeyShfHome: "\x1b[1;2H", + KeyShfEnd: "\x1b[1;2F", + KeyCtrlHome: "\x1b[1;5H", + KeyCtrlEnd: "\x1b[1;5F", + KeyAltHome: "\x1b[1;9H", + KeyAltEnd: "\x1b[1;9F", + KeyCtrlShfHome: "\x1b[1;6H", + KeyCtrlShfEnd: "\x1b[1;6F", + KeyMetaShfHome: "\x1b[1;10H", + KeyMetaShfEnd: "\x1b[1;10F", + KeyAltShfHome: "\x1b[1;4H", + KeyAltShfEnd: "\x1b[1;4F", + }) + + // xterm with 256 colors + terminfo.AddTerminfo(&terminfo.Terminfo{ + Name: "xterm-256color", + Columns: 80, + Lines: 24, + Colors: 256, + Bell: "\a", + Clear: "\x1b[H\x1b[2J", + EnterCA: "\x1b[?1049h\x1b[22;0;0t", + ExitCA: "\x1b[?1049l\x1b[23;0;0t", + ShowCursor: "\x1b[?12l\x1b[?25h", + HideCursor: "\x1b[?25l", + AttrOff: "\x1b(B\x1b[m", + Underline: "\x1b[4m", + Bold: "\x1b[1m", + Dim: "\x1b[2m", + Blink: "\x1b[5m", + Reverse: "\x1b[7m", + EnterKeypad: "\x1b[?1h\x1b=", + ExitKeypad: "\x1b[?1l\x1b>", + SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", + AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", + EnterAcs: "\x1b(0", + ExitAcs: "\x1b(B", + Mouse: "\x1b[M", + MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", + SetCursor: "\x1b[%i%p1%d;%p2%dH", + CursorBack1: "\b", + CursorUp1: "\x1b[A", + KeyUp: "\x1bOA", + KeyDown: "\x1bOB", + KeyRight: "\x1bOC", + KeyLeft: "\x1bOD", + KeyInsert: "\x1b[2~", + KeyDelete: "\x1b[3~", + KeyBackspace: "\xff", + KeyHome: "\x1bOH", + KeyEnd: "\x1bOF", + KeyPgUp: "\x1b[5~", + KeyPgDn: "\x1b[6~", + KeyF1: "\x1bOP", + KeyF2: "\x1bOQ", + KeyF3: "\x1bOR", + KeyF4: "\x1bOS", + KeyF5: "\x1b[15~", + KeyF6: "\x1b[17~", + KeyF7: "\x1b[18~", + KeyF8: "\x1b[19~", + KeyF9: "\x1b[20~", + KeyF10: "\x1b[21~", + KeyF11: "\x1b[23~", + KeyF12: "\x1b[24~", + KeyF13: "\x1b[1;2P", + KeyF14: "\x1b[1;2Q", + KeyF15: "\x1b[1;2R", + KeyF16: "\x1b[1;2S", + KeyF17: "\x1b[15;2~", + KeyF18: "\x1b[17;2~", + KeyF19: "\x1b[18;2~", + KeyF20: "\x1b[19;2~", + KeyF21: "\x1b[20;2~", + KeyF22: "\x1b[21;2~", + KeyF23: "\x1b[23;2~", + KeyF24: "\x1b[24;2~", + KeyF25: "\x1b[1;5P", + KeyF26: "\x1b[1;5Q", + KeyF27: "\x1b[1;5R", + KeyF28: "\x1b[1;5S", + KeyF29: "\x1b[15;5~", + KeyF30: "\x1b[17;5~", + KeyF31: "\x1b[18;5~", + KeyF32: "\x1b[19;5~", + KeyF33: "\x1b[20;5~", + KeyF34: "\x1b[21;5~", + KeyF35: "\x1b[23;5~", + KeyF36: "\x1b[24;5~", + KeyF37: "\x1b[1;6P", + KeyF38: "\x1b[1;6Q", + KeyF39: "\x1b[1;6R", + KeyF40: "\x1b[1;6S", + KeyF41: "\x1b[15;6~", + KeyF42: "\x1b[17;6~", + KeyF43: "\x1b[18;6~", + KeyF44: "\x1b[19;6~", + KeyF45: "\x1b[20;6~", + KeyF46: "\x1b[21;6~", + KeyF47: "\x1b[23;6~", + KeyF48: "\x1b[24;6~", + KeyF49: "\x1b[1;3P", + KeyF50: "\x1b[1;3Q", + KeyF51: "\x1b[1;3R", + KeyF52: "\x1b[1;3S", + KeyF53: "\x1b[15;3~", + KeyF54: "\x1b[17;3~", + KeyF55: "\x1b[18;3~", + KeyF56: "\x1b[19;3~", + KeyF57: "\x1b[20;3~", + KeyF58: "\x1b[21;3~", + KeyF59: "\x1b[23;3~", + KeyF60: "\x1b[24;3~", + KeyF61: "\x1b[1;4P", + KeyF62: "\x1b[1;4Q", + KeyF63: "\x1b[1;4R", + KeyBacktab: "\x1b[Z", + KeyShfLeft: "\x1b[1;2D", + KeyShfRight: "\x1b[1;2C", + KeyShfUp: "\x1b[1;2A", + KeyShfDown: "\x1b[1;2B", + KeyCtrlLeft: "\x1b[1;5D", + KeyCtrlRight: "\x1b[1;5C", + KeyCtrlUp: "\x1b[1;5A", + KeyCtrlDown: "\x1b[1;5B", + KeyMetaLeft: "\x1b[1;9D", + KeyMetaRight: "\x1b[1;9C", + KeyMetaUp: "\x1b[1;9A", + KeyMetaDown: "\x1b[1;9B", + KeyAltLeft: "\x1b[1;3D", + KeyAltRight: "\x1b[1;3C", + KeyAltUp: "\x1b[1;3A", + KeyAltDown: "\x1b[1;3B", + KeyAltShfLeft: "\x1b[1;4D", + KeyAltShfRight: "\x1b[1;4C", + KeyAltShfUp: "\x1b[1;4A", + KeyAltShfDown: "\x1b[1;4B", + KeyMetaShfLeft: "\x1b[1;10D", + KeyMetaShfRight: "\x1b[1;10C", + KeyMetaShfUp: "\x1b[1;10A", + KeyMetaShfDown: "\x1b[1;10B", + KeyCtrlShfLeft: "\x1b[1;6D", + KeyCtrlShfRight: "\x1b[1;6C", + KeyCtrlShfUp: "\x1b[1;6A", + KeyCtrlShfDown: "\x1b[1;6B", + KeyShfHome: "\x1b[1;2H", + KeyShfEnd: "\x1b[1;2F", + KeyCtrlHome: "\x1b[1;5H", + KeyCtrlEnd: "\x1b[1;5F", + KeyAltHome: "\x1b[1;9H", + KeyAltEnd: "\x1b[1;9F", + KeyCtrlShfHome: "\x1b[1;6H", + KeyCtrlShfEnd: "\x1b[1;6F", + KeyMetaShfHome: "\x1b[1;10H", + KeyMetaShfEnd: "\x1b[1;10F", + KeyAltShfHome: "\x1b[1;4H", + KeyAltShfEnd: "\x1b[1;4F", + }) +} diff --git a/vendor/github.com/gdamore/tcell/tscreen.go b/vendor/github.com/gdamore/tcell/tscreen.go index 4c518f9b..76f17c96 100644 --- a/vendor/github.com/gdamore/tcell/tscreen.go +++ b/vendor/github.com/gdamore/tcell/tscreen.go @@ -27,6 +27,9 @@ import ( "github.com/gdamore/tcell/terminfo" "github.com/gdamore/tcell/terminfo/dynamic" + + // import the stock terminals + _ "github.com/gdamore/tcell/terminfo/base" ) // NewTerminfoScreen returns a Screen that uses the stock TTY interface @@ -99,7 +102,6 @@ type tScreen struct { cursorx int cursory int tiosp *termiosPrivate - baud int wasbtn bool acs map[rune]string charset string @@ -672,9 +674,9 @@ func (t *tScreen) writeString(s string) { func (t *tScreen) TPuts(s string) { if t.buffering { - t.ti.TPuts(&t.buf, s, t.baud) + t.ti.TPuts(&t.buf, s) } else { - t.ti.TPuts(t.out, s, t.baud) + t.ti.TPuts(t.out, s) } } diff --git a/vendor/github.com/gdamore/tcell/tscreen_bsd.go b/vendor/github.com/gdamore/tcell/tscreen_bsd.go index 86d749b7..25137165 100644 --- a/vendor/github.com/gdamore/tcell/tscreen_bsd.go +++ b/vendor/github.com/gdamore/tcell/tscreen_bsd.go @@ -1,6 +1,6 @@ // +build freebsd netbsd openbsd dragonfly -// Copyright 2018 The TCell Authors +// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. @@ -48,9 +48,6 @@ func (t *tScreen) termioInit() error { goto failed } - // On this platform (FreeBSD and family), the baud rate is stored - // directly as an integer in termios.c_ospeed. No bitmasking required. - t.baud = int(t.tiosp.Ospeed) newtios = *t.tiosp newtios.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | diff --git a/vendor/github.com/gdamore/tcell/tscreen_darwin.go b/vendor/github.com/gdamore/tcell/tscreen_darwin.go index df51cb5f..6ee5fd5e 100644 --- a/vendor/github.com/gdamore/tcell/tscreen_darwin.go +++ b/vendor/github.com/gdamore/tcell/tscreen_darwin.go @@ -1,6 +1,6 @@ // +build darwin -// Copyright 2018 The TCell Authors +// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. @@ -63,9 +63,6 @@ func (t *tScreen) termioInit() error { goto failed } - // On this platform (FreeBSD and family), the baud rate is stored - // directly as an integer in termios.c_ospeed. No bitmasking required. - t.baud = int(t.tiosp.Ospeed) newtios = *t.tiosp newtios.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | diff --git a/vendor/github.com/gdamore/tcell/tscreen_linux.go b/vendor/github.com/gdamore/tcell/tscreen_linux.go index 84b9858a..19e58d60 100644 --- a/vendor/github.com/gdamore/tcell/tscreen_linux.go +++ b/vendor/github.com/gdamore/tcell/tscreen_linux.go @@ -28,88 +28,6 @@ type termiosPrivate struct { tio *unix.Termios } -// Linux is a little weird, in that it supports the ospeed and -// ispeed fields for most architectures, which can be set to nearly -// any valid value. However, for some (e.g. MIPS) it does not have -// those fields. In all cases it also uses the old BXXX values -// and attempts to find the closest match unless something different -// was specified by the application. Since we can't rely on -// ospeed or ispeed everywhere, we settle for the legacy method. -// (Alternatively we could have different versions of this for -// different CPU architectures, but that's no fun either.) -func getbaud(tios *unix.Termios) int { - bval := tios.Cflag & unix.CBAUD - - // This gives us the appropriate BXXX value, so convert. - // Note that if we ever have SPARC on Linux, it will need - // a different set of values. - switch bval { - case unix.B0: - return 0 - case unix.B50: - return 50 - case unix.B75: - return 75 - case unix.B110: - return 110 - case unix.B134: - return 134 - case unix.B150: - return 150 - case unix.B200: - return 200 - case unix.B300: - return 300 - case unix.B600: - return 600 - case unix.B1200: - return 1200 - case unix.B1800: - return 1800 - case unix.B2400: - return 2400 - case unix.B4800: - return 4800 - case unix.B9600: - return 9600 - case unix.B19200: - return 19200 - case unix.B38400: - return 38400 - case unix.B57600: - return 57600 - case unix.B115200: - return 115200 - case unix.B230400: - return 230400 - case unix.B460800: - return 460800 - case unix.B500000: - return 500000 - case unix.B576000: - return 576000 - case unix.B921600: - return 921600 - case unix.B1000000: - return 1000000 - case unix.B1152000: - return 1152000 - case unix.B1500000: - return 1500000 - case unix.B2000000: - return 2000000 - case unix.B2500000: - return 2500000 - case unix.B3000000: - return 3000000 - case unix.B3500000: - return 3500000 - case unix.B4000000: - return 4000000 - } - return 0 -} - func (t *tScreen) termioInit() error { var e error var raw *unix.Termios @@ -128,7 +46,6 @@ func (t *tScreen) termioInit() error { } t.tiosp = &termiosPrivate{tio: tio} - t.baud = getbaud(tio) // make a local copy, to make it raw raw = &unix.Termios{ @@ -150,8 +67,8 @@ func (t *tScreen) termioInit() error { // use non-blocking reads, but now a separate input loop and timer // copes with the problems we had on some systems (BSD/Darwin) // where close hung forever. - raw.Cc[syscall.VMIN] = 1 - raw.Cc[syscall.VTIME] = 0 + raw.Cc[unix.VMIN] = 1 + raw.Cc[unix.VTIME] = 0 e = unix.IoctlSetTermios(int(t.out.Fd()), unix.TCSETS, raw) if e != nil { diff --git a/vendor/github.com/gdamore/tcell/tscreen_solaris.go b/vendor/github.com/gdamore/tcell/tscreen_solaris.go index 185be3f6..9fa48b85 100644 --- a/vendor/github.com/gdamore/tcell/tscreen_solaris.go +++ b/vendor/github.com/gdamore/tcell/tscreen_solaris.go @@ -1,6 +1,6 @@ // +build solaris -// Copyright 2017 The TCell Authors +// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. @@ -28,76 +28,6 @@ type termiosPrivate struct { tio *unix.Termios } -const ( - // These are for missing CBAUDEXT and CIBAUDEXT. - // The values are fixed for Solaris and illumos, and cannot ever - // change without breaking applications. - cBaudExt = 0x200000 - ciBaudExt = 0x400000 -) - -// getbaud is sort of cfgetospeed, but in Go. -func getbaud(tios *unix.Termios) int { - // First we mask off the rate by looking at the Cflag. - bval := tios.Cflag & unix.CBAUD - if (tios.Cflag & cBaudExt) != 0 { - bval += unix.CBAUD + 1 - } - - // This gives us the appropriate BXXX value, so convert - switch bval { - case unix.B0: - return 0 - case unix.B50: - return 50 - case unix.B75: - return 75 - case unix.B110: - return 110 - case unix.B134: - return 134 - case unix.B150: - return 150 - case unix.B200: - return 200 - case unix.B300: - return 300 - case unix.B600: - return 600 - case unix.B1200: - return 1200 - case unix.B1800: - return 1800 - case unix.B2400: - return 2400 - case unix.B4800: - return 4800 - case unix.B9600: - return 9600 - case unix.B19200: - return 19200 - case unix.B38400: - return 38400 - case unix.B57600: - return 57600 - case unix.B76800: - return 76800 - case unix.B115200: - return 115200 - case unix.B153600: - return 153600 - case unix.B230400: - return 230400 - case unix.B307200: - return 307200 - case unix.B460800: - return 460800 - case unix.B921600: - return 921600 - } - return 0 -} - func (t *tScreen) termioInit() error { var e error var raw *unix.Termios @@ -116,7 +46,6 @@ func (t *tScreen) termioInit() error { } t.tiosp = &termiosPrivate{tio: tio} - t.baud = getbaud(tio) // make a local copy, to make it raw raw = &unix.Termios{ diff --git a/vendor/github.com/gogo/protobuf/proto/lib.go b/vendor/github.com/gogo/protobuf/proto/lib.go index d17f8020..80db1c15 100644 --- a/vendor/github.com/gogo/protobuf/proto/lib.go +++ b/vendor/github.com/gogo/protobuf/proto/lib.go @@ -948,13 +948,19 @@ func isProto3Zero(v reflect.Value) bool { return false } -// ProtoPackageIsVersion2 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const GoGoProtoPackageIsVersion2 = true +const ( + // ProtoPackageIsVersion3 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + GoGoProtoPackageIsVersion3 = true -// ProtoPackageIsVersion1 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const GoGoProtoPackageIsVersion1 = true + // ProtoPackageIsVersion2 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + GoGoProtoPackageIsVersion2 = true + + // ProtoPackageIsVersion1 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + GoGoProtoPackageIsVersion1 = true +) // InternalMessageInfo is a type used internally by generated .pb.go files. // This type is not intended to be used by non-generated code. diff --git a/vendor/github.com/gogo/protobuf/proto/properties.go b/vendor/github.com/gogo/protobuf/proto/properties.go index c9e5fa02..62c55624 100644 --- a/vendor/github.com/gogo/protobuf/proto/properties.go +++ b/vendor/github.com/gogo/protobuf/proto/properties.go @@ -400,6 +400,15 @@ func GetProperties(t reflect.Type) *StructProperties { return sprop } +type ( + oneofFuncsIface interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + oneofWrappersIface interface { + XXX_OneofWrappers() []interface{} + } +) + // getPropertiesLocked requires that propertiesMu is held. func getPropertiesLocked(t reflect.Type) *StructProperties { if prop, ok := propertiesMap[t]; ok { @@ -441,37 +450,40 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { // Re-order prop.order. sort.Sort(prop) - type oneofMessage interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) - } - if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); isOneofMessage && ok { + if isOneofMessage { var oots []interface{} - _, _, _, oots = om.XXX_OneofFuncs() - - // Interpret oneof metadata. - prop.OneofTypes = make(map[string]*OneofProperties) - for _, oot := range oots { - oop := &OneofProperties{ - Type: reflect.ValueOf(oot).Type(), // *T - Prop: new(Properties), - } - sft := oop.Type.Elem().Field(0) - oop.Prop.Name = sft.Name - oop.Prop.Parse(sft.Tag.Get("protobuf")) - // There will be exactly one interface field that - // this new value is assignable to. - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if f.Type.Kind() != reflect.Interface { - continue + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oots = m.XXX_OneofFuncs() + case oneofWrappersIface: + oots = m.XXX_OneofWrappers() + } + if len(oots) > 0 { + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), } - if !oop.Type.AssignableTo(f.Type) { - continue + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break } - oop.Field = i - break + prop.OneofTypes[oop.Prop.OrigName] = oop } - prop.OneofTypes[oop.Prop.OrigName] = oop } } diff --git a/vendor/github.com/gogo/protobuf/proto/table_marshal.go b/vendor/github.com/gogo/protobuf/proto/table_marshal.go index 9b1538d0..db9927a0 100644 --- a/vendor/github.com/gogo/protobuf/proto/table_marshal.go +++ b/vendor/github.com/gogo/protobuf/proto/table_marshal.go @@ -389,8 +389,13 @@ func (u *marshalInfo) computeMarshalInfo() { // get oneof implementers var oneofImplementers []interface{} // gogo: isOneofMessage is needed for embedded oneof messages, without a marshaler and unmarshaler - if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok && isOneofMessage { - _, _, _, oneofImplementers = m.XXX_OneofFuncs() + if isOneofMessage { + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } } // normal fields @@ -519,10 +524,6 @@ func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofI } } -type oneofMessage interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) -} - // wiretype returns the wire encoding of the type. func wiretype(encoding string) uint64 { switch encoding { diff --git a/vendor/github.com/gogo/protobuf/proto/table_merge.go b/vendor/github.com/gogo/protobuf/proto/table_merge.go index f520106e..60dcf70d 100644 --- a/vendor/github.com/gogo/protobuf/proto/table_merge.go +++ b/vendor/github.com/gogo/protobuf/proto/table_merge.go @@ -530,6 +530,25 @@ func (mi *mergeInfo) computeMergeInfo() { } case reflect.Struct: switch { + case isSlice && !isPointer: // E.g. []pb.T + mergeInfo := getMergeInfo(tf) + zero := reflect.Zero(tf) + mfi.merge = func(dst, src pointer) { + // TODO: Make this faster? + dstsp := dst.asPointerTo(f.Type) + dsts := dstsp.Elem() + srcs := src.asPointerTo(f.Type).Elem() + for i := 0; i < srcs.Len(); i++ { + dsts = reflect.Append(dsts, zero) + srcElement := srcs.Index(i).Addr() + dstElement := dsts.Index(dsts.Len() - 1).Addr() + mergeInfo.merge(valToPointer(dstElement), valToPointer(srcElement)) + } + if dsts.IsNil() { + dsts = reflect.MakeSlice(f.Type, 0, 0) + } + dstsp.Elem().Set(dsts) + } case !isPointer: mergeInfo := getMergeInfo(tf) mfi.merge = func(dst, src pointer) { diff --git a/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go index bb2622f2..93722938 100644 --- a/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go +++ b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go @@ -371,15 +371,18 @@ func (u *unmarshalInfo) computeUnmarshalInfo() { } // Find any types associated with oneof fields. - // TODO: XXX_OneofFuncs returns more info than we need. Get rid of some of it? - fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("XXX_OneofFuncs") // gogo: len(oneofFields) > 0 is needed for embedded oneof messages, without a marshaler and unmarshaler - if fn.IsValid() && len(oneofFields) > 0 { - res := fn.Call(nil)[3] // last return value from XXX_OneofFuncs: []interface{} - for i := res.Len() - 1; i >= 0; i-- { - v := res.Index(i) // interface{} - tptr := reflect.ValueOf(v.Interface()).Type() // *Msg_X - typ := tptr.Elem() // Msg_X + if len(oneofFields) > 0 { + var oneofImplementers []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + for _, v := range oneofImplementers { + tptr := reflect.TypeOf(v) // *Msg_X + typ := tptr.Elem() // Msg_X f := typ.Field(0) // oneof implementers have one field baseUnmarshal := fieldUnmarshaler(&f) @@ -407,11 +410,12 @@ func (u *unmarshalInfo) computeUnmarshalInfo() { u.setTag(fieldNum, of.field, unmarshal, 0, name) } } + } } // Get extension ranges, if any. - fn = reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") + fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") if fn.IsValid() { if !u.extensions.IsValid() && !u.oldExtensions.IsValid() && !u.bytesExtensions.IsValid() { panic("a message with extensions, but no extensions field in " + t.Name()) diff --git a/vendor/github.com/golang/groupcache/LICENSE b/vendor/github.com/golang/groupcache/LICENSE new file mode 100644 index 00000000..37ec93a1 --- /dev/null +++ b/vendor/github.com/golang/groupcache/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/golang/groupcache/lru/lru.go b/vendor/github.com/golang/groupcache/lru/lru.go new file mode 100644 index 00000000..eac1c766 --- /dev/null +++ b/vendor/github.com/golang/groupcache/lru/lru.go @@ -0,0 +1,133 @@ +/* +Copyright 2013 Google Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package lru implements an LRU cache. +package lru + +import "container/list" + +// Cache is an LRU cache. It is not safe for concurrent access. +type Cache struct { + // MaxEntries is the maximum number of cache entries before + // an item is evicted. Zero means no limit. + MaxEntries int + + // OnEvicted optionally specifies a callback function to be + // executed when an entry is purged from the cache. + OnEvicted func(key Key, value interface{}) + + ll *list.List + cache map[interface{}]*list.Element +} + +// A Key may be any value that is comparable. See http://golang.org/ref/spec#Comparison_operators +type Key interface{} + +type entry struct { + key Key + value interface{} +} + +// New creates a new Cache. +// If maxEntries is zero, the cache has no limit and it's assumed +// that eviction is done by the caller. +func New(maxEntries int) *Cache { + return &Cache{ + MaxEntries: maxEntries, + ll: list.New(), + cache: make(map[interface{}]*list.Element), + } +} + +// Add adds a value to the cache. +func (c *Cache) Add(key Key, value interface{}) { + if c.cache == nil { + c.cache = make(map[interface{}]*list.Element) + c.ll = list.New() + } + if ee, ok := c.cache[key]; ok { + c.ll.MoveToFront(ee) + ee.Value.(*entry).value = value + return + } + ele := c.ll.PushFront(&entry{key, value}) + c.cache[key] = ele + if c.MaxEntries != 0 && c.ll.Len() > c.MaxEntries { + c.RemoveOldest() + } +} + +// Get looks up a key's value from the cache. +func (c *Cache) Get(key Key) (value interface{}, ok bool) { + if c.cache == nil { + return + } + if ele, hit := c.cache[key]; hit { + c.ll.MoveToFront(ele) + return ele.Value.(*entry).value, true + } + return +} + +// Remove removes the provided key from the cache. +func (c *Cache) Remove(key Key) { + if c.cache == nil { + return + } + if ele, hit := c.cache[key]; hit { + c.removeElement(ele) + } +} + +// RemoveOldest removes the oldest item from the cache. +func (c *Cache) RemoveOldest() { + if c.cache == nil { + return + } + ele := c.ll.Back() + if ele != nil { + c.removeElement(ele) + } +} + +func (c *Cache) removeElement(e *list.Element) { + c.ll.Remove(e) + kv := e.Value.(*entry) + delete(c.cache, kv.key) + if c.OnEvicted != nil { + c.OnEvicted(kv.key, kv.value) + } +} + +// Len returns the number of items in the cache. +func (c *Cache) Len() int { + if c.cache == nil { + return 0 + } + return c.ll.Len() +} + +// Clear purges all stored items from the cache. +func (c *Cache) Clear() { + if c.OnEvicted != nil { + for _, e := range c.cache { + kv := e.Value.(*entry) + c.OnEvicted(kv.key, kv.value) + } + } + c.ll = nil + c.cache = nil +} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go index 79668ff5..a4b8c0cd 100644 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ b/vendor/github.com/golang/protobuf/proto/properties.go @@ -38,7 +38,6 @@ package proto import ( "fmt" "log" - "os" "reflect" "sort" "strconv" @@ -194,7 +193,7 @@ func (p *Properties) Parse(s string) { // "bytes,49,opt,name=foo,def=hello!" fields := strings.Split(s, ",") // breaks def=, but handled below. if len(fields) < 2 { - fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) + log.Printf("proto: tag has too few fields: %q", s) return } @@ -214,7 +213,7 @@ func (p *Properties) Parse(s string) { p.WireType = WireBytes // no numeric converter for non-numeric types default: - fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) + log.Printf("proto: tag has unknown wire type: %q", s) return } diff --git a/vendor/github.com/google/go-github/v26/github/gen-accessors.go b/vendor/github.com/google/go-github/v26/github/gen-accessors.go deleted file mode 100644 index 4c5e8eec..00000000 --- a/vendor/github.com/google/go-github/v26/github/gen-accessors.go +++ /dev/null @@ -1,333 +0,0 @@ -// Copyright 2017 The go-github AUTHORS. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// gen-accessors generates accessor methods for structs with pointer fields. -// -// It is meant to be used by go-github contributors in conjunction with the -// go generate tool before sending a PR to GitHub. -// Please see the CONTRIBUTING.md file for more information. -package main - -import ( - "bytes" - "flag" - "fmt" - "go/ast" - "go/format" - "go/parser" - "go/token" - "io/ioutil" - "log" - "os" - "sort" - "strings" - "text/template" -) - -const ( - fileSuffix = "-accessors.go" -) - -var ( - verbose = flag.Bool("v", false, "Print verbose log messages") - - sourceTmpl = template.Must(template.New("source").Parse(source)) - - // blacklistStructMethod lists "struct.method" combos to skip. - blacklistStructMethod = map[string]bool{ - "RepositoryContent.GetContent": true, - "Client.GetBaseURL": true, - "Client.GetUploadURL": true, - "ErrorResponse.GetResponse": true, - "RateLimitError.GetResponse": true, - "AbuseRateLimitError.GetResponse": true, - } - // blacklistStruct lists structs to skip. - blacklistStruct = map[string]bool{ - "Client": true, - } -) - -func logf(fmt string, args ...interface{}) { - if *verbose { - log.Printf(fmt, args...) - } -} - -func main() { - flag.Parse() - fset := token.NewFileSet() - - pkgs, err := parser.ParseDir(fset, ".", sourceFilter, 0) - if err != nil { - log.Fatal(err) - return - } - - for pkgName, pkg := range pkgs { - t := &templateData{ - filename: pkgName + fileSuffix, - Year: 2017, - Package: pkgName, - Imports: map[string]string{}, - } - for filename, f := range pkg.Files { - logf("Processing %v...", filename) - if err := t.processAST(f); err != nil { - log.Fatal(err) - } - } - if err := t.dump(); err != nil { - log.Fatal(err) - } - } - logf("Done.") -} - -func (t *templateData) processAST(f *ast.File) error { - for _, decl := range f.Decls { - gd, ok := decl.(*ast.GenDecl) - if !ok { - continue - } - for _, spec := range gd.Specs { - ts, ok := spec.(*ast.TypeSpec) - if !ok { - continue - } - // Skip unexported identifiers. - if !ts.Name.IsExported() { - logf("Struct %v is unexported; skipping.", ts.Name) - continue - } - // Check if the struct is blacklisted. - if blacklistStruct[ts.Name.Name] { - logf("Struct %v is blacklisted; skipping.", ts.Name) - continue - } - st, ok := ts.Type.(*ast.StructType) - if !ok { - continue - } - for _, field := range st.Fields.List { - se, ok := field.Type.(*ast.StarExpr) - if len(field.Names) == 0 || !ok { - continue - } - - fieldName := field.Names[0] - // Skip unexported identifiers. - if !fieldName.IsExported() { - logf("Field %v is unexported; skipping.", fieldName) - continue - } - // Check if "struct.method" is blacklisted. - if key := fmt.Sprintf("%v.Get%v", ts.Name, fieldName); blacklistStructMethod[key] { - logf("Method %v is blacklisted; skipping.", key) - continue - } - - switch x := se.X.(type) { - case *ast.ArrayType: - t.addArrayType(x, ts.Name.String(), fieldName.String()) - case *ast.Ident: - t.addIdent(x, ts.Name.String(), fieldName.String()) - case *ast.MapType: - t.addMapType(x, ts.Name.String(), fieldName.String()) - case *ast.SelectorExpr: - t.addSelectorExpr(x, ts.Name.String(), fieldName.String()) - default: - logf("processAST: type %q, field %q, unknown %T: %+v", ts.Name, fieldName, x, x) - } - } - } - } - return nil -} - -func sourceFilter(fi os.FileInfo) bool { - return !strings.HasSuffix(fi.Name(), "_test.go") && !strings.HasSuffix(fi.Name(), fileSuffix) -} - -func (t *templateData) dump() error { - if len(t.Getters) == 0 { - logf("No getters for %v; skipping.", t.filename) - return nil - } - - // Sort getters by ReceiverType.FieldName. - sort.Sort(byName(t.Getters)) - - var buf bytes.Buffer - if err := sourceTmpl.Execute(&buf, t); err != nil { - return err - } - clean, err := format.Source(buf.Bytes()) - if err != nil { - return err - } - - logf("Writing %v...", t.filename) - return ioutil.WriteFile(t.filename, clean, 0644) -} - -func newGetter(receiverType, fieldName, fieldType, zeroValue string, namedStruct bool) *getter { - return &getter{ - sortVal: strings.ToLower(receiverType) + "." + strings.ToLower(fieldName), - ReceiverVar: strings.ToLower(receiverType[:1]), - ReceiverType: receiverType, - FieldName: fieldName, - FieldType: fieldType, - ZeroValue: zeroValue, - NamedStruct: namedStruct, - } -} - -func (t *templateData) addArrayType(x *ast.ArrayType, receiverType, fieldName string) { - var eltType string - switch elt := x.Elt.(type) { - case *ast.Ident: - eltType = elt.String() - default: - logf("addArrayType: type %q, field %q: unknown elt type: %T %+v; skipping.", receiverType, fieldName, elt, elt) - return - } - - t.Getters = append(t.Getters, newGetter(receiverType, fieldName, "[]"+eltType, "nil", false)) -} - -func (t *templateData) addIdent(x *ast.Ident, receiverType, fieldName string) { - var zeroValue string - var namedStruct = false - switch x.String() { - case "int", "int64": - zeroValue = "0" - case "string": - zeroValue = `""` - case "bool": - zeroValue = "false" - case "Timestamp": - zeroValue = "Timestamp{}" - default: - zeroValue = "nil" - namedStruct = true - } - - t.Getters = append(t.Getters, newGetter(receiverType, fieldName, x.String(), zeroValue, namedStruct)) -} - -func (t *templateData) addMapType(x *ast.MapType, receiverType, fieldName string) { - var keyType string - switch key := x.Key.(type) { - case *ast.Ident: - keyType = key.String() - default: - logf("addMapType: type %q, field %q: unknown key type: %T %+v; skipping.", receiverType, fieldName, key, key) - return - } - - var valueType string - switch value := x.Value.(type) { - case *ast.Ident: - valueType = value.String() - default: - logf("addMapType: type %q, field %q: unknown value type: %T %+v; skipping.", receiverType, fieldName, value, value) - return - } - - fieldType := fmt.Sprintf("map[%v]%v", keyType, valueType) - zeroValue := fmt.Sprintf("map[%v]%v{}", keyType, valueType) - t.Getters = append(t.Getters, newGetter(receiverType, fieldName, fieldType, zeroValue, false)) -} - -func (t *templateData) addSelectorExpr(x *ast.SelectorExpr, receiverType, fieldName string) { - if strings.ToLower(fieldName[:1]) == fieldName[:1] { // Non-exported field. - return - } - - var xX string - if xx, ok := x.X.(*ast.Ident); ok { - xX = xx.String() - } - - switch xX { - case "time", "json": - if xX == "json" { - t.Imports["encoding/json"] = "encoding/json" - } else { - t.Imports[xX] = xX - } - fieldType := fmt.Sprintf("%v.%v", xX, x.Sel.Name) - zeroValue := fmt.Sprintf("%v.%v{}", xX, x.Sel.Name) - if xX == "time" && x.Sel.Name == "Duration" { - zeroValue = "0" - } - t.Getters = append(t.Getters, newGetter(receiverType, fieldName, fieldType, zeroValue, false)) - default: - logf("addSelectorExpr: xX %q, type %q, field %q: unknown x=%+v; skipping.", xX, receiverType, fieldName, x) - } -} - -type templateData struct { - filename string - Year int - Package string - Imports map[string]string - Getters []*getter -} - -type getter struct { - sortVal string // Lower-case version of "ReceiverType.FieldName". - ReceiverVar string // The one-letter variable name to match the ReceiverType. - ReceiverType string - FieldName string - FieldType string - ZeroValue string - NamedStruct bool // Getter for named struct. -} - -type byName []*getter - -func (b byName) Len() int { return len(b) } -func (b byName) Less(i, j int) bool { return b[i].sortVal < b[j].sortVal } -func (b byName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } - -const source = `// Copyright {{.Year}} The go-github AUTHORS. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by gen-accessors; DO NOT EDIT. - -package {{.Package}} -{{with .Imports}} -import ( - {{- range . -}} - "{{.}}" - {{end -}} -) -{{end}} -{{range .Getters}} -{{if .NamedStruct}} -// Get{{.FieldName}} returns the {{.FieldName}} field. -func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() *{{.FieldType}} { - if {{.ReceiverVar}} == nil { - return {{.ZeroValue}} - } - return {{.ReceiverVar}}.{{.FieldName}} -} -{{else}} -// Get{{.FieldName}} returns the {{.FieldName}} field if it's non-nil, zero value otherwise. -func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() {{.FieldType}} { - if {{.ReceiverVar}} == nil || {{.ReceiverVar}}.{{.FieldName}} == nil { - return {{.ZeroValue}} - } - return *{{.ReceiverVar}}.{{.FieldName}} -} -{{end}} -{{end}} -` diff --git a/vendor/github.com/google/go-github/v26/github/gen-stringify-test.go b/vendor/github.com/google/go-github/v26/github/gen-stringify-test.go deleted file mode 100644 index 7803801e..00000000 --- a/vendor/github.com/google/go-github/v26/github/gen-stringify-test.go +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright 2019 The go-github AUTHORS. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// gen-stringify-test generates test methods to test the String methods. -// -// These tests eliminate most of the code coverage problems so that real -// code coverage issues can be more readily identified. -// -// It is meant to be used by go-github contributors in conjunction with the -// go generate tool before sending a PR to GitHub. -// Please see the CONTRIBUTING.md file for more information. -package main - -import ( - "bytes" - "flag" - "fmt" - "go/ast" - "go/format" - "go/parser" - "go/token" - "io/ioutil" - "log" - "os" - "strings" - "text/template" -) - -const ( - ignoreFilePrefix1 = "gen-" - ignoreFilePrefix2 = "github-" - outputFileSuffix = "-stringify_test.go" -) - -var ( - verbose = flag.Bool("v", false, "Print verbose log messages") - - // blacklistStructMethod lists "struct.method" combos to skip. - blacklistStructMethod = map[string]bool{} - // blacklistStruct lists structs to skip. - blacklistStruct = map[string]bool{ - "RateLimits": true, - } - - funcMap = template.FuncMap{ - "isNotLast": func(index int, slice []*structField) string { - if index+1 < len(slice) { - return ", " - } - return "" - }, - "processZeroValue": func(v string) string { - switch v { - case "Bool(false)": - return "false" - case "Float64(0.0)": - return "0" - case "0", "Int(0)", "Int64(0)": - return "0" - case `""`, `String("")`: - return `""` - case "Timestamp{}", "&Timestamp{}": - return "github.Timestamp{0001-01-01 00:00:00 +0000 UTC}" - case "nil": - return "map[]" - } - log.Fatalf("Unhandled zero value: %q", v) - return "" - }, - } - - sourceTmpl = template.Must(template.New("source").Funcs(funcMap).Parse(source)) -) - -func main() { - flag.Parse() - fset := token.NewFileSet() - - pkgs, err := parser.ParseDir(fset, ".", sourceFilter, 0) - if err != nil { - log.Fatal(err) - return - } - - for pkgName, pkg := range pkgs { - t := &templateData{ - filename: pkgName + outputFileSuffix, - Year: 2019, // No need to change this once set (even in following years). - Package: pkgName, - Imports: map[string]string{"testing": "testing"}, - StringFuncs: map[string]bool{}, - StructFields: map[string][]*structField{}, - } - for filename, f := range pkg.Files { - logf("Processing %v...", filename) - if err := t.processAST(f); err != nil { - log.Fatal(err) - } - } - if err := t.dump(); err != nil { - log.Fatal(err) - } - } - logf("Done.") -} - -func sourceFilter(fi os.FileInfo) bool { - return !strings.HasSuffix(fi.Name(), "_test.go") && - !strings.HasPrefix(fi.Name(), ignoreFilePrefix1) && - !strings.HasPrefix(fi.Name(), ignoreFilePrefix2) -} - -type templateData struct { - filename string - Year int - Package string - Imports map[string]string - StringFuncs map[string]bool - StructFields map[string][]*structField -} - -type structField struct { - sortVal string // Lower-case version of "ReceiverType.FieldName". - ReceiverVar string // The one-letter variable name to match the ReceiverType. - ReceiverType string - FieldName string - FieldType string - ZeroValue string - NamedStruct bool // Getter for named struct. -} - -func (t *templateData) processAST(f *ast.File) error { - for _, decl := range f.Decls { - fn, ok := decl.(*ast.FuncDecl) - if ok { - if fn.Recv != nil && len(fn.Recv.List) > 0 { - id, ok := fn.Recv.List[0].Type.(*ast.Ident) - if ok && fn.Name.Name == "String" { - logf("Got FuncDecl: Name=%q, id.Name=%#v", fn.Name.Name, id.Name) - t.StringFuncs[id.Name] = true - } else { - logf("Ignoring FuncDecl: Name=%q, Type=%T", fn.Name.Name, fn.Recv.List[0].Type) - } - } else { - logf("Ignoring FuncDecl: Name=%q, fn=%#v", fn.Name.Name, fn) - } - continue - } - - gd, ok := decl.(*ast.GenDecl) - if !ok { - logf("Ignoring AST decl type %T", decl) - continue - } - for _, spec := range gd.Specs { - ts, ok := spec.(*ast.TypeSpec) - if !ok { - continue - } - // Skip unexported identifiers. - if !ts.Name.IsExported() { - logf("Struct %v is unexported; skipping.", ts.Name) - continue - } - // Check if the struct is blacklisted. - if blacklistStruct[ts.Name.Name] { - logf("Struct %v is blacklisted; skipping.", ts.Name) - continue - } - st, ok := ts.Type.(*ast.StructType) - if !ok { - logf("Ignoring AST type %T, Name=%q", ts.Type, ts.Name.String()) - continue - } - for _, field := range st.Fields.List { - if len(field.Names) == 0 { - continue - } - - fieldName := field.Names[0] - if id, ok := field.Type.(*ast.Ident); ok { - t.addIdent(id, ts.Name.String(), fieldName.String()) - continue - } - - if _, ok := field.Type.(*ast.MapType); ok { - t.addMapType(ts.Name.String(), fieldName.String()) - continue - } - - se, ok := field.Type.(*ast.StarExpr) - if !ok { - logf("Ignoring type %T for Name=%q, FieldName=%q", field.Type, ts.Name.String(), fieldName.String()) - continue - } - - // Skip unexported identifiers. - if !fieldName.IsExported() { - logf("Field %v is unexported; skipping.", fieldName) - continue - } - // Check if "struct.method" is blacklisted. - if key := fmt.Sprintf("%v.Get%v", ts.Name, fieldName); blacklistStructMethod[key] { - logf("Method %v is blacklisted; skipping.", key) - continue - } - - switch x := se.X.(type) { - case *ast.ArrayType: - case *ast.Ident: - t.addIdentPtr(x, ts.Name.String(), fieldName.String()) - case *ast.MapType: - case *ast.SelectorExpr: - default: - logf("processAST: type %q, field %q, unknown %T: %+v", ts.Name, fieldName, x, x) - } - } - } - } - return nil -} - -func (t *templateData) addMapType(receiverType, fieldName string) { - t.StructFields[receiverType] = append(t.StructFields[receiverType], newStructField(receiverType, fieldName, "map[]", "nil", false)) -} - -func (t *templateData) addIdent(x *ast.Ident, receiverType, fieldName string) { - var zeroValue string - var namedStruct = false - switch x.String() { - case "int": - zeroValue = "0" - case "int64": - zeroValue = "0" - case "float64": - zeroValue = "0.0" - case "string": - zeroValue = `""` - case "bool": - zeroValue = "false" - case "Timestamp": - zeroValue = "Timestamp{}" - default: - zeroValue = "nil" - namedStruct = true - } - - t.StructFields[receiverType] = append(t.StructFields[receiverType], newStructField(receiverType, fieldName, x.String(), zeroValue, namedStruct)) -} - -func (t *templateData) addIdentPtr(x *ast.Ident, receiverType, fieldName string) { - var zeroValue string - var namedStruct = false - switch x.String() { - case "int": - zeroValue = "Int(0)" - case "int64": - zeroValue = "Int64(0)" - case "float64": - zeroValue = "Float64(0.0)" - case "string": - zeroValue = `String("")` - case "bool": - zeroValue = "Bool(false)" - case "Timestamp": - zeroValue = "&Timestamp{}" - default: - zeroValue = "nil" - namedStruct = true - } - - t.StructFields[receiverType] = append(t.StructFields[receiverType], newStructField(receiverType, fieldName, x.String(), zeroValue, namedStruct)) -} - -func (t *templateData) dump() error { - if len(t.StructFields) == 0 { - logf("No StructFields for %v; skipping.", t.filename) - return nil - } - - // Remove unused structs. - var toDelete []string - for k := range t.StructFields { - if !t.StringFuncs[k] { - toDelete = append(toDelete, k) - continue - } - } - for _, k := range toDelete { - delete(t.StructFields, k) - } - - var buf bytes.Buffer - if err := sourceTmpl.Execute(&buf, t); err != nil { - return err - } - clean, err := format.Source(buf.Bytes()) - if err != nil { - log.Printf("failed-to-format source:\n%v", buf.String()) - return err - } - - logf("Writing %v...", t.filename) - return ioutil.WriteFile(t.filename, clean, 0644) -} - -func newStructField(receiverType, fieldName, fieldType, zeroValue string, namedStruct bool) *structField { - return &structField{ - sortVal: strings.ToLower(receiverType) + "." + strings.ToLower(fieldName), - ReceiverVar: strings.ToLower(receiverType[:1]), - ReceiverType: receiverType, - FieldName: fieldName, - FieldType: fieldType, - ZeroValue: zeroValue, - NamedStruct: namedStruct, - } -} - -func logf(fmt string, args ...interface{}) { - if *verbose { - log.Printf(fmt, args...) - } -} - -const source = `// Copyright {{.Year}} The go-github AUTHORS. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by gen-stringify-tests; DO NOT EDIT. - -package {{ $package := .Package}}{{$package}} -{{with .Imports}} -import ( - {{- range . -}} - "{{.}}" - {{end -}} -) -{{end}} -func Float64(v float64) *float64 { return &v } -{{range $key, $value := .StructFields}} -func Test{{ $key }}_String(t *testing.T) { - v := {{ $key }}{ {{range .}}{{if .NamedStruct}} - {{ .FieldName }}: &{{ .FieldType }}{},{{else}} - {{ .FieldName }}: {{.ZeroValue}},{{end}}{{end}} - } - want := ` + "`" + `{{ $package }}.{{ $key }}{{ $slice := . }}{ -{{- range $ind, $val := .}}{{if .NamedStruct}}{{ .FieldName }}:{{ $package }}.{{ .FieldType }}{}{{else}}{{ .FieldName }}:{{ processZeroValue .ZeroValue }}{{end}}{{ isNotLast $ind $slice }}{{end}}}` + "`" + ` - if got := v.String(); got != want { - t.Errorf("{{ $key }}.String = %v, want %v", got, want) - } -} -{{end}} -` diff --git a/vendor/github.com/googleapis/gax-go/v2/LICENSE b/vendor/github.com/googleapis/gax-go/v2/LICENSE new file mode 100644 index 00000000..6d16b657 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/LICENSE @@ -0,0 +1,27 @@ +Copyright 2016, Google Inc. +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/googleapis/gax-go/v2/call_option.go b/vendor/github.com/googleapis/gax-go/v2/call_option.go new file mode 100644 index 00000000..b1d53dd1 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/call_option.go @@ -0,0 +1,161 @@ +// Copyright 2016, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package gax + +import ( + "math/rand" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// CallOption is an option used by Invoke to control behaviors of RPC calls. +// CallOption works by modifying relevant fields of CallSettings. +type CallOption interface { + // Resolve applies the option by modifying cs. + Resolve(cs *CallSettings) +} + +// Retryer is used by Invoke to determine retry behavior. +type Retryer interface { + // Retry reports whether a request should be retriedand how long to pause before retrying + // if the previous attempt returned with err. Invoke never calls Retry with nil error. + Retry(err error) (pause time.Duration, shouldRetry bool) +} + +type retryerOption func() Retryer + +func (o retryerOption) Resolve(s *CallSettings) { + s.Retry = o +} + +// WithRetry sets CallSettings.Retry to fn. +func WithRetry(fn func() Retryer) CallOption { + return retryerOption(fn) +} + +// OnCodes returns a Retryer that retries if and only if +// the previous attempt returns a GRPC error whose error code is stored in cc. +// Pause times between retries are specified by bo. +// +// bo is only used for its parameters; each Retryer has its own copy. +func OnCodes(cc []codes.Code, bo Backoff) Retryer { + return &boRetryer{ + backoff: bo, + codes: append([]codes.Code(nil), cc...), + } +} + +type boRetryer struct { + backoff Backoff + codes []codes.Code +} + +func (r *boRetryer) Retry(err error) (time.Duration, bool) { + st, ok := status.FromError(err) + if !ok { + return 0, false + } + c := st.Code() + for _, rc := range r.codes { + if c == rc { + return r.backoff.Pause(), true + } + } + return 0, false +} + +// Backoff implements exponential backoff. +// The wait time between retries is a random value between 0 and the "retry envelope". +// The envelope starts at Initial and increases by the factor of Multiplier every retry, +// but is capped at Max. +type Backoff struct { + // Initial is the initial value of the retry envelope, defaults to 1 second. + Initial time.Duration + + // Max is the maximum value of the retry envelope, defaults to 30 seconds. + Max time.Duration + + // Multiplier is the factor by which the retry envelope increases. + // It should be greater than 1 and defaults to 2. + Multiplier float64 + + // cur is the current retry envelope + cur time.Duration +} + +// Pause returns the next time.Duration that the caller should use to backoff. +func (bo *Backoff) Pause() time.Duration { + if bo.Initial == 0 { + bo.Initial = time.Second + } + if bo.cur == 0 { + bo.cur = bo.Initial + } + if bo.Max == 0 { + bo.Max = 30 * time.Second + } + if bo.Multiplier < 1 { + bo.Multiplier = 2 + } + // Select a duration between 1ns and the current max. It might seem + // counterintuitive to have so much jitter, but + // https://www.awsarchitectureblog.com/2015/03/backoff.html argues that + // that is the best strategy. + d := time.Duration(1 + rand.Int63n(int64(bo.cur))) + bo.cur = time.Duration(float64(bo.cur) * bo.Multiplier) + if bo.cur > bo.Max { + bo.cur = bo.Max + } + return d +} + +type grpcOpt []grpc.CallOption + +func (o grpcOpt) Resolve(s *CallSettings) { + s.GRPC = o +} + +// WithGRPCOptions allows passing gRPC call options during client creation. +func WithGRPCOptions(opt ...grpc.CallOption) CallOption { + return grpcOpt(append([]grpc.CallOption(nil), opt...)) +} + +// CallSettings allow fine-grained control over how calls are made. +type CallSettings struct { + // Retry returns a Retryer to be used to control retry logic of a method call. + // If Retry is nil or the returned Retryer is nil, the call will not be retried. + Retry func() Retryer + + // CallOptions to be forwarded to GRPC. + GRPC []grpc.CallOption +} diff --git a/vendor/github.com/googleapis/gax-go/v2/gax.go b/vendor/github.com/googleapis/gax-go/v2/gax.go new file mode 100644 index 00000000..3fd1b0b8 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/gax.go @@ -0,0 +1,39 @@ +// Copyright 2016, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Package gax contains a set of modules which aid the development of APIs +// for clients and servers based on gRPC and Google API conventions. +// +// Application code will rarely need to use this library directly. +// However, code generated automatically from API definition files can use it +// to simplify code generation and to provide more convenient and idiomatic API surfaces. +package gax + +// Version specifies the gax-go version being used. +const Version = "2.0.4" diff --git a/vendor/github.com/googleapis/gax-go/v2/go.mod b/vendor/github.com/googleapis/gax-go/v2/go.mod new file mode 100644 index 00000000..9cdfaf44 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/go.mod @@ -0,0 +1,3 @@ +module github.com/googleapis/gax-go/v2 + +require google.golang.org/grpc v1.19.0 diff --git a/vendor/github.com/googleapis/gax-go/v2/go.sum b/vendor/github.com/googleapis/gax-go/v2/go.sum new file mode 100644 index 00000000..7fa23ecf --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/go.sum @@ -0,0 +1,25 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d h1:g9qWBGx4puODJTMVyoPrpoxPFgVGd+z1DZwjfRu4d0I= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522 h1:Ve1ORMCxvRmSXBwJK+t3Oy+V2vRW2OetUQBq4rJIkZE= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/github.com/googleapis/gax-go/v2/header.go b/vendor/github.com/googleapis/gax-go/v2/header.go new file mode 100644 index 00000000..139371a0 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/header.go @@ -0,0 +1,53 @@ +// Copyright 2018, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package gax + +import "bytes" + +// XGoogHeader is for use by the Google Cloud Libraries only. +// +// XGoogHeader formats key-value pairs. +// The resulting string is suitable for x-goog-api-client header. +func XGoogHeader(keyval ...string) string { + if len(keyval) == 0 { + return "" + } + if len(keyval)%2 != 0 { + panic("gax.Header: odd argument count") + } + var buf bytes.Buffer + for i := 0; i < len(keyval); i += 2 { + buf.WriteByte(' ') + buf.WriteString(keyval[i]) + buf.WriteByte('/') + buf.WriteString(keyval[i+1]) + } + return buf.String()[1:] +} diff --git a/vendor/github.com/googleapis/gax-go/v2/invoke.go b/vendor/github.com/googleapis/gax-go/v2/invoke.go new file mode 100644 index 00000000..fe31dd00 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/invoke.go @@ -0,0 +1,99 @@ +// Copyright 2016, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package gax + +import ( + "context" + "strings" + "time" +) + +// APICall is a user defined call stub. +type APICall func(context.Context, CallSettings) error + +// Invoke calls the given APICall, +// performing retries as specified by opts, if any. +func Invoke(ctx context.Context, call APICall, opts ...CallOption) error { + var settings CallSettings + for _, opt := range opts { + opt.Resolve(&settings) + } + return invoke(ctx, call, settings, Sleep) +} + +// Sleep is similar to time.Sleep, but it can be interrupted by ctx.Done() closing. +// If interrupted, Sleep returns ctx.Err(). +func Sleep(ctx context.Context, d time.Duration) error { + t := time.NewTimer(d) + select { + case <-ctx.Done(): + t.Stop() + return ctx.Err() + case <-t.C: + return nil + } +} + +type sleeper func(ctx context.Context, d time.Duration) error + +// invoke implements Invoke, taking an additional sleeper argument for testing. +func invoke(ctx context.Context, call APICall, settings CallSettings, sp sleeper) error { + var retryer Retryer + for { + err := call(ctx, settings) + if err == nil { + return nil + } + if settings.Retry == nil { + return err + } + // Never retry permanent certificate errors. (e.x. if ca-certificates + // are not installed). We should only make very few, targeted + // exceptions: many (other) status=Unavailable should be retried, such + // as if there's a network hiccup, or the internet goes out for a + // minute. This is also why here we are doing string parsing instead of + // simply making Unavailable a non-retried code elsewhere. + if strings.Contains(err.Error(), "x509: certificate signed by unknown authority") { + return err + } + if retryer == nil { + if r := settings.Retry(); r != nil { + retryer = r + } else { + return err + } + } + if d, ok := retryer.Retry(err); !ok { + return err + } else if err = sp(ctx, d); err != nil { + return err + } + } +} diff --git a/vendor/github.com/gophercloud/gophercloud/.gitignore b/vendor/github.com/gophercloud/gophercloud/.gitignore new file mode 100644 index 00000000..dd91ed20 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/.gitignore @@ -0,0 +1,3 @@ +**/*.swp +.idea +.vscode diff --git a/vendor/github.com/gophercloud/gophercloud/.travis.yml b/vendor/github.com/gophercloud/gophercloud/.travis.yml new file mode 100644 index 00000000..02728f49 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/.travis.yml @@ -0,0 +1,21 @@ +language: go +sudo: false +install: +- go get golang.org/x/crypto/ssh +- go get -v -tags 'fixtures acceptance' ./... +- go get github.com/wadey/gocovmerge +- go get github.com/mattn/goveralls +- go get golang.org/x/tools/cmd/goimports +go: +- "1.10" +- "tip" +env: + global: + - secure: "xSQsAG5wlL9emjbCdxzz/hYQsSpJ/bABO1kkbwMSISVcJ3Nk0u4ywF+LS4bgeOnwPfmFvNTOqVDu3RwEvMeWXSI76t1piCPcObutb2faKLVD/hLoAS76gYX+Z8yGWGHrSB7Do5vTPj1ERe2UljdrnsSeOXzoDwFxYRaZLX4bBOB4AyoGvRniil5QXPATiA1tsWX1VMicj8a4F8X+xeESzjt1Q5Iy31e7vkptu71bhvXCaoo5QhYwT+pLR9dN0S1b7Ro0KVvkRefmr1lUOSYd2e74h6Lc34tC1h3uYZCS4h47t7v5cOXvMNxinEj2C51RvbjvZI1RLVdkuAEJD1Iz4+Ote46nXbZ//6XRZMZz/YxQ13l7ux1PFjgEB6HAapmF5Xd8PRsgeTU9LRJxpiTJ3P5QJ3leS1va8qnziM5kYipj/Rn+V8g2ad/rgkRox9LSiR9VYZD2Pe45YCb1mTKSl2aIJnV7nkOqsShY5LNB4JZSg7xIffA+9YVDktw8dJlATjZqt7WvJJ49g6A61mIUV4C15q2JPGKTkZzDiG81NtmS7hFa7k0yaE2ELgYocbcuyUcAahhxntYTC0i23nJmEHVNiZmBO3u7EgpWe4KGVfumU+lt12tIn5b3dZRBBUk3QakKKozSK1QPHGpk/AZGrhu7H6l8to6IICKWtDcyMPQ=" +before_script: +- go vet ./... +script: +- ./script/coverage +- ./script/format +after_success: +- $HOME/gopath/bin/goveralls -service=travis-ci -coverprofile=cover.out diff --git a/vendor/github.com/gophercloud/gophercloud/.zuul.yaml b/vendor/github.com/gophercloud/gophercloud/.zuul.yaml new file mode 100644 index 00000000..8c31ea16 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/.zuul.yaml @@ -0,0 +1,98 @@ +- job: + name: gophercloud-unittest + parent: golang-test + description: | + Run gophercloud unit test + run: .zuul/playbooks/gophercloud-unittest/run.yaml + nodeset: ubuntu-xenial-ut + +- job: + name: gophercloud-acceptance-test + parent: golang-test + description: | + Run gophercloud acceptance test on master branch + run: .zuul/playbooks/gophercloud-acceptance-test/run.yaml + +- job: + name: gophercloud-acceptance-test-queens + parent: gophercloud-acceptance-test + description: | + Run gophercloud acceptance test on queens branch + vars: + global_env: + OS_BRANCH: stable/queens + +- job: + name: gophercloud-acceptance-test-rocky + parent: gophercloud-acceptance-test + description: | + Run gophercloud acceptance test on rocky branch + vars: + global_env: + OS_BRANCH: stable/rocky + +- job: + name: gophercloud-acceptance-test-pike + parent: gophercloud-acceptance-test + description: | + Run gophercloud acceptance test on pike branch + vars: + global_env: + OS_BRANCH: stable/pike + +- job: + name: gophercloud-acceptance-test-ocata + parent: gophercloud-acceptance-test + description: | + Run gophercloud acceptance test on ocata branch + vars: + global_env: + OS_BRANCH: stable/ocata + +- job: + name: gophercloud-acceptance-test-newton + parent: gophercloud-acceptance-test + description: | + Run gophercloud acceptance test on newton branch + vars: + global_env: + OS_BRANCH: stable/newton + +- job: + name: gophercloud-acceptance-test-mitaka + parent: gophercloud-acceptance-test + description: | + Run gophercloud acceptance test on mitaka branch + vars: + global_env: + OS_BRANCH: stable/mitaka + nodeset: ubuntu-trusty + +- project: + name: gophercloud/gophercloud + check: + jobs: + - gophercloud-unittest + - gophercloud-acceptance-test + recheck-mitaka: + jobs: + - gophercloud-acceptance-test-mitaka + recheck-newton: + jobs: + - gophercloud-acceptance-test-newton + recheck-ocata: + jobs: + - gophercloud-acceptance-test-ocata + recheck-pike: + jobs: + - gophercloud-acceptance-test-pike + recheck-queens: + jobs: + - gophercloud-acceptance-test-queens + recheck-rocky: + jobs: + - gophercloud-acceptance-test-rocky + periodic: + jobs: + - gophercloud-unittest + - gophercloud-acceptance-test diff --git a/vendor/github.com/gophercloud/gophercloud/CHANGELOG.md b/vendor/github.com/gophercloud/gophercloud/CHANGELOG.md new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/gophercloud/gophercloud/LICENSE b/vendor/github.com/gophercloud/gophercloud/LICENSE new file mode 100644 index 00000000..fbbbc9e4 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/LICENSE @@ -0,0 +1,191 @@ +Copyright 2012-2013 Rackspace, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. + +------ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/vendor/github.com/gophercloud/gophercloud/README.md b/vendor/github.com/gophercloud/gophercloud/README.md new file mode 100644 index 00000000..ad29041d --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/README.md @@ -0,0 +1,159 @@ +# Gophercloud: an OpenStack SDK for Go +[![Build Status](https://travis-ci.org/gophercloud/gophercloud.svg?branch=master)](https://travis-ci.org/gophercloud/gophercloud) +[![Coverage Status](https://coveralls.io/repos/github/gophercloud/gophercloud/badge.svg?branch=master)](https://coveralls.io/github/gophercloud/gophercloud?branch=master) + +Gophercloud is an OpenStack Go SDK. + +## Useful links + +* [Reference documentation](http://godoc.org/github.com/gophercloud/gophercloud) +* [Effective Go](https://golang.org/doc/effective_go.html) + +## How to install + +Before installing, you need to ensure that your [GOPATH environment variable](https://golang.org/doc/code.html#GOPATH) +is pointing to an appropriate directory where you want to install Gophercloud: + +```bash +mkdir $HOME/go +export GOPATH=$HOME/go +``` + +To protect yourself against changes in your dependencies, we highly recommend choosing a +[dependency management solution](https://github.com/golang/go/wiki/PackageManagementTools) for +your projects, such as [godep](https://github.com/tools/godep). Once this is set up, you can install +Gophercloud as a dependency like so: + +```bash +go get github.com/gophercloud/gophercloud + +# Edit your code to import relevant packages from "github.com/gophercloud/gophercloud" + +godep save ./... +``` + +This will install all the source files you need into a `Godeps/_workspace` directory, which is +referenceable from your own source files when you use the `godep go` command. + +## Getting started + +### Credentials + +Because you'll be hitting an API, you will need to retrieve your OpenStack +credentials and either store them as environment variables or in your local Go +files. The first method is recommended because it decouples credential +information from source code, allowing you to push the latter to your version +control system without any security risk. + +You will need to retrieve the following: + +* username +* password +* a valid Keystone identity URL + +For users that have the OpenStack dashboard installed, there's a shortcut. If +you visit the `project/access_and_security` path in Horizon and click on the +"Download OpenStack RC File" button at the top right hand corner, you will +download a bash file that exports all of your access details to environment +variables. To execute the file, run `source admin-openrc.sh` and you will be +prompted for your password. + +### Authentication + +Once you have access to your credentials, you can begin plugging them into +Gophercloud. The next step is authentication, and this is handled by a base +"Provider" struct. To get one, you can either pass in your credentials +explicitly, or tell Gophercloud to use environment variables: + +```go +import ( + "github.com/gophercloud/gophercloud" + "github.com/gophercloud/gophercloud/openstack" + "github.com/gophercloud/gophercloud/openstack/utils" +) + +// Option 1: Pass in the values yourself +opts := gophercloud.AuthOptions{ + IdentityEndpoint: "https://openstack.example.com:5000/v2.0", + Username: "{username}", + Password: "{password}", +} + +// Option 2: Use a utility function to retrieve all your environment variables +opts, err := openstack.AuthOptionsFromEnv() +``` + +Once you have the `opts` variable, you can pass it in and get back a +`ProviderClient` struct: + +```go +provider, err := openstack.AuthenticatedClient(opts) +``` + +The `ProviderClient` is the top-level client that all of your OpenStack services +derive from. The provider contains all of the authentication details that allow +your Go code to access the API - such as the base URL and token ID. + +### Provision a server + +Once we have a base Provider, we inject it as a dependency into each OpenStack +service. In order to work with the Compute API, we need a Compute service +client; which can be created like so: + +```go +client, err := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{ + Region: os.Getenv("OS_REGION_NAME"), +}) +``` + +We then use this `client` for any Compute API operation we want. In our case, +we want to provision a new server - so we invoke the `Create` method and pass +in the flavor ID (hardware specification) and image ID (operating system) we're +interested in: + +```go +import "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" + +server, err := servers.Create(client, servers.CreateOpts{ + Name: "My new server!", + FlavorRef: "flavor_id", + ImageRef: "image_id", +}).Extract() +``` + +The above code sample creates a new server with the parameters, and embodies the +new resource in the `server` variable (a +[`servers.Server`](http://godoc.org/github.com/gophercloud/gophercloud) struct). + +## Advanced Usage + +Have a look at the [FAQ](./docs/FAQ.md) for some tips on customizing the way Gophercloud works. + +## Backwards-Compatibility Guarantees + +None. Vendor it and write tests covering the parts you use. + +## Contributing + +See the [contributing guide](./.github/CONTRIBUTING.md). + +## Help and feedback + +If you're struggling with something or have spotted a potential bug, feel free +to submit an issue to our [bug tracker](https://github.com/gophercloud/gophercloud/issues). + +## Thank You + +We'd like to extend special thanks and appreciation to the following: + +### OpenLab + + + +OpenLab is providing a full CI environment to test each PR and merge for a variety of OpenStack releases. + +### VEXXHOST + + + +VEXXHOST is providing their services to assist with the development and testing of Gophercloud. diff --git a/vendor/github.com/gophercloud/gophercloud/auth_options.go b/vendor/github.com/gophercloud/gophercloud/auth_options.go new file mode 100644 index 00000000..5ffa8d1e --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/auth_options.go @@ -0,0 +1,437 @@ +package gophercloud + +/* +AuthOptions stores information needed to authenticate to an OpenStack Cloud. +You can populate one manually, or use a provider's AuthOptionsFromEnv() function +to read relevant information from the standard environment variables. Pass one +to a provider's AuthenticatedClient function to authenticate and obtain a +ProviderClient representing an active session on that provider. + +Its fields are the union of those recognized by each identity implementation and +provider. + +An example of manually providing authentication information: + + opts := gophercloud.AuthOptions{ + IdentityEndpoint: "https://openstack.example.com:5000/v2.0", + Username: "{username}", + Password: "{password}", + TenantID: "{tenant_id}", + } + + provider, err := openstack.AuthenticatedClient(opts) + +An example of using AuthOptionsFromEnv(), where the environment variables can +be read from a file, such as a standard openrc file: + + opts, err := openstack.AuthOptionsFromEnv() + provider, err := openstack.AuthenticatedClient(opts) +*/ +type AuthOptions struct { + // IdentityEndpoint specifies the HTTP endpoint that is required to work with + // the Identity API of the appropriate version. While it's ultimately needed by + // all of the identity services, it will often be populated by a provider-level + // function. + // + // The IdentityEndpoint is typically referred to as the "auth_url" or + // "OS_AUTH_URL" in the information provided by the cloud operator. + IdentityEndpoint string `json:"-"` + + // Username is required if using Identity V2 API. Consult with your provider's + // control panel to discover your account's username. In Identity V3, either + // UserID or a combination of Username and DomainID or DomainName are needed. + Username string `json:"username,omitempty"` + UserID string `json:"-"` + + Password string `json:"password,omitempty"` + + // At most one of DomainID and DomainName must be provided if using Username + // with Identity V3. Otherwise, either are optional. + DomainID string `json:"-"` + DomainName string `json:"name,omitempty"` + + // The TenantID and TenantName fields are optional for the Identity V2 API. + // The same fields are known as project_id and project_name in the Identity + // V3 API, but are collected as TenantID and TenantName here in both cases. + // Some providers allow you to specify a TenantName instead of the TenantId. + // Some require both. Your provider's authentication policies will determine + // how these fields influence authentication. + // If DomainID or DomainName are provided, they will also apply to TenantName. + // It is not currently possible to authenticate with Username and a Domain + // and scope to a Project in a different Domain by using TenantName. To + // accomplish that, the ProjectID will need to be provided as the TenantID + // option. + TenantID string `json:"tenantId,omitempty"` + TenantName string `json:"tenantName,omitempty"` + + // AllowReauth should be set to true if you grant permission for Gophercloud to + // cache your credentials in memory, and to allow Gophercloud to attempt to + // re-authenticate automatically if/when your token expires. If you set it to + // false, it will not cache these settings, but re-authentication will not be + // possible. This setting defaults to false. + // + // NOTE: The reauth function will try to re-authenticate endlessly if left + // unchecked. The way to limit the number of attempts is to provide a custom + // HTTP client to the provider client and provide a transport that implements + // the RoundTripper interface and stores the number of failed retries. For an + // example of this, see here: + // https://github.com/rackspace/rack/blob/1.0.0/auth/clients.go#L311 + AllowReauth bool `json:"-"` + + // TokenID allows users to authenticate (possibly as another user) with an + // authentication token ID. + TokenID string `json:"-"` + + // Scope determines the scoping of the authentication request. + Scope *AuthScope `json:"-"` + + // Authentication through Application Credentials requires supplying name, project and secret + // For project we can use TenantID + ApplicationCredentialID string `json:"-"` + ApplicationCredentialName string `json:"-"` + ApplicationCredentialSecret string `json:"-"` +} + +// AuthScope allows a created token to be limited to a specific domain or project. +type AuthScope struct { + ProjectID string + ProjectName string + DomainID string + DomainName string +} + +// ToTokenV2CreateMap allows AuthOptions to satisfy the AuthOptionsBuilder +// interface in the v2 tokens package +func (opts AuthOptions) ToTokenV2CreateMap() (map[string]interface{}, error) { + // Populate the request map. + authMap := make(map[string]interface{}) + + if opts.Username != "" { + if opts.Password != "" { + authMap["passwordCredentials"] = map[string]interface{}{ + "username": opts.Username, + "password": opts.Password, + } + } else { + return nil, ErrMissingInput{Argument: "Password"} + } + } else if opts.TokenID != "" { + authMap["token"] = map[string]interface{}{ + "id": opts.TokenID, + } + } else { + return nil, ErrMissingInput{Argument: "Username"} + } + + if opts.TenantID != "" { + authMap["tenantId"] = opts.TenantID + } + if opts.TenantName != "" { + authMap["tenantName"] = opts.TenantName + } + + return map[string]interface{}{"auth": authMap}, nil +} + +func (opts *AuthOptions) ToTokenV3CreateMap(scope map[string]interface{}) (map[string]interface{}, error) { + type domainReq struct { + ID *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + } + + type projectReq struct { + Domain *domainReq `json:"domain,omitempty"` + Name *string `json:"name,omitempty"` + ID *string `json:"id,omitempty"` + } + + type userReq struct { + ID *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + Password string `json:"password,omitempty"` + Domain *domainReq `json:"domain,omitempty"` + } + + type passwordReq struct { + User userReq `json:"user"` + } + + type tokenReq struct { + ID string `json:"id"` + } + + type applicationCredentialReq struct { + ID *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + User *userReq `json:"user,omitempty"` + Secret *string `json:"secret,omitempty"` + } + + type identityReq struct { + Methods []string `json:"methods"` + Password *passwordReq `json:"password,omitempty"` + Token *tokenReq `json:"token,omitempty"` + ApplicationCredential *applicationCredentialReq `json:"application_credential,omitempty"` + } + + type authReq struct { + Identity identityReq `json:"identity"` + } + + type request struct { + Auth authReq `json:"auth"` + } + + // Populate the request structure based on the provided arguments. Create and return an error + // if insufficient or incompatible information is present. + var req request + + if opts.Password == "" { + if opts.TokenID != "" { + // Because we aren't using password authentication, it's an error to also provide any of the user-based authentication + // parameters. + if opts.Username != "" { + return nil, ErrUsernameWithToken{} + } + if opts.UserID != "" { + return nil, ErrUserIDWithToken{} + } + if opts.DomainID != "" { + return nil, ErrDomainIDWithToken{} + } + if opts.DomainName != "" { + return nil, ErrDomainNameWithToken{} + } + + // Configure the request for Token authentication. + req.Auth.Identity.Methods = []string{"token"} + req.Auth.Identity.Token = &tokenReq{ + ID: opts.TokenID, + } + + } else if opts.ApplicationCredentialID != "" { + // Configure the request for ApplicationCredentialID authentication. + // https://github.com/openstack/keystoneauth/blob/stable/rocky/keystoneauth1/identity/v3/application_credential.py#L48-L67 + // There are three kinds of possible application_credential requests + // 1. application_credential id + secret + // 2. application_credential name + secret + user_id + // 3. application_credential name + secret + username + domain_id / domain_name + if opts.ApplicationCredentialSecret == "" { + return nil, ErrAppCredMissingSecret{} + } + req.Auth.Identity.Methods = []string{"application_credential"} + req.Auth.Identity.ApplicationCredential = &applicationCredentialReq{ + ID: &opts.ApplicationCredentialID, + Secret: &opts.ApplicationCredentialSecret, + } + } else if opts.ApplicationCredentialName != "" { + if opts.ApplicationCredentialSecret == "" { + return nil, ErrAppCredMissingSecret{} + } + + var userRequest *userReq + + if opts.UserID != "" { + // UserID could be used without the domain information + userRequest = &userReq{ + ID: &opts.UserID, + } + } + + if userRequest == nil && opts.Username == "" { + // Make sure that Username or UserID are provided + return nil, ErrUsernameOrUserID{} + } + + if userRequest == nil && opts.DomainID != "" { + userRequest = &userReq{ + Name: &opts.Username, + Domain: &domainReq{ID: &opts.DomainID}, + } + } + + if userRequest == nil && opts.DomainName != "" { + userRequest = &userReq{ + Name: &opts.Username, + Domain: &domainReq{Name: &opts.DomainName}, + } + } + + // Make sure that DomainID or DomainName are provided among Username + if userRequest == nil { + return nil, ErrDomainIDOrDomainName{} + } + + req.Auth.Identity.Methods = []string{"application_credential"} + req.Auth.Identity.ApplicationCredential = &applicationCredentialReq{ + Name: &opts.ApplicationCredentialName, + User: userRequest, + Secret: &opts.ApplicationCredentialSecret, + } + } else { + // If no password or token ID or ApplicationCredential are available, authentication can't continue. + return nil, ErrMissingPassword{} + } + } else { + // Password authentication. + req.Auth.Identity.Methods = []string{"password"} + + // At least one of Username and UserID must be specified. + if opts.Username == "" && opts.UserID == "" { + return nil, ErrUsernameOrUserID{} + } + + if opts.Username != "" { + // If Username is provided, UserID may not be provided. + if opts.UserID != "" { + return nil, ErrUsernameOrUserID{} + } + + // Either DomainID or DomainName must also be specified. + if opts.DomainID == "" && opts.DomainName == "" { + return nil, ErrDomainIDOrDomainName{} + } + + if opts.DomainID != "" { + if opts.DomainName != "" { + return nil, ErrDomainIDOrDomainName{} + } + + // Configure the request for Username and Password authentication with a DomainID. + req.Auth.Identity.Password = &passwordReq{ + User: userReq{ + Name: &opts.Username, + Password: opts.Password, + Domain: &domainReq{ID: &opts.DomainID}, + }, + } + } + + if opts.DomainName != "" { + // Configure the request for Username and Password authentication with a DomainName. + req.Auth.Identity.Password = &passwordReq{ + User: userReq{ + Name: &opts.Username, + Password: opts.Password, + Domain: &domainReq{Name: &opts.DomainName}, + }, + } + } + } + + if opts.UserID != "" { + // If UserID is specified, neither DomainID nor DomainName may be. + if opts.DomainID != "" { + return nil, ErrDomainIDWithUserID{} + } + if opts.DomainName != "" { + return nil, ErrDomainNameWithUserID{} + } + + // Configure the request for UserID and Password authentication. + req.Auth.Identity.Password = &passwordReq{ + User: userReq{ID: &opts.UserID, Password: opts.Password}, + } + } + } + + b, err := BuildRequestBody(req, "") + if err != nil { + return nil, err + } + + if len(scope) != 0 { + b["auth"].(map[string]interface{})["scope"] = scope + } + + return b, nil +} + +func (opts *AuthOptions) ToTokenV3ScopeMap() (map[string]interface{}, error) { + // For backwards compatibility. + // If AuthOptions.Scope was not set, try to determine it. + // This works well for common scenarios. + if opts.Scope == nil { + opts.Scope = new(AuthScope) + if opts.TenantID != "" { + opts.Scope.ProjectID = opts.TenantID + } else { + if opts.TenantName != "" { + opts.Scope.ProjectName = opts.TenantName + opts.Scope.DomainID = opts.DomainID + opts.Scope.DomainName = opts.DomainName + } + } + } + + if opts.Scope.ProjectName != "" { + // ProjectName provided: either DomainID or DomainName must also be supplied. + // ProjectID may not be supplied. + if opts.Scope.DomainID == "" && opts.Scope.DomainName == "" { + return nil, ErrScopeDomainIDOrDomainName{} + } + if opts.Scope.ProjectID != "" { + return nil, ErrScopeProjectIDOrProjectName{} + } + + if opts.Scope.DomainID != "" { + // ProjectName + DomainID + return map[string]interface{}{ + "project": map[string]interface{}{ + "name": &opts.Scope.ProjectName, + "domain": map[string]interface{}{"id": &opts.Scope.DomainID}, + }, + }, nil + } + + if opts.Scope.DomainName != "" { + // ProjectName + DomainName + return map[string]interface{}{ + "project": map[string]interface{}{ + "name": &opts.Scope.ProjectName, + "domain": map[string]interface{}{"name": &opts.Scope.DomainName}, + }, + }, nil + } + } else if opts.Scope.ProjectID != "" { + // ProjectID provided. ProjectName, DomainID, and DomainName may not be provided. + if opts.Scope.DomainID != "" { + return nil, ErrScopeProjectIDAlone{} + } + if opts.Scope.DomainName != "" { + return nil, ErrScopeProjectIDAlone{} + } + + // ProjectID + return map[string]interface{}{ + "project": map[string]interface{}{ + "id": &opts.Scope.ProjectID, + }, + }, nil + } else if opts.Scope.DomainID != "" { + // DomainID provided. ProjectID, ProjectName, and DomainName may not be provided. + if opts.Scope.DomainName != "" { + return nil, ErrScopeDomainIDOrDomainName{} + } + + // DomainID + return map[string]interface{}{ + "domain": map[string]interface{}{ + "id": &opts.Scope.DomainID, + }, + }, nil + } else if opts.Scope.DomainName != "" { + // DomainName + return map[string]interface{}{ + "domain": map[string]interface{}{ + "name": &opts.Scope.DomainName, + }, + }, nil + } + + return nil, nil +} + +func (opts AuthOptions) CanReauth() bool { + return opts.AllowReauth +} diff --git a/vendor/github.com/gophercloud/gophercloud/doc.go b/vendor/github.com/gophercloud/gophercloud/doc.go new file mode 100644 index 00000000..131cc8e3 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/doc.go @@ -0,0 +1,93 @@ +/* +Package gophercloud provides a multi-vendor interface to OpenStack-compatible +clouds. The library has a three-level hierarchy: providers, services, and +resources. + +Authenticating with Providers + +Provider structs represent the cloud providers that offer and manage a +collection of services. You will generally want to create one Provider +client per OpenStack cloud. + +Use your OpenStack credentials to create a Provider client. The +IdentityEndpoint is typically refered to as "auth_url" or "OS_AUTH_URL" in +information provided by the cloud operator. Additionally, the cloud may refer to +TenantID or TenantName as project_id and project_name. Credentials are +specified like so: + + opts := gophercloud.AuthOptions{ + IdentityEndpoint: "https://openstack.example.com:5000/v2.0", + Username: "{username}", + Password: "{password}", + TenantID: "{tenant_id}", + } + + provider, err := openstack.AuthenticatedClient(opts) + +You may also use the openstack.AuthOptionsFromEnv() helper function. This +function reads in standard environment variables frequently found in an +OpenStack `openrc` file. Again note that Gophercloud currently uses "tenant" +instead of "project". + + opts, err := openstack.AuthOptionsFromEnv() + provider, err := openstack.AuthenticatedClient(opts) + +Service Clients + +Service structs are specific to a provider and handle all of the logic and +operations for a particular OpenStack service. Examples of services include: +Compute, Object Storage, Block Storage. In order to define one, you need to +pass in the parent provider, like so: + + opts := gophercloud.EndpointOpts{Region: "RegionOne"} + + client, err := openstack.NewComputeV2(provider, opts) + +Resources + +Resource structs are the domain models that services make use of in order +to work with and represent the state of API resources: + + server, err := servers.Get(client, "{serverId}").Extract() + +Intermediate Result structs are returned for API operations, which allow +generic access to the HTTP headers, response body, and any errors associated +with the network transaction. To turn a result into a usable resource struct, +you must call the Extract method which is chained to the response, or an +Extract function from an applicable extension: + + result := servers.Get(client, "{serverId}") + + // Attempt to extract the disk configuration from the OS-DCF disk config + // extension: + config, err := diskconfig.ExtractGet(result) + +All requests that enumerate a collection return a Pager struct that is used to +iterate through the results one page at a time. Use the EachPage method on that +Pager to handle each successive Page in a closure, then use the appropriate +extraction method from that request's package to interpret that Page as a slice +of results: + + err := servers.List(client, nil).EachPage(func (page pagination.Page) (bool, error) { + s, err := servers.ExtractServers(page) + if err != nil { + return false, err + } + + // Handle the []servers.Server slice. + + // Return "false" or an error to prematurely stop fetching new pages. + return true, nil + }) + +If you want to obtain the entire collection of pages without doing any +intermediary processing on each page, you can use the AllPages method: + + allPages, err := servers.List(client, nil).AllPages() + allServers, err := servers.ExtractServers(allPages) + +This top-level package contains utility functions and data types that are used +throughout the provider and service packages. Of particular note for end users +are the AuthOptions and EndpointOpts structs. +*/ +package gophercloud diff --git a/vendor/github.com/gophercloud/gophercloud/endpoint_search.go b/vendor/github.com/gophercloud/gophercloud/endpoint_search.go new file mode 100644 index 00000000..2fbc3c97 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/endpoint_search.go @@ -0,0 +1,76 @@ +package gophercloud + +// Availability indicates to whom a specific service endpoint is accessible: +// the internet at large, internal networks only, or only to administrators. +// Different identity services use different terminology for these. Identity v2 +// lists them as different kinds of URLs within the service catalog ("adminURL", +// "internalURL", and "publicURL"), while v3 lists them as "Interfaces" in an +// endpoint's response. +type Availability string + +const ( + // AvailabilityAdmin indicates that an endpoint is only available to + // administrators. + AvailabilityAdmin Availability = "admin" + + // AvailabilityPublic indicates that an endpoint is available to everyone on + // the internet. + AvailabilityPublic Availability = "public" + + // AvailabilityInternal indicates that an endpoint is only available within + // the cluster's internal network. + AvailabilityInternal Availability = "internal" +) + +// EndpointOpts specifies search criteria used by queries against an +// OpenStack service catalog. The options must contain enough information to +// unambiguously identify one, and only one, endpoint within the catalog. +// +// Usually, these are passed to service client factory functions in a provider +// package, like "openstack.NewComputeV2()". +type EndpointOpts struct { + // Type [required] is the service type for the client (e.g., "compute", + // "object-store"). Generally, this will be supplied by the service client + // function, but a user-given value will be honored if provided. + Type string + + // Name [optional] is the service name for the client (e.g., "nova") as it + // appears in the service catalog. Services can have the same Type but a + // different Name, which is why both Type and Name are sometimes needed. + Name string + + // Region [required] is the geographic region in which the endpoint resides, + // generally specifying which datacenter should house your resources. + // Required only for services that span multiple regions. + Region string + + // Availability [optional] is the visibility of the endpoint to be returned. + // Valid types include the constants AvailabilityPublic, AvailabilityInternal, + // or AvailabilityAdmin from this package. + // + // Availability is not required, and defaults to AvailabilityPublic. Not all + // providers or services offer all Availability options. + Availability Availability +} + +/* +EndpointLocator is an internal function to be used by provider implementations. + +It provides an implementation that locates a single endpoint from a service +catalog for a specific ProviderClient based on user-provided EndpointOpts. The +provider then uses it to discover related ServiceClients. +*/ +type EndpointLocator func(EndpointOpts) (string, error) + +// ApplyDefaults is an internal method to be used by provider implementations. +// +// It sets EndpointOpts fields if not already set, including a default type. +// Currently, EndpointOpts.Availability defaults to the public endpoint. +func (eo *EndpointOpts) ApplyDefaults(t string) { + if eo.Type == "" { + eo.Type = t + } + if eo.Availability == "" { + eo.Availability = AvailabilityPublic + } +} diff --git a/vendor/github.com/gophercloud/gophercloud/errors.go b/vendor/github.com/gophercloud/gophercloud/errors.go new file mode 100644 index 00000000..4bf10246 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/errors.go @@ -0,0 +1,460 @@ +package gophercloud + +import ( + "fmt" + "strings" +) + +// BaseError is an error type that all other error types embed. +type BaseError struct { + DefaultErrString string + Info string +} + +func (e BaseError) Error() string { + e.DefaultErrString = "An error occurred while executing a Gophercloud request." + return e.choseErrString() +} + +func (e BaseError) choseErrString() string { + if e.Info != "" { + return e.Info + } + return e.DefaultErrString +} + +// ErrMissingInput is the error when input is required in a particular +// situation but not provided by the user +type ErrMissingInput struct { + BaseError + Argument string +} + +func (e ErrMissingInput) Error() string { + e.DefaultErrString = fmt.Sprintf("Missing input for argument [%s]", e.Argument) + return e.choseErrString() +} + +// ErrInvalidInput is an error type used for most non-HTTP Gophercloud errors. +type ErrInvalidInput struct { + ErrMissingInput + Value interface{} +} + +func (e ErrInvalidInput) Error() string { + e.DefaultErrString = fmt.Sprintf("Invalid input provided for argument [%s]: [%+v]", e.Argument, e.Value) + return e.choseErrString() +} + +// ErrMissingEnvironmentVariable is the error when environment variable is required +// in a particular situation but not provided by the user +type ErrMissingEnvironmentVariable struct { + BaseError + EnvironmentVariable string +} + +func (e ErrMissingEnvironmentVariable) Error() string { + e.DefaultErrString = fmt.Sprintf("Missing environment variable [%s]", e.EnvironmentVariable) + return e.choseErrString() +} + +// ErrMissingAnyoneOfEnvironmentVariables is the error when anyone of the environment variables +// is required in a particular situation but not provided by the user +type ErrMissingAnyoneOfEnvironmentVariables struct { + BaseError + EnvironmentVariables []string +} + +func (e ErrMissingAnyoneOfEnvironmentVariables) Error() string { + e.DefaultErrString = fmt.Sprintf( + "Missing one of the following environment variables [%s]", + strings.Join(e.EnvironmentVariables, ", "), + ) + return e.choseErrString() +} + +// ErrUnexpectedResponseCode is returned by the Request method when a response code other than +// those listed in OkCodes is encountered. +type ErrUnexpectedResponseCode struct { + BaseError + URL string + Method string + Expected []int + Actual int + Body []byte +} + +func (e ErrUnexpectedResponseCode) Error() string { + e.DefaultErrString = fmt.Sprintf( + "Expected HTTP response code %v when accessing [%s %s], but got %d instead\n%s", + e.Expected, e.Method, e.URL, e.Actual, e.Body, + ) + return e.choseErrString() +} + +// ErrDefault400 is the default error type returned on a 400 HTTP response code. +type ErrDefault400 struct { + ErrUnexpectedResponseCode +} + +// ErrDefault401 is the default error type returned on a 401 HTTP response code. +type ErrDefault401 struct { + ErrUnexpectedResponseCode +} + +// ErrDefault403 is the default error type returned on a 403 HTTP response code. +type ErrDefault403 struct { + ErrUnexpectedResponseCode +} + +// ErrDefault404 is the default error type returned on a 404 HTTP response code. +type ErrDefault404 struct { + ErrUnexpectedResponseCode +} + +// ErrDefault405 is the default error type returned on a 405 HTTP response code. +type ErrDefault405 struct { + ErrUnexpectedResponseCode +} + +// ErrDefault408 is the default error type returned on a 408 HTTP response code. +type ErrDefault408 struct { + ErrUnexpectedResponseCode +} + +// ErrDefault429 is the default error type returned on a 429 HTTP response code. +type ErrDefault429 struct { + ErrUnexpectedResponseCode +} + +// ErrDefault500 is the default error type returned on a 500 HTTP response code. +type ErrDefault500 struct { + ErrUnexpectedResponseCode +} + +// ErrDefault503 is the default error type returned on a 503 HTTP response code. +type ErrDefault503 struct { + ErrUnexpectedResponseCode +} + +func (e ErrDefault400) Error() string { + e.DefaultErrString = fmt.Sprintf( + "Bad request with: [%s %s], error message: %s", + e.Method, e.URL, e.Body, + ) + return e.choseErrString() +} +func (e ErrDefault401) Error() string { + return "Authentication failed" +} +func (e ErrDefault403) Error() string { + e.DefaultErrString = fmt.Sprintf( + "Request forbidden: [%s %s], error message: %s", + e.Method, e.URL, e.Body, + ) + return e.choseErrString() +} +func (e ErrDefault404) Error() string { + return "Resource not found" +} +func (e ErrDefault405) Error() string { + return "Method not allowed" +} +func (e ErrDefault408) Error() string { + return "The server timed out waiting for the request" +} +func (e ErrDefault429) Error() string { + return "Too many requests have been sent in a given amount of time. Pause" + + " requests, wait up to one minute, and try again." +} +func (e ErrDefault500) Error() string { + return "Internal Server Error" +} +func (e ErrDefault503) Error() string { + return "The service is currently unable to handle the request due to a temporary" + + " overloading or maintenance. This is a temporary condition. Try again later." +} + +// Err400er is the interface resource error types implement to override the error message +// from a 400 error. +type Err400er interface { + Error400(ErrUnexpectedResponseCode) error +} + +// Err401er is the interface resource error types implement to override the error message +// from a 401 error. +type Err401er interface { + Error401(ErrUnexpectedResponseCode) error +} + +// Err403er is the interface resource error types implement to override the error message +// from a 403 error. +type Err403er interface { + Error403(ErrUnexpectedResponseCode) error +} + +// Err404er is the interface resource error types implement to override the error message +// from a 404 error. +type Err404er interface { + Error404(ErrUnexpectedResponseCode) error +} + +// Err405er is the interface resource error types implement to override the error message +// from a 405 error. +type Err405er interface { + Error405(ErrUnexpectedResponseCode) error +} + +// Err408er is the interface resource error types implement to override the error message +// from a 408 error. +type Err408er interface { + Error408(ErrUnexpectedResponseCode) error +} + +// Err429er is the interface resource error types implement to override the error message +// from a 429 error. +type Err429er interface { + Error429(ErrUnexpectedResponseCode) error +} + +// Err500er is the interface resource error types implement to override the error message +// from a 500 error. +type Err500er interface { + Error500(ErrUnexpectedResponseCode) error +} + +// Err503er is the interface resource error types implement to override the error message +// from a 503 error. +type Err503er interface { + Error503(ErrUnexpectedResponseCode) error +} + +// ErrTimeOut is the error type returned when an operations times out. +type ErrTimeOut struct { + BaseError +} + +func (e ErrTimeOut) Error() string { + e.DefaultErrString = "A time out occurred" + return e.choseErrString() +} + +// ErrUnableToReauthenticate is the error type returned when reauthentication fails. +type ErrUnableToReauthenticate struct { + BaseError + ErrOriginal error +} + +func (e ErrUnableToReauthenticate) Error() string { + e.DefaultErrString = fmt.Sprintf("Unable to re-authenticate: %s", e.ErrOriginal) + return e.choseErrString() +} + +// ErrErrorAfterReauthentication is the error type returned when reauthentication +// succeeds, but an error occurs afterword (usually an HTTP error). +type ErrErrorAfterReauthentication struct { + BaseError + ErrOriginal error +} + +func (e ErrErrorAfterReauthentication) Error() string { + e.DefaultErrString = fmt.Sprintf("Successfully re-authenticated, but got error executing request: %s", e.ErrOriginal) + return e.choseErrString() +} + +// ErrServiceNotFound is returned when no service in a service catalog matches +// the provided EndpointOpts. This is generally returned by provider service +// factory methods like "NewComputeV2()" and can mean that a service is not +// enabled for your account. +type ErrServiceNotFound struct { + BaseError +} + +func (e ErrServiceNotFound) Error() string { + e.DefaultErrString = "No suitable service could be found in the service catalog." + return e.choseErrString() +} + +// ErrEndpointNotFound is returned when no available endpoints match the +// provided EndpointOpts. This is also generally returned by provider service +// factory methods, and usually indicates that a region was specified +// incorrectly. +type ErrEndpointNotFound struct { + BaseError +} + +func (e ErrEndpointNotFound) Error() string { + e.DefaultErrString = "No suitable endpoint could be found in the service catalog." + return e.choseErrString() +} + +// ErrResourceNotFound is the error when trying to retrieve a resource's +// ID by name and the resource doesn't exist. +type ErrResourceNotFound struct { + BaseError + Name string + ResourceType string +} + +func (e ErrResourceNotFound) Error() string { + e.DefaultErrString = fmt.Sprintf("Unable to find %s with name %s", e.ResourceType, e.Name) + return e.choseErrString() +} + +// ErrMultipleResourcesFound is the error when trying to retrieve a resource's +// ID by name and multiple resources have the user-provided name. +type ErrMultipleResourcesFound struct { + BaseError + Name string + Count int + ResourceType string +} + +func (e ErrMultipleResourcesFound) Error() string { + e.DefaultErrString = fmt.Sprintf("Found %d %ss matching %s", e.Count, e.ResourceType, e.Name) + return e.choseErrString() +} + +// ErrUnexpectedType is the error when an unexpected type is encountered +type ErrUnexpectedType struct { + BaseError + Expected string + Actual string +} + +func (e ErrUnexpectedType) Error() string { + e.DefaultErrString = fmt.Sprintf("Expected %s but got %s", e.Expected, e.Actual) + return e.choseErrString() +} + +func unacceptedAttributeErr(attribute string) string { + return fmt.Sprintf("The base Identity V3 API does not accept authentication by %s", attribute) +} + +func redundantWithTokenErr(attribute string) string { + return fmt.Sprintf("%s may not be provided when authenticating with a TokenID", attribute) +} + +func redundantWithUserID(attribute string) string { + return fmt.Sprintf("%s may not be provided when authenticating with a UserID", attribute) +} + +// ErrAPIKeyProvided indicates that an APIKey was provided but can't be used. +type ErrAPIKeyProvided struct{ BaseError } + +func (e ErrAPIKeyProvided) Error() string { + return unacceptedAttributeErr("APIKey") +} + +// ErrTenantIDProvided indicates that a TenantID was provided but can't be used. +type ErrTenantIDProvided struct{ BaseError } + +func (e ErrTenantIDProvided) Error() string { + return unacceptedAttributeErr("TenantID") +} + +// ErrTenantNameProvided indicates that a TenantName was provided but can't be used. +type ErrTenantNameProvided struct{ BaseError } + +func (e ErrTenantNameProvided) Error() string { + return unacceptedAttributeErr("TenantName") +} + +// ErrUsernameWithToken indicates that a Username was provided, but token authentication is being used instead. +type ErrUsernameWithToken struct{ BaseError } + +func (e ErrUsernameWithToken) Error() string { + return redundantWithTokenErr("Username") +} + +// ErrUserIDWithToken indicates that a UserID was provided, but token authentication is being used instead. +type ErrUserIDWithToken struct{ BaseError } + +func (e ErrUserIDWithToken) Error() string { + return redundantWithTokenErr("UserID") +} + +// ErrDomainIDWithToken indicates that a DomainID was provided, but token authentication is being used instead. +type ErrDomainIDWithToken struct{ BaseError } + +func (e ErrDomainIDWithToken) Error() string { + return redundantWithTokenErr("DomainID") +} + +// ErrDomainNameWithToken indicates that a DomainName was provided, but token authentication is being used instead.s +type ErrDomainNameWithToken struct{ BaseError } + +func (e ErrDomainNameWithToken) Error() string { + return redundantWithTokenErr("DomainName") +} + +// ErrUsernameOrUserID indicates that neither username nor userID are specified, or both are at once. +type ErrUsernameOrUserID struct{ BaseError } + +func (e ErrUsernameOrUserID) Error() string { + return "Exactly one of Username and UserID must be provided for password authentication" +} + +// ErrDomainIDWithUserID indicates that a DomainID was provided, but unnecessary because a UserID is being used. +type ErrDomainIDWithUserID struct{ BaseError } + +func (e ErrDomainIDWithUserID) Error() string { + return redundantWithUserID("DomainID") +} + +// ErrDomainNameWithUserID indicates that a DomainName was provided, but unnecessary because a UserID is being used. +type ErrDomainNameWithUserID struct{ BaseError } + +func (e ErrDomainNameWithUserID) Error() string { + return redundantWithUserID("DomainName") +} + +// ErrDomainIDOrDomainName indicates that a username was provided, but no domain to scope it. +// It may also indicate that both a DomainID and a DomainName were provided at once. +type ErrDomainIDOrDomainName struct{ BaseError } + +func (e ErrDomainIDOrDomainName) Error() string { + return "You must provide exactly one of DomainID or DomainName to authenticate by Username" +} + +// ErrMissingPassword indicates that no password was provided and no token is available. +type ErrMissingPassword struct{ BaseError } + +func (e ErrMissingPassword) Error() string { + return "You must provide a password to authenticate" +} + +// ErrScopeDomainIDOrDomainName indicates that a domain ID or Name was required in a Scope, but not present. +type ErrScopeDomainIDOrDomainName struct{ BaseError } + +func (e ErrScopeDomainIDOrDomainName) Error() string { + return "You must provide exactly one of DomainID or DomainName in a Scope with ProjectName" +} + +// ErrScopeProjectIDOrProjectName indicates that both a ProjectID and a ProjectName were provided in a Scope. +type ErrScopeProjectIDOrProjectName struct{ BaseError } + +func (e ErrScopeProjectIDOrProjectName) Error() string { + return "You must provide at most one of ProjectID or ProjectName in a Scope" +} + +// ErrScopeProjectIDAlone indicates that a ProjectID was provided with other constraints in a Scope. +type ErrScopeProjectIDAlone struct{ BaseError } + +func (e ErrScopeProjectIDAlone) Error() string { + return "ProjectID must be supplied alone in a Scope" +} + +// ErrScopeEmpty indicates that no credentials were provided in a Scope. +type ErrScopeEmpty struct{ BaseError } + +func (e ErrScopeEmpty) Error() string { + return "You must provide either a Project or Domain in a Scope" +} + +// ErrAppCredMissingSecret indicates that no Application Credential Secret was provided with Application Credential ID or Name +type ErrAppCredMissingSecret struct{ BaseError } + +func (e ErrAppCredMissingSecret) Error() string { + return "You must provide an Application Credential Secret" +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/auth_env.go b/vendor/github.com/gophercloud/gophercloud/openstack/auth_env.go new file mode 100644 index 00000000..0bb1f483 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/auth_env.go @@ -0,0 +1,114 @@ +package openstack + +import ( + "os" + + "github.com/gophercloud/gophercloud" +) + +var nilOptions = gophercloud.AuthOptions{} + +/* +AuthOptionsFromEnv fills out an identity.AuthOptions structure with the +settings found on the various OpenStack OS_* environment variables. + +The following variables provide sources of truth: OS_AUTH_URL, OS_USERNAME, +OS_PASSWORD, OS_TENANT_ID, and OS_TENANT_NAME. + +Of these, OS_USERNAME, OS_PASSWORD, and OS_AUTH_URL must have settings, +or an error will result. OS_TENANT_ID, OS_TENANT_NAME, OS_PROJECT_ID, and +OS_PROJECT_NAME are optional. + +OS_TENANT_ID and OS_TENANT_NAME are mutually exclusive to OS_PROJECT_ID and +OS_PROJECT_NAME. If OS_PROJECT_ID and OS_PROJECT_NAME are set, they will +still be referred as "tenant" in Gophercloud. + +To use this function, first set the OS_* environment variables (for example, +by sourcing an `openrc` file), then: + + opts, err := openstack.AuthOptionsFromEnv() + provider, err := openstack.AuthenticatedClient(opts) +*/ +func AuthOptionsFromEnv() (gophercloud.AuthOptions, error) { + authURL := os.Getenv("OS_AUTH_URL") + username := os.Getenv("OS_USERNAME") + userID := os.Getenv("OS_USERID") + password := os.Getenv("OS_PASSWORD") + tenantID := os.Getenv("OS_TENANT_ID") + tenantName := os.Getenv("OS_TENANT_NAME") + domainID := os.Getenv("OS_DOMAIN_ID") + domainName := os.Getenv("OS_DOMAIN_NAME") + applicationCredentialID := os.Getenv("OS_APPLICATION_CREDENTIAL_ID") + applicationCredentialName := os.Getenv("OS_APPLICATION_CREDENTIAL_NAME") + applicationCredentialSecret := os.Getenv("OS_APPLICATION_CREDENTIAL_SECRET") + + // If OS_PROJECT_ID is set, overwrite tenantID with the value. + if v := os.Getenv("OS_PROJECT_ID"); v != "" { + tenantID = v + } + + // If OS_PROJECT_NAME is set, overwrite tenantName with the value. + if v := os.Getenv("OS_PROJECT_NAME"); v != "" { + tenantName = v + } + + if authURL == "" { + err := gophercloud.ErrMissingEnvironmentVariable{ + EnvironmentVariable: "OS_AUTH_URL", + } + return nilOptions, err + } + + if userID == "" && username == "" { + // Empty username and userID could be ignored, when applicationCredentialID and applicationCredentialSecret are set + if applicationCredentialID == "" && applicationCredentialSecret == "" { + err := gophercloud.ErrMissingAnyoneOfEnvironmentVariables{ + EnvironmentVariables: []string{"OS_USERID", "OS_USERNAME"}, + } + return nilOptions, err + } + } + + if password == "" && applicationCredentialID == "" && applicationCredentialName == "" { + err := gophercloud.ErrMissingEnvironmentVariable{ + EnvironmentVariable: "OS_PASSWORD", + } + return nilOptions, err + } + + if (applicationCredentialID != "" || applicationCredentialName != "") && applicationCredentialSecret == "" { + err := gophercloud.ErrMissingEnvironmentVariable{ + EnvironmentVariable: "OS_APPLICATION_CREDENTIAL_SECRET", + } + return nilOptions, err + } + + if applicationCredentialID == "" && applicationCredentialName != "" && applicationCredentialSecret != "" { + if userID == "" && username == "" { + return nilOptions, gophercloud.ErrMissingAnyoneOfEnvironmentVariables{ + EnvironmentVariables: []string{"OS_USERID", "OS_USERNAME"}, + } + } + if username != "" && domainID == "" && domainName == "" { + return nilOptions, gophercloud.ErrMissingAnyoneOfEnvironmentVariables{ + EnvironmentVariables: []string{"OS_DOMAIN_ID", "OS_DOMAIN_NAME"}, + } + } + } + + ao := gophercloud.AuthOptions{ + IdentityEndpoint: authURL, + UserID: userID, + Username: username, + Password: password, + TenantID: tenantID, + TenantName: tenantName, + DomainID: domainID, + DomainName: domainName, + ApplicationCredentialID: applicationCredentialID, + ApplicationCredentialName: applicationCredentialName, + ApplicationCredentialSecret: applicationCredentialSecret, + } + + return ao, nil +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/client.go b/vendor/github.com/gophercloud/gophercloud/openstack/client.go new file mode 100644 index 00000000..7a7a1803 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/client.go @@ -0,0 +1,429 @@ +package openstack + +import ( + "fmt" + "reflect" + + "github.com/gophercloud/gophercloud" + tokens2 "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens" + tokens3 "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens" + "github.com/gophercloud/gophercloud/openstack/utils" +) + +const ( + // v2 represents Keystone v2. + // It should never increase beyond 2.0. + v2 = "v2.0" + + // v3 represents Keystone v3. + // The version can be anything from v3 to v3.x. + v3 = "v3" +) + +/* +NewClient prepares an unauthenticated ProviderClient instance. +Most users will probably prefer using the AuthenticatedClient function +instead. + +This is useful if you wish to explicitly control the version of the identity +service that's used for authentication explicitly, for example. + +A basic example of using this would be: + + ao, err := openstack.AuthOptionsFromEnv() + provider, err := openstack.NewClient(ao.IdentityEndpoint) + client, err := openstack.NewIdentityV3(provider, gophercloud.EndpointOpts{}) +*/ +func NewClient(endpoint string) (*gophercloud.ProviderClient, error) { + base, err := utils.BaseEndpoint(endpoint) + if err != nil { + return nil, err + } + + endpoint = gophercloud.NormalizeURL(endpoint) + base = gophercloud.NormalizeURL(base) + + p := new(gophercloud.ProviderClient) + p.IdentityBase = base + p.IdentityEndpoint = endpoint + p.UseTokenLock() + + return p, nil +} + +/* +AuthenticatedClient logs in to an OpenStack cloud found at the identity endpoint +specified by the options, acquires a token, and returns a Provider Client +instance that's ready to operate. + +If the full path to a versioned identity endpoint was specified (example: +http://example.com:5000/v3), that path will be used as the endpoint to query. + +If a versionless endpoint was specified (example: http://example.com:5000/), +the endpoint will be queried to determine which versions of the identity service +are available, then chooses the most recent or most supported version. + +Example: + + ao, err := openstack.AuthOptionsFromEnv() + provider, err := openstack.AuthenticatedClient(ao) + client, err := openstack.NewNetworkV2(client, gophercloud.EndpointOpts{ + Region: os.Getenv("OS_REGION_NAME"), + }) +*/ +func AuthenticatedClient(options gophercloud.AuthOptions) (*gophercloud.ProviderClient, error) { + client, err := NewClient(options.IdentityEndpoint) + if err != nil { + return nil, err + } + + err = Authenticate(client, options) + if err != nil { + return nil, err + } + return client, nil +} + +// Authenticate or re-authenticate against the most recent identity service +// supported at the provided endpoint. +func Authenticate(client *gophercloud.ProviderClient, options gophercloud.AuthOptions) error { + versions := []*utils.Version{ + {ID: v2, Priority: 20, Suffix: "/v2.0/"}, + {ID: v3, Priority: 30, Suffix: "/v3/"}, + } + + chosen, endpoint, err := utils.ChooseVersion(client, versions) + if err != nil { + return err + } + + switch chosen.ID { + case v2: + return v2auth(client, endpoint, options, gophercloud.EndpointOpts{}) + case v3: + return v3auth(client, endpoint, &options, gophercloud.EndpointOpts{}) + default: + // The switch statement must be out of date from the versions list. + return fmt.Errorf("Unrecognized identity version: %s", chosen.ID) + } +} + +// AuthenticateV2 explicitly authenticates against the identity v2 endpoint. +func AuthenticateV2(client *gophercloud.ProviderClient, options gophercloud.AuthOptions, eo gophercloud.EndpointOpts) error { + return v2auth(client, "", options, eo) +} + +func v2auth(client *gophercloud.ProviderClient, endpoint string, options gophercloud.AuthOptions, eo gophercloud.EndpointOpts) error { + v2Client, err := NewIdentityV2(client, eo) + if err != nil { + return err + } + + if endpoint != "" { + v2Client.Endpoint = endpoint + } + + v2Opts := tokens2.AuthOptions{ + IdentityEndpoint: options.IdentityEndpoint, + Username: options.Username, + Password: options.Password, + TenantID: options.TenantID, + TenantName: options.TenantName, + AllowReauth: options.AllowReauth, + TokenID: options.TokenID, + } + + result := tokens2.Create(v2Client, v2Opts) + + token, err := result.ExtractToken() + if err != nil { + return err + } + + catalog, err := result.ExtractServiceCatalog() + if err != nil { + return err + } + + if options.AllowReauth { + // here we're creating a throw-away client (tac). it's a copy of the user's provider client, but + // with the token and reauth func zeroed out. combined with setting `AllowReauth` to `false`, + // this should retry authentication only once + tac := *client + tac.IsThrowaway = true + tac.ReauthFunc = nil + tac.TokenID = "" + tao := options + tao.AllowReauth = false + client.ReauthFunc = func() error { + err := v2auth(&tac, endpoint, tao, eo) + if err != nil { + return err + } + client.TokenID = tac.TokenID + return nil + } + } + client.TokenID = token.ID + client.EndpointLocator = func(opts gophercloud.EndpointOpts) (string, error) { + return V2EndpointURL(catalog, opts) + } + + return nil +} + +// AuthenticateV3 explicitly authenticates against the identity v3 service. +func AuthenticateV3(client *gophercloud.ProviderClient, options tokens3.AuthOptionsBuilder, eo gophercloud.EndpointOpts) error { + return v3auth(client, "", options, eo) +} + +func v3auth(client *gophercloud.ProviderClient, endpoint string, opts tokens3.AuthOptionsBuilder, eo gophercloud.EndpointOpts) error { + // Override the generated service endpoint with the one returned by the version endpoint. + v3Client, err := NewIdentityV3(client, eo) + if err != nil { + return err + } + + if endpoint != "" { + v3Client.Endpoint = endpoint + } + + result := tokens3.Create(v3Client, opts) + + token, err := result.ExtractToken() + if err != nil { + return err + } + + catalog, err := result.ExtractServiceCatalog() + if err != nil { + return err + } + + client.TokenID = token.ID + + if opts.CanReauth() { + // here we're creating a throw-away client (tac). it's a copy of the user's provider client, but + // with the token and reauth func zeroed out. combined with setting `AllowReauth` to `false`, + // this should retry authentication only once + tac := *client + tac.IsThrowaway = true + tac.ReauthFunc = nil + tac.TokenID = "" + var tao tokens3.AuthOptionsBuilder + switch ot := opts.(type) { + case *gophercloud.AuthOptions: + o := *ot + o.AllowReauth = false + tao = &o + case *tokens3.AuthOptions: + o := *ot + o.AllowReauth = false + tao = &o + default: + tao = opts + } + client.ReauthFunc = func() error { + err := v3auth(&tac, endpoint, tao, eo) + if err != nil { + return err + } + client.TokenID = tac.TokenID + return nil + } + } + client.EndpointLocator = func(opts gophercloud.EndpointOpts) (string, error) { + return V3EndpointURL(catalog, opts) + } + + return nil +} + +// NewIdentityV2 creates a ServiceClient that may be used to interact with the +// v2 identity service. +func NewIdentityV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + endpoint := client.IdentityBase + "v2.0/" + clientType := "identity" + var err error + if !reflect.DeepEqual(eo, gophercloud.EndpointOpts{}) { + eo.ApplyDefaults(clientType) + endpoint, err = client.EndpointLocator(eo) + if err != nil { + return nil, err + } + } + + return &gophercloud.ServiceClient{ + ProviderClient: client, + Endpoint: endpoint, + Type: clientType, + }, nil +} + +// NewIdentityV3 creates a ServiceClient that may be used to access the v3 +// identity service. +func NewIdentityV3(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + endpoint := client.IdentityBase + "v3/" + clientType := "identity" + var err error + if !reflect.DeepEqual(eo, gophercloud.EndpointOpts{}) { + eo.ApplyDefaults(clientType) + endpoint, err = client.EndpointLocator(eo) + if err != nil { + return nil, err + } + } + + // Ensure endpoint still has a suffix of v3. + // This is because EndpointLocator might have found a versionless + // endpoint or the published endpoint is still /v2.0. In both + // cases, we need to fix the endpoint to point to /v3. + base, err := utils.BaseEndpoint(endpoint) + if err != nil { + return nil, err + } + + base = gophercloud.NormalizeURL(base) + + endpoint = base + "v3/" + + return &gophercloud.ServiceClient{ + ProviderClient: client, + Endpoint: endpoint, + Type: clientType, + }, nil +} + +func initClientOpts(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts, clientType string) (*gophercloud.ServiceClient, error) { + sc := new(gophercloud.ServiceClient) + eo.ApplyDefaults(clientType) + url, err := client.EndpointLocator(eo) + if err != nil { + return sc, err + } + sc.ProviderClient = client + sc.Endpoint = url + sc.Type = clientType + return sc, nil +} + +// NewObjectStorageV1 creates a ServiceClient that may be used with the v1 +// object storage package. +func NewObjectStorageV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "object-store") +} + +// NewComputeV2 creates a ServiceClient that may be used with the v2 compute +// package. +func NewComputeV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "compute") +} + +// NewNetworkV2 creates a ServiceClient that may be used with the v2 network +// package. +func NewNetworkV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + sc, err := initClientOpts(client, eo, "network") + sc.ResourceBase = sc.Endpoint + "v2.0/" + return sc, err +} + +// NewBlockStorageV1 creates a ServiceClient that may be used to access the v1 +// block storage service. +func NewBlockStorageV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "volume") +} + +// NewBlockStorageV2 creates a ServiceClient that may be used to access the v2 +// block storage service. +func NewBlockStorageV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "volumev2") +} + +// NewBlockStorageV3 creates a ServiceClient that may be used to access the v3 block storage service. +func NewBlockStorageV3(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "volumev3") +} + +// NewSharedFileSystemV2 creates a ServiceClient that may be used to access the v2 shared file system service. +func NewSharedFileSystemV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "sharev2") +} + +// NewCDNV1 creates a ServiceClient that may be used to access the OpenStack v1 +// CDN service. +func NewCDNV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "cdn") +} + +// NewOrchestrationV1 creates a ServiceClient that may be used to access the v1 +// orchestration service. +func NewOrchestrationV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "orchestration") +} + +// NewDBV1 creates a ServiceClient that may be used to access the v1 DB service. +func NewDBV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "database") +} + +// NewDNSV2 creates a ServiceClient that may be used to access the v2 DNS +// service. +func NewDNSV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + sc, err := initClientOpts(client, eo, "dns") + sc.ResourceBase = sc.Endpoint + "v2/" + return sc, err +} + +// NewImageServiceV2 creates a ServiceClient that may be used to access the v2 +// image service. +func NewImageServiceV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + sc, err := initClientOpts(client, eo, "image") + sc.ResourceBase = sc.Endpoint + "v2/" + return sc, err +} + +// NewLoadBalancerV2 creates a ServiceClient that may be used to access the v2 +// load balancer service. +func NewLoadBalancerV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + sc, err := initClientOpts(client, eo, "load-balancer") + sc.ResourceBase = sc.Endpoint + "v2.0/" + return sc, err +} + +// NewClusteringV1 creates a ServiceClient that may be used with the v1 clustering +// package. +func NewClusteringV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "clustering") +} + +// NewMessagingV2 creates a ServiceClient that may be used with the v2 messaging +// service. +func NewMessagingV2(client *gophercloud.ProviderClient, clientID string, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + sc, err := initClientOpts(client, eo, "messaging") + sc.MoreHeaders = map[string]string{"Client-ID": clientID} + return sc, err +} + +// NewContainerV1 creates a ServiceClient that may be used with v1 container package +func NewContainerV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "container") +} + +// NewKeyManagerV1 creates a ServiceClient that may be used with the v1 key +// manager service. +func NewKeyManagerV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + sc, err := initClientOpts(client, eo, "key-manager") + sc.ResourceBase = sc.Endpoint + "v1/" + return sc, err +} + +// NewContainerInfraV1 creates a ServiceClient that may be used with the v1 container infra management +// package. +func NewContainerInfraV1(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "container-infra") +} + +// NewWorkflowV2 creates a ServiceClient that may be used with the v2 workflow management package. +func NewWorkflowV2(client *gophercloud.ProviderClient, eo gophercloud.EndpointOpts) (*gophercloud.ServiceClient, error) { + return initClientOpts(client, eo, "workflowv2") +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/doc.go b/vendor/github.com/gophercloud/gophercloud/openstack/doc.go new file mode 100644 index 00000000..cedf1f4d --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/doc.go @@ -0,0 +1,14 @@ +/* +Package openstack contains resources for the individual OpenStack projects +supported in Gophercloud. It also includes functions to authenticate to an +OpenStack cloud and for provisioning various service-level clients. + +Example of Creating a Service Client + + ao, err := openstack.AuthOptionsFromEnv() + provider, err := openstack.AuthenticatedClient(ao) + client, err := openstack.NewNetworkV2(client, gophercloud.EndpointOpts{ + Region: os.Getenv("OS_REGION_NAME"), + }) +*/ +package openstack diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/endpoint_location.go b/vendor/github.com/gophercloud/gophercloud/openstack/endpoint_location.go new file mode 100644 index 00000000..12c8aebc --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/endpoint_location.go @@ -0,0 +1,107 @@ +package openstack + +import ( + "github.com/gophercloud/gophercloud" + tokens2 "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens" + tokens3 "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens" +) + +/* +V2EndpointURL discovers the endpoint URL for a specific service from a +ServiceCatalog acquired during the v2 identity service. + +The specified EndpointOpts are used to identify a unique, unambiguous endpoint +to return. It's an error both when multiple endpoints match the provided +criteria and when none do. The minimum that can be specified is a Type, but you +will also often need to specify a Name and/or a Region depending on what's +available on your OpenStack deployment. +*/ +func V2EndpointURL(catalog *tokens2.ServiceCatalog, opts gophercloud.EndpointOpts) (string, error) { + // Extract Endpoints from the catalog entries that match the requested Type, Name if provided, and Region if provided. + var endpoints = make([]tokens2.Endpoint, 0, 1) + for _, entry := range catalog.Entries { + if (entry.Type == opts.Type) && (opts.Name == "" || entry.Name == opts.Name) { + for _, endpoint := range entry.Endpoints { + if opts.Region == "" || endpoint.Region == opts.Region { + endpoints = append(endpoints, endpoint) + } + } + } + } + + // Report an error if the options were ambiguous. + if len(endpoints) > 1 { + err := &ErrMultipleMatchingEndpointsV2{} + err.Endpoints = endpoints + return "", err + } + + // Extract the appropriate URL from the matching Endpoint. + for _, endpoint := range endpoints { + switch opts.Availability { + case gophercloud.AvailabilityPublic: + return gophercloud.NormalizeURL(endpoint.PublicURL), nil + case gophercloud.AvailabilityInternal: + return gophercloud.NormalizeURL(endpoint.InternalURL), nil + case gophercloud.AvailabilityAdmin: + return gophercloud.NormalizeURL(endpoint.AdminURL), nil + default: + err := &ErrInvalidAvailabilityProvided{} + err.Argument = "Availability" + err.Value = opts.Availability + return "", err + } + } + + // Report an error if there were no matching endpoints. + err := &gophercloud.ErrEndpointNotFound{} + return "", err +} + +/* +V3EndpointURL discovers the endpoint URL for a specific service from a Catalog +acquired during the v3 identity service. + +The specified EndpointOpts are used to identify a unique, unambiguous endpoint +to return. It's an error both when multiple endpoints match the provided +criteria and when none do. The minimum that can be specified is a Type, but you +will also often need to specify a Name and/or a Region depending on what's +available on your OpenStack deployment. +*/ +func V3EndpointURL(catalog *tokens3.ServiceCatalog, opts gophercloud.EndpointOpts) (string, error) { + // Extract Endpoints from the catalog entries that match the requested Type, Interface, + // Name if provided, and Region if provided. + var endpoints = make([]tokens3.Endpoint, 0, 1) + for _, entry := range catalog.Entries { + if (entry.Type == opts.Type) && (opts.Name == "" || entry.Name == opts.Name) { + for _, endpoint := range entry.Endpoints { + if opts.Availability != gophercloud.AvailabilityAdmin && + opts.Availability != gophercloud.AvailabilityPublic && + opts.Availability != gophercloud.AvailabilityInternal { + err := &ErrInvalidAvailabilityProvided{} + err.Argument = "Availability" + err.Value = opts.Availability + return "", err + } + if (opts.Availability == gophercloud.Availability(endpoint.Interface)) && + (opts.Region == "" || endpoint.Region == opts.Region || endpoint.RegionID == opts.Region) { + endpoints = append(endpoints, endpoint) + } + } + } + } + + // Report an error if the options were ambiguous. + if len(endpoints) > 1 { + return "", ErrMultipleMatchingEndpointsV3{Endpoints: endpoints} + } + + // Extract the URL from the matching Endpoint. + for _, endpoint := range endpoints { + return gophercloud.NormalizeURL(endpoint.URL), nil + } + + // Report an error if there were no matching endpoints. + err := &gophercloud.ErrEndpointNotFound{} + return "", err +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/errors.go b/vendor/github.com/gophercloud/gophercloud/openstack/errors.go new file mode 100644 index 00000000..df410b1c --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/errors.go @@ -0,0 +1,71 @@ +package openstack + +import ( + "fmt" + + "github.com/gophercloud/gophercloud" + tokens2 "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens" + tokens3 "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens" +) + +// ErrEndpointNotFound is the error when no suitable endpoint can be found +// in the user's catalog +type ErrEndpointNotFound struct{ gophercloud.BaseError } + +func (e ErrEndpointNotFound) Error() string { + return "No suitable endpoint could be found in the service catalog." +} + +// ErrInvalidAvailabilityProvided is the error when an invalid endpoint +// availability is provided +type ErrInvalidAvailabilityProvided struct{ gophercloud.ErrInvalidInput } + +func (e ErrInvalidAvailabilityProvided) Error() string { + return fmt.Sprintf("Unexpected availability in endpoint query: %s", e.Value) +} + +// ErrMultipleMatchingEndpointsV2 is the error when more than one endpoint +// for the given options is found in the v2 catalog +type ErrMultipleMatchingEndpointsV2 struct { + gophercloud.BaseError + Endpoints []tokens2.Endpoint +} + +func (e ErrMultipleMatchingEndpointsV2) Error() string { + return fmt.Sprintf("Discovered %d matching endpoints: %#v", len(e.Endpoints), e.Endpoints) +} + +// ErrMultipleMatchingEndpointsV3 is the error when more than one endpoint +// for the given options is found in the v3 catalog +type ErrMultipleMatchingEndpointsV3 struct { + gophercloud.BaseError + Endpoints []tokens3.Endpoint +} + +func (e ErrMultipleMatchingEndpointsV3) Error() string { + return fmt.Sprintf("Discovered %d matching endpoints: %#v", len(e.Endpoints), e.Endpoints) +} + +// ErrNoAuthURL is the error when the OS_AUTH_URL environment variable is not +// found +type ErrNoAuthURL struct{ gophercloud.ErrInvalidInput } + +func (e ErrNoAuthURL) Error() string { + return "Environment variable OS_AUTH_URL needs to be set." +} + +// ErrNoUsername is the error when the OS_USERNAME environment variable is not +// found +type ErrNoUsername struct{ gophercloud.ErrInvalidInput } + +func (e ErrNoUsername) Error() string { + return "Environment variable OS_USERNAME needs to be set." +} + +// ErrNoPassword is the error when the OS_PASSWORD environment variable is not +// found +type ErrNoPassword struct{ gophercloud.ErrInvalidInput } + +func (e ErrNoPassword) Error() string { + return "Environment variable OS_PASSWORD needs to be set." +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/doc.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/doc.go new file mode 100644 index 00000000..45623369 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/doc.go @@ -0,0 +1,65 @@ +/* +Package tenants provides information and interaction with the +tenants API resource for the OpenStack Identity service. + +See http://developer.openstack.org/api-ref-identity-v2.html#identity-auth-v2 +and http://developer.openstack.org/api-ref-identity-v2.html#admin-tenants +for more information. + +Example to List Tenants + + listOpts := tenants.ListOpts{ + Limit: 2, + } + + allPages, err := tenants.List(identityClient, listOpts).AllPages() + if err != nil { + panic(err) + } + + allTenants, err := tenants.ExtractTenants(allPages) + if err != nil { + panic(err) + } + + for _, tenant := range allTenants { + fmt.Printf("%+v\n", tenant) + } + +Example to Create a Tenant + + createOpts := tenants.CreateOpts{ + Name: "tenant_name", + Description: "this is a tenant", + Enabled: gophercloud.Enabled, + } + + tenant, err := tenants.Create(identityClient, createOpts).Extract() + if err != nil { + panic(err) + } + +Example to Update a Tenant + + tenantID := "e6db6ed6277c461a853458589063b295" + + updateOpts := tenants.UpdateOpts{ + Description: "this is a new description", + Enabled: gophercloud.Disabled, + } + + tenant, err := tenants.Update(identityClient, tenantID, updateOpts).Extract() + if err != nil { + panic(err) + } + +Example to Delete a Tenant + + tenantID := "e6db6ed6277c461a853458589063b295" + + err := tenants.Delete(identitYClient, tenantID).ExtractErr() + if err != nil { + panic(err) + } +*/ +package tenants diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/requests.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/requests.go new file mode 100644 index 00000000..f21a58f1 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/requests.go @@ -0,0 +1,116 @@ +package tenants + +import ( + "github.com/gophercloud/gophercloud" + "github.com/gophercloud/gophercloud/pagination" +) + +// ListOpts filters the Tenants that are returned by the List call. +type ListOpts struct { + // Marker is the ID of the last Tenant on the previous page. + Marker string `q:"marker"` + + // Limit specifies the page size. + Limit int `q:"limit"` +} + +// List enumerates the Tenants to which the current token has access. +func List(client *gophercloud.ServiceClient, opts *ListOpts) pagination.Pager { + url := listURL(client) + if opts != nil { + q, err := gophercloud.BuildQueryString(opts) + if err != nil { + return pagination.Pager{Err: err} + } + url += q.String() + } + return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { + return TenantPage{pagination.LinkedPageBase{PageResult: r}} + }) +} + +// CreateOpts represents the options needed when creating new tenant. +type CreateOpts struct { + // Name is the name of the tenant. + Name string `json:"name" required:"true"` + + // Description is the description of the tenant. + Description string `json:"description,omitempty"` + + // Enabled sets the tenant status to enabled or disabled. + Enabled *bool `json:"enabled,omitempty"` +} + +// CreateOptsBuilder enables extensions to add additional parameters to the +// Create request. +type CreateOptsBuilder interface { + ToTenantCreateMap() (map[string]interface{}, error) +} + +// ToTenantCreateMap assembles a request body based on the contents of +// a CreateOpts. +func (opts CreateOpts) ToTenantCreateMap() (map[string]interface{}, error) { + return gophercloud.BuildRequestBody(opts, "tenant") +} + +// Create is the operation responsible for creating new tenant. +func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) (r CreateResult) { + b, err := opts.ToTenantCreateMap() + if err != nil { + r.Err = err + return + } + _, r.Err = client.Post(createURL(client), b, &r.Body, &gophercloud.RequestOpts{ + OkCodes: []int{200, 201}, + }) + return +} + +// Get requests details on a single tenant by ID. +func Get(client *gophercloud.ServiceClient, id string) (r GetResult) { + _, r.Err = client.Get(getURL(client, id), &r.Body, nil) + return +} + +// UpdateOptsBuilder allows extensions to add additional parameters to the +// Update request. +type UpdateOptsBuilder interface { + ToTenantUpdateMap() (map[string]interface{}, error) +} + +// UpdateOpts specifies the base attributes that may be updated on an existing +// tenant. +type UpdateOpts struct { + // Name is the name of the tenant. + Name string `json:"name,omitempty"` + + // Description is the description of the tenant. + Description *string `json:"description,omitempty"` + + // Enabled sets the tenant status to enabled or disabled. + Enabled *bool `json:"enabled,omitempty"` +} + +// ToTenantUpdateMap formats an UpdateOpts structure into a request body. +func (opts UpdateOpts) ToTenantUpdateMap() (map[string]interface{}, error) { + return gophercloud.BuildRequestBody(opts, "tenant") +} + +// Update is the operation responsible for updating exist tenants by their TenantID. +func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) (r UpdateResult) { + b, err := opts.ToTenantUpdateMap() + if err != nil { + r.Err = err + return + } + _, r.Err = client.Put(updateURL(client, id), &b, &r.Body, &gophercloud.RequestOpts{ + OkCodes: []int{200}, + }) + return +} + +// Delete is the operation responsible for permanently deleting a tenant. +func Delete(client *gophercloud.ServiceClient, id string) (r DeleteResult) { + _, r.Err = client.Delete(deleteURL(client, id), nil) + return +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/results.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/results.go new file mode 100644 index 00000000..bb6c2c6b --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/results.go @@ -0,0 +1,91 @@ +package tenants + +import ( + "github.com/gophercloud/gophercloud" + "github.com/gophercloud/gophercloud/pagination" +) + +// Tenant is a grouping of users in the identity service. +type Tenant struct { + // ID is a unique identifier for this tenant. + ID string `json:"id"` + + // Name is a friendlier user-facing name for this tenant. + Name string `json:"name"` + + // Description is a human-readable explanation of this Tenant's purpose. + Description string `json:"description"` + + // Enabled indicates whether or not a tenant is active. + Enabled bool `json:"enabled"` +} + +// TenantPage is a single page of Tenant results. +type TenantPage struct { + pagination.LinkedPageBase +} + +// IsEmpty determines whether or not a page of Tenants contains any results. +func (r TenantPage) IsEmpty() (bool, error) { + tenants, err := ExtractTenants(r) + return len(tenants) == 0, err +} + +// NextPageURL extracts the "next" link from the tenants_links section of the result. +func (r TenantPage) NextPageURL() (string, error) { + var s struct { + Links []gophercloud.Link `json:"tenants_links"` + } + err := r.ExtractInto(&s) + if err != nil { + return "", err + } + return gophercloud.ExtractNextURL(s.Links) +} + +// ExtractTenants returns a slice of Tenants contained in a single page of +// results. +func ExtractTenants(r pagination.Page) ([]Tenant, error) { + var s struct { + Tenants []Tenant `json:"tenants"` + } + err := (r.(TenantPage)).ExtractInto(&s) + return s.Tenants, err +} + +type tenantResult struct { + gophercloud.Result +} + +// Extract interprets any tenantResults as a Tenant. +func (r tenantResult) Extract() (*Tenant, error) { + var s struct { + Tenant *Tenant `json:"tenant"` + } + err := r.ExtractInto(&s) + return s.Tenant, err +} + +// GetResult is the response from a Get request. Call its Extract method to +// interpret it as a Tenant. +type GetResult struct { + tenantResult +} + +// CreateResult is the response from a Create request. Call its Extract method +// to interpret it as a Tenant. +type CreateResult struct { + tenantResult +} + +// DeleteResult is the response from a Get request. Call its ExtractErr method +// to determine if the call succeeded or failed. +type DeleteResult struct { + gophercloud.ErrResult +} + +// UpdateResult is the response from a Update request. Call its Extract method +// to interpret it as a Tenant. +type UpdateResult struct { + tenantResult +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/urls.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/urls.go new file mode 100644 index 00000000..0f026690 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tenants/urls.go @@ -0,0 +1,23 @@ +package tenants + +import "github.com/gophercloud/gophercloud" + +func listURL(client *gophercloud.ServiceClient) string { + return client.ServiceURL("tenants") +} + +func getURL(client *gophercloud.ServiceClient, tenantID string) string { + return client.ServiceURL("tenants", tenantID) +} + +func createURL(client *gophercloud.ServiceClient) string { + return client.ServiceURL("tenants") +} + +func deleteURL(client *gophercloud.ServiceClient, tenantID string) string { + return client.ServiceURL("tenants", tenantID) +} + +func updateURL(client *gophercloud.ServiceClient, tenantID string) string { + return client.ServiceURL("tenants", tenantID) +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/doc.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/doc.go new file mode 100644 index 00000000..5375eea8 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/doc.go @@ -0,0 +1,46 @@ +/* +Package tokens provides information and interaction with the token API +resource for the OpenStack Identity service. + +For more information, see: +http://developer.openstack.org/api-ref-identity-v2.html#identity-auth-v2 + +Example to Create an Unscoped Token from a Password + + authOpts := gophercloud.AuthOptions{ + Username: "user", + Password: "pass" + } + + token, err := tokens.Create(identityClient, authOpts).ExtractToken() + if err != nil { + panic(err) + } + +Example to Create a Token from a Tenant ID and Password + + authOpts := gophercloud.AuthOptions{ + Username: "user", + Password: "password", + TenantID: "fc394f2ab2df4114bde39905f800dc57" + } + + token, err := tokens.Create(identityClient, authOpts).ExtractToken() + if err != nil { + panic(err) + } + +Example to Create a Token from a Tenant Name and Password + + authOpts := gophercloud.AuthOptions{ + Username: "user", + Password: "password", + TenantName: "tenantname" + } + + token, err := tokens.Create(identityClient, authOpts).ExtractToken() + if err != nil { + panic(err) + } +*/ +package tokens diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/requests.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/requests.go new file mode 100644 index 00000000..ab32368c --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/requests.go @@ -0,0 +1,103 @@ +package tokens + +import "github.com/gophercloud/gophercloud" + +// PasswordCredentialsV2 represents the required options to authenticate +// with a username and password. +type PasswordCredentialsV2 struct { + Username string `json:"username" required:"true"` + Password string `json:"password" required:"true"` +} + +// TokenCredentialsV2 represents the required options to authenticate +// with a token. +type TokenCredentialsV2 struct { + ID string `json:"id,omitempty" required:"true"` +} + +// AuthOptionsV2 wraps a gophercloud AuthOptions in order to adhere to the +// AuthOptionsBuilder interface. +type AuthOptionsV2 struct { + PasswordCredentials *PasswordCredentialsV2 `json:"passwordCredentials,omitempty" xor:"TokenCredentials"` + + // The TenantID and TenantName fields are optional for the Identity V2 API. + // Some providers allow you to specify a TenantName instead of the TenantId. + // Some require both. Your provider's authentication policies will determine + // how these fields influence authentication. + TenantID string `json:"tenantId,omitempty"` + TenantName string `json:"tenantName,omitempty"` + + // TokenCredentials allows users to authenticate (possibly as another user) + // with an authentication token ID. + TokenCredentials *TokenCredentialsV2 `json:"token,omitempty" xor:"PasswordCredentials"` +} + +// AuthOptionsBuilder allows extensions to add additional parameters to the +// token create request. +type AuthOptionsBuilder interface { + // ToTokenCreateMap assembles the Create request body, returning an error + // if parameters are missing or inconsistent. + ToTokenV2CreateMap() (map[string]interface{}, error) +} + +// AuthOptions are the valid options for Openstack Identity v2 authentication. +// For field descriptions, see gophercloud.AuthOptions. +type AuthOptions struct { + IdentityEndpoint string `json:"-"` + Username string `json:"username,omitempty"` + Password string `json:"password,omitempty"` + TenantID string `json:"tenantId,omitempty"` + TenantName string `json:"tenantName,omitempty"` + AllowReauth bool `json:"-"` + TokenID string +} + +// ToTokenV2CreateMap builds a token request body from the given AuthOptions. +func (opts AuthOptions) ToTokenV2CreateMap() (map[string]interface{}, error) { + v2Opts := AuthOptionsV2{ + TenantID: opts.TenantID, + TenantName: opts.TenantName, + } + + if opts.Password != "" { + v2Opts.PasswordCredentials = &PasswordCredentialsV2{ + Username: opts.Username, + Password: opts.Password, + } + } else { + v2Opts.TokenCredentials = &TokenCredentialsV2{ + ID: opts.TokenID, + } + } + + b, err := gophercloud.BuildRequestBody(v2Opts, "auth") + if err != nil { + return nil, err + } + return b, nil +} + +// Create authenticates to the identity service and attempts to acquire a Token. +// Generally, rather than interact with this call directly, end users should +// call openstack.AuthenticatedClient(), which abstracts all of the gory details +// about navigating service catalogs and such. +func Create(client *gophercloud.ServiceClient, auth AuthOptionsBuilder) (r CreateResult) { + b, err := auth.ToTokenV2CreateMap() + if err != nil { + r.Err = err + return + } + _, r.Err = client.Post(CreateURL(client), b, &r.Body, &gophercloud.RequestOpts{ + OkCodes: []int{200, 203}, + MoreHeaders: map[string]string{"X-Auth-Token": ""}, + }) + return +} + +// Get validates and retrieves information for user's token. +func Get(client *gophercloud.ServiceClient, token string) (r GetResult) { + _, r.Err = client.Get(GetURL(client, token), &r.Body, &gophercloud.RequestOpts{ + OkCodes: []int{200, 203}, + }) + return +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/results.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/results.go new file mode 100644 index 00000000..b1132677 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/results.go @@ -0,0 +1,159 @@ +package tokens + +import ( + "time" + + "github.com/gophercloud/gophercloud" + "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants" +) + +// Token provides only the most basic information related to an authentication +// token. +type Token struct { + // ID provides the primary means of identifying a user to the OpenStack API. + // OpenStack defines this field as an opaque value, so do not depend on its + // content. It is safe, however, to compare for equality. + ID string + + // ExpiresAt provides a timestamp in ISO 8601 format, indicating when the + // authentication token becomes invalid. After this point in time, future + // API requests made using this authentication token will respond with + // errors. Either the caller will need to reauthenticate manually, or more + // preferably, the caller should exploit automatic re-authentication. + // See the AuthOptions structure for more details. + ExpiresAt time.Time + + // Tenant provides information about the tenant to which this token grants + // access. + Tenant tenants.Tenant +} + +// Role is a role for a user. +type Role struct { + Name string `json:"name"` +} + +// User is an OpenStack user. +type User struct { + ID string `json:"id"` + Name string `json:"name"` + UserName string `json:"username"` + Roles []Role `json:"roles"` +} + +// Endpoint represents a single API endpoint offered by a service. +// It provides the public and internal URLs, if supported, along with a region +// specifier, again if provided. +// +// The significance of the Region field will depend upon your provider. +// +// In addition, the interface offered by the service will have version +// information associated with it through the VersionId, VersionInfo, and +// VersionList fields, if provided or supported. +// +// In all cases, fields which aren't supported by the provider and service +// combined will assume a zero-value (""). +type Endpoint struct { + TenantID string `json:"tenantId"` + PublicURL string `json:"publicURL"` + InternalURL string `json:"internalURL"` + AdminURL string `json:"adminURL"` + Region string `json:"region"` + VersionID string `json:"versionId"` + VersionInfo string `json:"versionInfo"` + VersionList string `json:"versionList"` +} + +// CatalogEntry provides a type-safe interface to an Identity API V2 service +// catalog listing. +// +// Each class of service, such as cloud DNS or block storage services, will have +// a single CatalogEntry representing it. +// +// Note: when looking for the desired service, try, whenever possible, to key +// off the type field. Otherwise, you'll tie the representation of the service +// to a specific provider. +type CatalogEntry struct { + // Name will contain the provider-specified name for the service. + Name string `json:"name"` + + // Type will contain a type string if OpenStack defines a type for the + // service. Otherwise, for provider-specific services, the provider may assign + // their own type strings. + Type string `json:"type"` + + // Endpoints will let the caller iterate over all the different endpoints that + // may exist for the service. + Endpoints []Endpoint `json:"endpoints"` +} + +// ServiceCatalog provides a view into the service catalog from a previous, +// successful authentication. +type ServiceCatalog struct { + Entries []CatalogEntry +} + +// CreateResult is the response from a Create request. Use ExtractToken() to +// interpret it as a Token, or ExtractServiceCatalog() to interpret it as a +// service catalog. +type CreateResult struct { + gophercloud.Result +} + +// GetResult is the deferred response from a Get call, which is the same with a +// Created token. Use ExtractUser() to interpret it as a User. +type GetResult struct { + CreateResult +} + +// ExtractToken returns the just-created Token from a CreateResult. +func (r CreateResult) ExtractToken() (*Token, error) { + var s struct { + Access struct { + Token struct { + Expires string `json:"expires"` + ID string `json:"id"` + Tenant tenants.Tenant `json:"tenant"` + } `json:"token"` + } `json:"access"` + } + + err := r.ExtractInto(&s) + if err != nil { + return nil, err + } + + expiresTs, err := time.Parse(gophercloud.RFC3339Milli, s.Access.Token.Expires) + if err != nil { + return nil, err + } + + return &Token{ + ID: s.Access.Token.ID, + ExpiresAt: expiresTs, + Tenant: s.Access.Token.Tenant, + }, nil +} + +// ExtractServiceCatalog returns the ServiceCatalog that was generated along +// with the user's Token. +func (r CreateResult) ExtractServiceCatalog() (*ServiceCatalog, error) { + var s struct { + Access struct { + Entries []CatalogEntry `json:"serviceCatalog"` + } `json:"access"` + } + err := r.ExtractInto(&s) + return &ServiceCatalog{Entries: s.Access.Entries}, err +} + +// ExtractUser returns the User from a GetResult. +func (r GetResult) ExtractUser() (*User, error) { + var s struct { + Access struct { + User User `json:"user"` + } `json:"access"` + } + err := r.ExtractInto(&s) + return &s.Access.User, err +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/urls.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/urls.go new file mode 100644 index 00000000..ee0a28f2 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v2/tokens/urls.go @@ -0,0 +1,13 @@ +package tokens + +import "github.com/gophercloud/gophercloud" + +// CreateURL generates the URL used to create new Tokens. +func CreateURL(client *gophercloud.ServiceClient) string { + return client.ServiceURL("tokens") +} + +// GetURL generates the URL used to Validate Tokens. +func GetURL(client *gophercloud.ServiceClient, token string) string { + return client.ServiceURL("tokens", token) +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/doc.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/doc.go new file mode 100644 index 00000000..966e128f --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/doc.go @@ -0,0 +1,108 @@ +/* +Package tokens provides information and interaction with the token API +resource for the OpenStack Identity service. + +For more information, see: +http://developer.openstack.org/api-ref-identity-v3.html#tokens-v3 + +Example to Create a Token From a Username and Password + + authOptions := tokens.AuthOptions{ + UserID: "username", + Password: "password", + } + + token, err := tokens.Create(identityClient, authOptions).ExtractToken() + if err != nil { + panic(err) + } + +Example to Create a Token From a Username, Password, and Domain + + authOptions := tokens.AuthOptions{ + UserID: "username", + Password: "password", + DomainID: "default", + } + + token, err := tokens.Create(identityClient, authOptions).ExtractToken() + if err != nil { + panic(err) + } + + authOptions = tokens.AuthOptions{ + UserID: "username", + Password: "password", + DomainName: "default", + } + + token, err = tokens.Create(identityClient, authOptions).ExtractToken() + if err != nil { + panic(err) + } + +Example to Create a Token From a Token + + authOptions := tokens.AuthOptions{ + TokenID: "token_id", + } + + token, err := tokens.Create(identityClient, authOptions).ExtractToken() + if err != nil { + panic(err) + } + +Example to Create a Token from a Username and Password with Project ID Scope + + scope := tokens.Scope{ + ProjectID: "0fe36e73809d46aeae6705c39077b1b3", + } + + authOptions := tokens.AuthOptions{ + Scope: &scope, + UserID: "username", + Password: "password", + } + + token, err = tokens.Create(identityClient, authOptions).ExtractToken() + if err != nil { + panic(err) + } + +Example to Create a Token from a Username and Password with Domain ID Scope + + scope := tokens.Scope{ + DomainID: "default", + } + + authOptions := tokens.AuthOptions{ + Scope: &scope, + UserID: "username", + Password: "password", + } + + token, err = tokens.Create(identityClient, authOptions).ExtractToken() + if err != nil { + panic(err) + } + +Example to Create a Token from a Username and Password with Project Name Scope + + scope := tokens.Scope{ + ProjectName: "project_name", + DomainID: "default", + } + + authOptions := tokens.AuthOptions{ + Scope: &scope, + UserID: "username", + Password: "password", + } + + token, err = tokens.Create(identityClient, authOptions).ExtractToken() + if err != nil { + panic(err) + } + +*/ +package tokens diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/requests.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/requests.go new file mode 100644 index 00000000..2d20fa6f --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/requests.go @@ -0,0 +1,162 @@ +package tokens + +import "github.com/gophercloud/gophercloud" + +// Scope allows a created token to be limited to a specific domain or project. +type Scope struct { + ProjectID string + ProjectName string + DomainID string + DomainName string +} + +// AuthOptionsBuilder provides the ability for extensions to add additional +// parameters to AuthOptions. Extensions must satisfy all required methods. +type AuthOptionsBuilder interface { + // ToTokenV3CreateMap assembles the Create request body, returning an error + // if parameters are missing or inconsistent. + ToTokenV3CreateMap(map[string]interface{}) (map[string]interface{}, error) + ToTokenV3ScopeMap() (map[string]interface{}, error) + CanReauth() bool +} + +// AuthOptions represents options for authenticating a user. +type AuthOptions struct { + // IdentityEndpoint specifies the HTTP endpoint that is required to work with + // the Identity API of the appropriate version. While it's ultimately needed + // by all of the identity services, it will often be populated by a + // provider-level function. + IdentityEndpoint string `json:"-"` + + // Username is required if using Identity V2 API. Consult with your provider's + // control panel to discover your account's username. In Identity V3, either + // UserID or a combination of Username and DomainID or DomainName are needed. + Username string `json:"username,omitempty"` + UserID string `json:"id,omitempty"` + + Password string `json:"password,omitempty"` + + // At most one of DomainID and DomainName must be provided if using Username + // with Identity V3. Otherwise, either are optional. + DomainID string `json:"-"` + DomainName string `json:"name,omitempty"` + + // AllowReauth should be set to true if you grant permission for Gophercloud + // to cache your credentials in memory, and to allow Gophercloud to attempt + // to re-authenticate automatically if/when your token expires. If you set + // it to false, it will not cache these settings, but re-authentication will + // not be possible. This setting defaults to false. + AllowReauth bool `json:"-"` + + // TokenID allows users to authenticate (possibly as another user) with an + // authentication token ID. + TokenID string `json:"-"` + + // Authentication through Application Credentials requires supplying name, project and secret + // For project we can use TenantID + ApplicationCredentialID string `json:"-"` + ApplicationCredentialName string `json:"-"` + ApplicationCredentialSecret string `json:"-"` + + Scope Scope `json:"-"` +} + +// ToTokenV3CreateMap builds a request body from AuthOptions. +func (opts *AuthOptions) ToTokenV3CreateMap(scope map[string]interface{}) (map[string]interface{}, error) { + gophercloudAuthOpts := gophercloud.AuthOptions{ + Username: opts.Username, + UserID: opts.UserID, + Password: opts.Password, + DomainID: opts.DomainID, + DomainName: opts.DomainName, + AllowReauth: opts.AllowReauth, + TokenID: opts.TokenID, + ApplicationCredentialID: opts.ApplicationCredentialID, + ApplicationCredentialName: opts.ApplicationCredentialName, + ApplicationCredentialSecret: opts.ApplicationCredentialSecret, + } + + return gophercloudAuthOpts.ToTokenV3CreateMap(scope) +} + +// ToTokenV3CreateMap builds a scope request body from AuthOptions. +func (opts *AuthOptions) ToTokenV3ScopeMap() (map[string]interface{}, error) { + scope := gophercloud.AuthScope(opts.Scope) + + gophercloudAuthOpts := gophercloud.AuthOptions{ + Scope: &scope, + DomainID: opts.DomainID, + DomainName: opts.DomainName, + } + + return gophercloudAuthOpts.ToTokenV3ScopeMap() +} + +func (opts *AuthOptions) CanReauth() bool { + return opts.AllowReauth +} + +func subjectTokenHeaders(c *gophercloud.ServiceClient, subjectToken string) map[string]string { + return map[string]string{ + "X-Subject-Token": subjectToken, + } +} + +// Create authenticates and either generates a new token, or changes the Scope +// of an existing token. +func Create(c *gophercloud.ServiceClient, opts AuthOptionsBuilder) (r CreateResult) { + scope, err := opts.ToTokenV3ScopeMap() + if err != nil { + r.Err = err + return + } + + b, err := opts.ToTokenV3CreateMap(scope) + if err != nil { + r.Err = err + return + } + + resp, err := c.Post(tokenURL(c), b, &r.Body, &gophercloud.RequestOpts{ + MoreHeaders: map[string]string{"X-Auth-Token": ""}, + }) + r.Err = err + if resp != nil { + r.Header = resp.Header + } + return +} + +// Get validates and retrieves information about another token. +func Get(c *gophercloud.ServiceClient, token string) (r GetResult) { + resp, err := c.Get(tokenURL(c), &r.Body, &gophercloud.RequestOpts{ + MoreHeaders: subjectTokenHeaders(c, token), + OkCodes: []int{200, 203}, + }) + if resp != nil { + r.Err = err + r.Header = resp.Header + } + return +} + +// Validate determines if a specified token is valid or not. +func Validate(c *gophercloud.ServiceClient, token string) (bool, error) { + resp, err := c.Head(tokenURL(c), &gophercloud.RequestOpts{ + MoreHeaders: subjectTokenHeaders(c, token), + OkCodes: []int{200, 204, 404}, + }) + if err != nil { + return false, err + } + + return resp.StatusCode == 200 || resp.StatusCode == 204, nil +} + +// Revoke immediately makes specified token invalid. +func Revoke(c *gophercloud.ServiceClient, token string) (r RevokeResult) { + _, r.Err = c.Delete(tokenURL(c), &gophercloud.RequestOpts{ + MoreHeaders: subjectTokenHeaders(c, token), + }) + return +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/results.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/results.go new file mode 100644 index 00000000..ebdca58f --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/results.go @@ -0,0 +1,171 @@ +package tokens + +import ( + "time" + + "github.com/gophercloud/gophercloud" +) + +// Endpoint represents a single API endpoint offered by a service. +// It matches either a public, internal or admin URL. +// If supported, it contains a region specifier, again if provided. +// The significance of the Region field will depend upon your provider. +type Endpoint struct { + ID string `json:"id"` + Region string `json:"region"` + RegionID string `json:"region_id"` + Interface string `json:"interface"` + URL string `json:"url"` +} + +// CatalogEntry provides a type-safe interface to an Identity API V3 service +// catalog listing. Each class of service, such as cloud DNS or block storage +// services, could have multiple CatalogEntry representing it (one by interface +// type, e.g public, admin or internal). +// +// Note: when looking for the desired service, try, whenever possible, to key +// off the type field. Otherwise, you'll tie the representation of the service +// to a specific provider. +type CatalogEntry struct { + // Service ID + ID string `json:"id"` + + // Name will contain the provider-specified name for the service. + Name string `json:"name"` + + // Type will contain a type string if OpenStack defines a type for the + // service. Otherwise, for provider-specific services, the provider may + // assign their own type strings. + Type string `json:"type"` + + // Endpoints will let the caller iterate over all the different endpoints that + // may exist for the service. + Endpoints []Endpoint `json:"endpoints"` +} + +// ServiceCatalog provides a view into the service catalog from a previous, +// successful authentication. +type ServiceCatalog struct { + Entries []CatalogEntry `json:"catalog"` +} + +// Domain provides information about the domain to which this token grants +// access. +type Domain struct { + ID string `json:"id"` + Name string `json:"name"` +} + +// User represents a user resource that exists in the Identity Service. +type User struct { + Domain Domain `json:"domain"` + ID string `json:"id"` + Name string `json:"name"` +} + +// Role provides information about roles to which User is authorized. +type Role struct { + ID string `json:"id"` + Name string `json:"name"` +} + +// Project provides information about project to which User is authorized. +type Project struct { + Domain Domain `json:"domain"` + ID string `json:"id"` + Name string `json:"name"` +} + +// commonResult is the response from a request. A commonResult has various +// methods which can be used to extract different details about the result. +type commonResult struct { + gophercloud.Result +} + +// Extract is a shortcut for ExtractToken. +// This function is deprecated and still present for backward compatibility. +func (r commonResult) Extract() (*Token, error) { + return r.ExtractToken() +} + +// ExtractToken interprets a commonResult as a Token. +func (r commonResult) ExtractToken() (*Token, error) { + var s Token + err := r.ExtractInto(&s) + if err != nil { + return nil, err + } + + // Parse the token itself from the stored headers. + s.ID = r.Header.Get("X-Subject-Token") + + return &s, err +} + +// ExtractServiceCatalog returns the ServiceCatalog that was generated along +// with the user's Token. +func (r commonResult) ExtractServiceCatalog() (*ServiceCatalog, error) { + var s ServiceCatalog + err := r.ExtractInto(&s) + return &s, err +} + +// ExtractUser returns the User that is the owner of the Token. +func (r commonResult) ExtractUser() (*User, error) { + var s struct { + User *User `json:"user"` + } + err := r.ExtractInto(&s) + return s.User, err +} + +// ExtractRoles returns Roles to which User is authorized. +func (r commonResult) ExtractRoles() ([]Role, error) { + var s struct { + Roles []Role `json:"roles"` + } + err := r.ExtractInto(&s) + return s.Roles, err +} + +// ExtractProject returns Project to which User is authorized. +func (r commonResult) ExtractProject() (*Project, error) { + var s struct { + Project *Project `json:"project"` + } + err := r.ExtractInto(&s) + return s.Project, err +} + +// CreateResult is the response from a Create request. Use ExtractToken() +// to interpret it as a Token, or ExtractServiceCatalog() to interpret it +// as a service catalog. +type CreateResult struct { + commonResult +} + +// GetResult is the response from a Get request. Use ExtractToken() +// to interpret it as a Token, or ExtractServiceCatalog() to interpret it +// as a service catalog. +type GetResult struct { + commonResult +} + +// RevokeResult is response from a Revoke request. +type RevokeResult struct { + commonResult +} + +// Token is a string that grants a user access to a controlled set of services +// in an OpenStack provider. Each Token is valid for a set length of time. +type Token struct { + // ID is the issued token. + ID string `json:"id"` + + // ExpiresAt is the timestamp at which this token will no longer be accepted. + ExpiresAt time.Time `json:"expires_at"` +} + +func (r commonResult) ExtractInto(v interface{}) error { + return r.ExtractIntoStructPtr(v, "token") +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/urls.go b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/urls.go new file mode 100644 index 00000000..2f864a31 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/identity/v3/tokens/urls.go @@ -0,0 +1,7 @@ +package tokens + +import "github.com/gophercloud/gophercloud" + +func tokenURL(c *gophercloud.ServiceClient) string { + return c.ServiceURL("auth", "tokens") +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/utils/base_endpoint.go b/vendor/github.com/gophercloud/gophercloud/openstack/utils/base_endpoint.go new file mode 100644 index 00000000..40080f7a --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/utils/base_endpoint.go @@ -0,0 +1,28 @@ +package utils + +import ( + "net/url" + "regexp" + "strings" +) + +// BaseEndpoint will return a URL without the /vX.Y +// portion of the URL. +func BaseEndpoint(endpoint string) (string, error) { + u, err := url.Parse(endpoint) + if err != nil { + return "", err + } + + u.RawQuery, u.Fragment = "", "" + + path := u.Path + versionRe := regexp.MustCompile("v[0-9.]+/?") + + if version := versionRe.FindString(path); version != "" { + versionIndex := strings.Index(path, version) + u.Path = path[:versionIndex] + } + + return u.String(), nil +} diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/utils/choose_version.go b/vendor/github.com/gophercloud/gophercloud/openstack/utils/choose_version.go new file mode 100644 index 00000000..27da19f9 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/utils/choose_version.go @@ -0,0 +1,111 @@ +package utils + +import ( + "fmt" + "strings" + + "github.com/gophercloud/gophercloud" +) + +// Version is a supported API version, corresponding to a vN package within the appropriate service. +type Version struct { + ID string + Suffix string + Priority int +} + +var goodStatus = map[string]bool{ + "current": true, + "supported": true, + "stable": true, +} + +// ChooseVersion queries the base endpoint of an API to choose the most recent non-experimental alternative from a service's +// published versions. +// It returns the highest-Priority Version among the alternatives that are provided, as well as its corresponding endpoint. +func ChooseVersion(client *gophercloud.ProviderClient, recognized []*Version) (*Version, string, error) { + type linkResp struct { + Href string `json:"href"` + Rel string `json:"rel"` + } + + type valueResp struct { + ID string `json:"id"` + Status string `json:"status"` + Links []linkResp `json:"links"` + } + + type versionsResp struct { + Values []valueResp `json:"values"` + } + + type response struct { + Versions versionsResp `json:"versions"` + } + + normalize := func(endpoint string) string { + if !strings.HasSuffix(endpoint, "/") { + return endpoint + "/" + } + return endpoint + } + identityEndpoint := normalize(client.IdentityEndpoint) + + // If a full endpoint is specified, check version suffixes for a match first. + for _, v := range recognized { + if strings.HasSuffix(identityEndpoint, v.Suffix) { + return v, identityEndpoint, nil + } + } + + var resp response + _, err := client.Request("GET", client.IdentityBase, &gophercloud.RequestOpts{ + JSONResponse: &resp, + OkCodes: []int{200, 300}, + }) + + if err != nil { + return nil, "", err + } + + var highest *Version + var endpoint string + + for _, value := range resp.Versions.Values { + href := "" + for _, link := range value.Links { + if link.Rel == "self" { + href = normalize(link.Href) + } + } + + for _, version := range recognized { + if strings.Contains(value.ID, version.ID) { + // Prefer a version that exactly matches the provided endpoint. + if href == identityEndpoint { + if href == "" { + return nil, "", fmt.Errorf("Endpoint missing in version %s response from %s", value.ID, client.IdentityBase) + } + return version, href, nil + } + + // Otherwise, find the highest-priority version with a whitelisted status. + if goodStatus[strings.ToLower(value.Status)] { + if highest == nil || version.Priority > highest.Priority { + highest = version + endpoint = href + } + } + } + } + } + + if highest == nil { + return nil, "", fmt.Errorf("No supported version available from endpoint %s", client.IdentityBase) + } + if endpoint == "" { + return nil, "", fmt.Errorf("Endpoint missing in version %s response from %s", highest.ID, client.IdentityBase) + } + + return highest, endpoint, nil +} diff --git a/vendor/github.com/gophercloud/gophercloud/pagination/http.go b/vendor/github.com/gophercloud/gophercloud/pagination/http.go new file mode 100644 index 00000000..757295c4 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/pagination/http.go @@ -0,0 +1,60 @@ +package pagination + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "net/url" + "strings" + + "github.com/gophercloud/gophercloud" +) + +// PageResult stores the HTTP response that returned the current page of results. +type PageResult struct { + gophercloud.Result + url.URL +} + +// PageResultFrom parses an HTTP response as JSON and returns a PageResult containing the +// results, interpreting it as JSON if the content type indicates. +func PageResultFrom(resp *http.Response) (PageResult, error) { + var parsedBody interface{} + + defer resp.Body.Close() + rawBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return PageResult{}, err + } + + if strings.HasPrefix(resp.Header.Get("Content-Type"), "application/json") { + err = json.Unmarshal(rawBody, &parsedBody) + if err != nil { + return PageResult{}, err + } + } else { + parsedBody = rawBody + } + + return PageResultFromParsed(resp, parsedBody), err +} + +// PageResultFromParsed constructs a PageResult from an HTTP response that has already had its +// body parsed as JSON (and closed). +func PageResultFromParsed(resp *http.Response, body interface{}) PageResult { + return PageResult{ + Result: gophercloud.Result{ + Body: body, + Header: resp.Header, + }, + URL: *resp.Request.URL, + } +} + +// Request performs an HTTP request and extracts the http.Response from the result. +func Request(client *gophercloud.ServiceClient, headers map[string]string, url string) (*http.Response, error) { + return client.Get(url, nil, &gophercloud.RequestOpts{ + MoreHeaders: headers, + OkCodes: []int{200, 204, 300}, + }) +} diff --git a/vendor/github.com/gophercloud/gophercloud/pagination/linked.go b/vendor/github.com/gophercloud/gophercloud/pagination/linked.go new file mode 100644 index 00000000..3656fb7f --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/pagination/linked.go @@ -0,0 +1,92 @@ +package pagination + +import ( + "fmt" + "reflect" + + "github.com/gophercloud/gophercloud" +) + +// LinkedPageBase may be embedded to implement a page that provides navigational "Next" and "Previous" links within its result. +type LinkedPageBase struct { + PageResult + + // LinkPath lists the keys that should be traversed within a response to arrive at the "next" pointer. + // If any link along the path is missing, an empty URL will be returned. + // If any link results in an unexpected value type, an error will be returned. + // When left as "nil", []string{"links", "next"} will be used as a default. + LinkPath []string +} + +// NextPageURL extracts the pagination structure from a JSON response and returns the "next" link, if one is present. +// It assumes that the links are available in a "links" element of the top-level response object. +// If this is not the case, override NextPageURL on your result type. +func (current LinkedPageBase) NextPageURL() (string, error) { + var path []string + var key string + + if current.LinkPath == nil { + path = []string{"links", "next"} + } else { + path = current.LinkPath + } + + submap, ok := current.Body.(map[string]interface{}) + if !ok { + err := gophercloud.ErrUnexpectedType{} + err.Expected = "map[string]interface{}" + err.Actual = fmt.Sprintf("%v", reflect.TypeOf(current.Body)) + return "", err + } + + for { + key, path = path[0], path[1:len(path)] + + value, ok := submap[key] + if !ok { + return "", nil + } + + if len(path) > 0 { + submap, ok = value.(map[string]interface{}) + if !ok { + err := gophercloud.ErrUnexpectedType{} + err.Expected = "map[string]interface{}" + err.Actual = fmt.Sprintf("%v", reflect.TypeOf(value)) + return "", err + } + } else { + if value == nil { + // Actual null element. + return "", nil + } + + url, ok := value.(string) + if !ok { + err := gophercloud.ErrUnexpectedType{} + err.Expected = "string" + err.Actual = fmt.Sprintf("%v", reflect.TypeOf(value)) + return "", err + } + + return url, nil + } + } +} + +// IsEmpty satisifies the IsEmpty method of the Page interface +func (current LinkedPageBase) IsEmpty() (bool, error) { + if b, ok := current.Body.([]interface{}); ok { + return len(b) == 0, nil + } + err := gophercloud.ErrUnexpectedType{} + err.Expected = "[]interface{}" + err.Actual = fmt.Sprintf("%v", reflect.TypeOf(current.Body)) + return true, err +} + +// GetBody returns the linked page's body. This method is needed to satisfy the +// Page interface. +func (current LinkedPageBase) GetBody() interface{} { + return current.Body +} diff --git a/vendor/github.com/gophercloud/gophercloud/pagination/marker.go b/vendor/github.com/gophercloud/gophercloud/pagination/marker.go new file mode 100644 index 00000000..52e53bae --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/pagination/marker.go @@ -0,0 +1,58 @@ +package pagination + +import ( + "fmt" + "reflect" + + "github.com/gophercloud/gophercloud" +) + +// MarkerPage is a stricter Page interface that describes additional functionality required for use with NewMarkerPager. +// For convenience, embed the MarkedPageBase struct. +type MarkerPage interface { + Page + + // LastMarker returns the last "marker" value on this page. + LastMarker() (string, error) +} + +// MarkerPageBase is a page in a collection that's paginated by "limit" and "marker" query parameters. +type MarkerPageBase struct { + PageResult + + // Owner is a reference to the embedding struct. + Owner MarkerPage +} + +// NextPageURL generates the URL for the page of results after this one. +func (current MarkerPageBase) NextPageURL() (string, error) { + currentURL := current.URL + + mark, err := current.Owner.LastMarker() + if err != nil { + return "", err + } + + q := currentURL.Query() + q.Set("marker", mark) + currentURL.RawQuery = q.Encode() + + return currentURL.String(), nil +} + +// IsEmpty satisifies the IsEmpty method of the Page interface +func (current MarkerPageBase) IsEmpty() (bool, error) { + if b, ok := current.Body.([]interface{}); ok { + return len(b) == 0, nil + } + err := gophercloud.ErrUnexpectedType{} + err.Expected = "[]interface{}" + err.Actual = fmt.Sprintf("%v", reflect.TypeOf(current.Body)) + return true, err +} + +// GetBody returns the linked page's body. This method is needed to satisfy the +// Page interface. +func (current MarkerPageBase) GetBody() interface{} { + return current.Body +} diff --git a/vendor/github.com/gophercloud/gophercloud/pagination/pager.go b/vendor/github.com/gophercloud/gophercloud/pagination/pager.go new file mode 100644 index 00000000..42c0b2db --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/pagination/pager.go @@ -0,0 +1,251 @@ +package pagination + +import ( + "errors" + "fmt" + "net/http" + "reflect" + "strings" + + "github.com/gophercloud/gophercloud" +) + +var ( + // ErrPageNotAvailable is returned from a Pager when a next or previous page is requested, but does not exist. + ErrPageNotAvailable = errors.New("The requested page does not exist.") +) + +// Page must be satisfied by the result type of any resource collection. +// It allows clients to interact with the resource uniformly, regardless of whether or not or how it's paginated. +// Generally, rather than implementing this interface directly, implementors should embed one of the concrete PageBase structs, +// instead. +// Depending on the pagination strategy of a particular resource, there may be an additional subinterface that the result type +// will need to implement. +type Page interface { + // NextPageURL generates the URL for the page of data that follows this collection. + // Return "" if no such page exists. + NextPageURL() (string, error) + + // IsEmpty returns true if this Page has no items in it. + IsEmpty() (bool, error) + + // GetBody returns the Page Body. This is used in the `AllPages` method. + GetBody() interface{} +} + +// Pager knows how to advance through a specific resource collection, one page at a time. +type Pager struct { + client *gophercloud.ServiceClient + + initialURL string + + createPage func(r PageResult) Page + + firstPage Page + + Err error + + // Headers supplies additional HTTP headers to populate on each paged request. + Headers map[string]string +} + +// NewPager constructs a manually-configured pager. +// Supply the URL for the first page, a function that requests a specific page given a URL, and a function that counts a page. +func NewPager(client *gophercloud.ServiceClient, initialURL string, createPage func(r PageResult) Page) Pager { + return Pager{ + client: client, + initialURL: initialURL, + createPage: createPage, + } +} + +// WithPageCreator returns a new Pager that substitutes a different page creation function. This is +// useful for overriding List functions in delegation. +func (p Pager) WithPageCreator(createPage func(r PageResult) Page) Pager { + return Pager{ + client: p.client, + initialURL: p.initialURL, + createPage: createPage, + } +} + +func (p Pager) fetchNextPage(url string) (Page, error) { + resp, err := Request(p.client, p.Headers, url) + if err != nil { + return nil, err + } + + remembered, err := PageResultFrom(resp) + if err != nil { + return nil, err + } + + return p.createPage(remembered), nil +} + +// EachPage iterates over each page returned by a Pager, yielding one at a time to a handler function. +// Return "false" from the handler to prematurely stop iterating. +func (p Pager) EachPage(handler func(Page) (bool, error)) error { + if p.Err != nil { + return p.Err + } + currentURL := p.initialURL + for { + var currentPage Page + + // if first page has already been fetched, no need to fetch it again + if p.firstPage != nil { + currentPage = p.firstPage + p.firstPage = nil + } else { + var err error + currentPage, err = p.fetchNextPage(currentURL) + if err != nil { + return err + } + } + + empty, err := currentPage.IsEmpty() + if err != nil { + return err + } + if empty { + return nil + } + + ok, err := handler(currentPage) + if err != nil { + return err + } + if !ok { + return nil + } + + currentURL, err = currentPage.NextPageURL() + if err != nil { + return err + } + if currentURL == "" { + return nil + } + } +} + +// AllPages returns all the pages from a `List` operation in a single page, +// allowing the user to retrieve all the pages at once. +func (p Pager) AllPages() (Page, error) { + // pagesSlice holds all the pages until they get converted into as Page Body. + var pagesSlice []interface{} + // body will contain the final concatenated Page body. + var body reflect.Value + + // Grab a first page to ascertain the page body type. + firstPage, err := p.fetchNextPage(p.initialURL) + if err != nil { + return nil, err + } + // Store the page type so we can use reflection to create a new mega-page of + // that type. + pageType := reflect.TypeOf(firstPage) + + // if it's a single page, just return the firstPage (first page) + if _, found := pageType.FieldByName("SinglePageBase"); found { + return firstPage, nil + } + + // store the first page to avoid getting it twice + p.firstPage = firstPage + + // Switch on the page body type. Recognized types are `map[string]interface{}`, + // `[]byte`, and `[]interface{}`. + switch pb := firstPage.GetBody().(type) { + case map[string]interface{}: + // key is the map key for the page body if the body type is `map[string]interface{}`. + var key string + // Iterate over the pages to concatenate the bodies. + err = p.EachPage(func(page Page) (bool, error) { + b := page.GetBody().(map[string]interface{}) + for k, v := range b { + // If it's a linked page, we don't want the `links`, we want the other one. + if !strings.HasSuffix(k, "links") { + // check the field's type. we only want []interface{} (which is really []map[string]interface{}) + switch vt := v.(type) { + case []interface{}: + key = k + pagesSlice = append(pagesSlice, vt...) + } + } + } + return true, nil + }) + if err != nil { + return nil, err + } + // Set body to value of type `map[string]interface{}` + body = reflect.MakeMap(reflect.MapOf(reflect.TypeOf(key), reflect.TypeOf(pagesSlice))) + body.SetMapIndex(reflect.ValueOf(key), reflect.ValueOf(pagesSlice)) + case []byte: + // Iterate over the pages to concatenate the bodies. + err = p.EachPage(func(page Page) (bool, error) { + b := page.GetBody().([]byte) + pagesSlice = append(pagesSlice, b) + // seperate pages with a comma + pagesSlice = append(pagesSlice, []byte{10}) + return true, nil + }) + if err != nil { + return nil, err + } + if len(pagesSlice) > 0 { + // Remove the trailing comma. + pagesSlice = pagesSlice[:len(pagesSlice)-1] + } + var b []byte + // Combine the slice of slices in to a single slice. + for _, slice := range pagesSlice { + b = append(b, slice.([]byte)...) + } + // Set body to value of type `bytes`. + body = reflect.New(reflect.TypeOf(b)).Elem() + body.SetBytes(b) + case []interface{}: + // Iterate over the pages to concatenate the bodies. + err = p.EachPage(func(page Page) (bool, error) { + b := page.GetBody().([]interface{}) + pagesSlice = append(pagesSlice, b...) + return true, nil + }) + if err != nil { + return nil, err + } + // Set body to value of type `[]interface{}` + body = reflect.MakeSlice(reflect.TypeOf(pagesSlice), len(pagesSlice), len(pagesSlice)) + for i, s := range pagesSlice { + body.Index(i).Set(reflect.ValueOf(s)) + } + default: + err := gophercloud.ErrUnexpectedType{} + err.Expected = "map[string]interface{}/[]byte/[]interface{}" + err.Actual = fmt.Sprintf("%T", pb) + return nil, err + } + + // Each `Extract*` function is expecting a specific type of page coming back, + // otherwise the type assertion in those functions will fail. pageType is needed + // to create a type in this method that has the same type that the `Extract*` + // function is expecting and set the Body of that object to the concatenated + // pages. + page := reflect.New(pageType) + // Set the page body to be the concatenated pages. + page.Elem().FieldByName("Body").Set(body) + // Set any additional headers that were pass along. The `objectstorage` pacakge, + // for example, passes a Content-Type header. + h := make(http.Header) + for k, v := range p.Headers { + h.Add(k, v) + } + page.Elem().FieldByName("Header").Set(reflect.ValueOf(h)) + // Type assert the page to a Page interface so that the type assertion in the + // `Extract*` methods will work. + return page.Elem().Interface().(Page), err +} diff --git a/vendor/github.com/gophercloud/gophercloud/pagination/pkg.go b/vendor/github.com/gophercloud/gophercloud/pagination/pkg.go new file mode 100644 index 00000000..912daea3 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/pagination/pkg.go @@ -0,0 +1,4 @@ +/* +Package pagination contains utilities and convenience structs that implement common pagination idioms within OpenStack APIs. +*/ +package pagination diff --git a/vendor/github.com/gophercloud/gophercloud/pagination/single.go b/vendor/github.com/gophercloud/gophercloud/pagination/single.go new file mode 100644 index 00000000..4251d649 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/pagination/single.go @@ -0,0 +1,33 @@ +package pagination + +import ( + "fmt" + "reflect" + + "github.com/gophercloud/gophercloud" +) + +// SinglePageBase may be embedded in a Page that contains all of the results from an operation at once. +type SinglePageBase PageResult + +// NextPageURL always returns "" to indicate that there are no more pages to return. +func (current SinglePageBase) NextPageURL() (string, error) { + return "", nil +} + +// IsEmpty satisifies the IsEmpty method of the Page interface +func (current SinglePageBase) IsEmpty() (bool, error) { + if b, ok := current.Body.([]interface{}); ok { + return len(b) == 0, nil + } + err := gophercloud.ErrUnexpectedType{} + err.Expected = "[]interface{}" + err.Actual = fmt.Sprintf("%v", reflect.TypeOf(current.Body)) + return true, err +} + +// GetBody returns the single page's body. This method is needed to satisfy the +// Page interface. +func (current SinglePageBase) GetBody() interface{} { + return current.Body +} diff --git a/vendor/github.com/gophercloud/gophercloud/params.go b/vendor/github.com/gophercloud/gophercloud/params.go new file mode 100644 index 00000000..b9986660 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/params.go @@ -0,0 +1,491 @@ +package gophercloud + +import ( + "encoding/json" + "fmt" + "net/url" + "reflect" + "strconv" + "strings" + "time" +) + +/* +BuildRequestBody builds a map[string]interface from the given `struct`. If +parent is not an empty string, the final map[string]interface returned will +encapsulate the built one. For example: + + disk := 1 + createOpts := flavors.CreateOpts{ + ID: "1", + Name: "m1.tiny", + Disk: &disk, + RAM: 512, + VCPUs: 1, + RxTxFactor: 1.0, + } + + body, err := gophercloud.BuildRequestBody(createOpts, "flavor") + +The above example can be run as-is, however it is recommended to look at how +BuildRequestBody is used within Gophercloud to more fully understand how it +fits within the request process as a whole rather than use it directly as shown +above. +*/ +func BuildRequestBody(opts interface{}, parent string) (map[string]interface{}, error) { + optsValue := reflect.ValueOf(opts) + if optsValue.Kind() == reflect.Ptr { + optsValue = optsValue.Elem() + } + + optsType := reflect.TypeOf(opts) + if optsType.Kind() == reflect.Ptr { + optsType = optsType.Elem() + } + + optsMap := make(map[string]interface{}) + if optsValue.Kind() == reflect.Struct { + //fmt.Printf("optsValue.Kind() is a reflect.Struct: %+v\n", optsValue.Kind()) + for i := 0; i < optsValue.NumField(); i++ { + v := optsValue.Field(i) + f := optsType.Field(i) + + if f.Name != strings.Title(f.Name) { + //fmt.Printf("Skipping field: %s...\n", f.Name) + continue + } + + //fmt.Printf("Starting on field: %s...\n", f.Name) + + zero := isZero(v) + //fmt.Printf("v is zero?: %v\n", zero) + + // if the field has a required tag that's set to "true" + if requiredTag := f.Tag.Get("required"); requiredTag == "true" { + //fmt.Printf("Checking required field [%s]:\n\tv: %+v\n\tisZero:%v\n", f.Name, v.Interface(), zero) + // if the field's value is zero, return a missing-argument error + if zero { + // if the field has a 'required' tag, it can't have a zero-value + err := ErrMissingInput{} + err.Argument = f.Name + return nil, err + } + } + + if xorTag := f.Tag.Get("xor"); xorTag != "" { + //fmt.Printf("Checking `xor` tag for field [%s] with value %+v:\n\txorTag: %s\n", f.Name, v, xorTag) + xorField := optsValue.FieldByName(xorTag) + var xorFieldIsZero bool + if reflect.ValueOf(xorField.Interface()) == reflect.Zero(xorField.Type()) { + xorFieldIsZero = true + } else { + if xorField.Kind() == reflect.Ptr { + xorField = xorField.Elem() + } + xorFieldIsZero = isZero(xorField) + } + if !(zero != xorFieldIsZero) { + err := ErrMissingInput{} + err.Argument = fmt.Sprintf("%s/%s", f.Name, xorTag) + err.Info = fmt.Sprintf("Exactly one of %s and %s must be provided", f.Name, xorTag) + return nil, err + } + } + + if orTag := f.Tag.Get("or"); orTag != "" { + //fmt.Printf("Checking `or` tag for field with:\n\tname: %+v\n\torTag:%s\n", f.Name, orTag) + //fmt.Printf("field is zero?: %v\n", zero) + if zero { + orField := optsValue.FieldByName(orTag) + var orFieldIsZero bool + if reflect.ValueOf(orField.Interface()) == reflect.Zero(orField.Type()) { + orFieldIsZero = true + } else { + if orField.Kind() == reflect.Ptr { + orField = orField.Elem() + } + orFieldIsZero = isZero(orField) + } + if orFieldIsZero { + err := ErrMissingInput{} + err.Argument = fmt.Sprintf("%s/%s", f.Name, orTag) + err.Info = fmt.Sprintf("At least one of %s and %s must be provided", f.Name, orTag) + return nil, err + } + } + } + + jsonTag := f.Tag.Get("json") + if jsonTag == "-" { + continue + } + + if v.Kind() == reflect.Slice || (v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Slice) { + sliceValue := v + if sliceValue.Kind() == reflect.Ptr { + sliceValue = sliceValue.Elem() + } + + for i := 0; i < sliceValue.Len(); i++ { + element := sliceValue.Index(i) + if element.Kind() == reflect.Struct || (element.Kind() == reflect.Ptr && element.Elem().Kind() == reflect.Struct) { + _, err := BuildRequestBody(element.Interface(), "") + if err != nil { + return nil, err + } + } + } + } + if v.Kind() == reflect.Struct || (v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct) { + if zero { + //fmt.Printf("value before change: %+v\n", optsValue.Field(i)) + if jsonTag != "" { + jsonTagPieces := strings.Split(jsonTag, ",") + if len(jsonTagPieces) > 1 && jsonTagPieces[1] == "omitempty" { + if v.CanSet() { + if !v.IsNil() { + if v.Kind() == reflect.Ptr { + v.Set(reflect.Zero(v.Type())) + } + } + //fmt.Printf("value after change: %+v\n", optsValue.Field(i)) + } + } + } + continue + } + + //fmt.Printf("Calling BuildRequestBody with:\n\tv: %+v\n\tf.Name:%s\n", v.Interface(), f.Name) + _, err := BuildRequestBody(v.Interface(), f.Name) + if err != nil { + return nil, err + } + } + } + + //fmt.Printf("opts: %+v \n", opts) + + b, err := json.Marshal(opts) + if err != nil { + return nil, err + } + + //fmt.Printf("string(b): %s\n", string(b)) + + err = json.Unmarshal(b, &optsMap) + if err != nil { + return nil, err + } + + //fmt.Printf("optsMap: %+v\n", optsMap) + + if parent != "" { + optsMap = map[string]interface{}{parent: optsMap} + } + //fmt.Printf("optsMap after parent added: %+v\n", optsMap) + return optsMap, nil + } + // Return an error if the underlying type of 'opts' isn't a struct. + return nil, fmt.Errorf("Options type is not a struct.") +} + +// EnabledState is a convenience type, mostly used in Create and Update +// operations. Because the zero value of a bool is FALSE, we need to use a +// pointer instead to indicate zero-ness. +type EnabledState *bool + +// Convenience vars for EnabledState values. +var ( + iTrue = true + iFalse = false + + Enabled EnabledState = &iTrue + Disabled EnabledState = &iFalse +) + +// IPVersion is a type for the possible IP address versions. Valid instances +// are IPv4 and IPv6 +type IPVersion int + +const ( + // IPv4 is used for IP version 4 addresses + IPv4 IPVersion = 4 + // IPv6 is used for IP version 6 addresses + IPv6 IPVersion = 6 +) + +// IntToPointer is a function for converting integers into integer pointers. +// This is useful when passing in options to operations. +func IntToPointer(i int) *int { + return &i +} + +/* +MaybeString is an internal function to be used by request methods in individual +resource packages. + +It takes a string that might be a zero value and returns either a pointer to its +address or nil. This is useful for allowing users to conveniently omit values +from an options struct by leaving them zeroed, but still pass nil to the JSON +serializer so they'll be omitted from the request body. +*/ +func MaybeString(original string) *string { + if original != "" { + return &original + } + return nil +} + +/* +MaybeInt is an internal function to be used by request methods in individual +resource packages. + +Like MaybeString, it accepts an int that may or may not be a zero value, and +returns either a pointer to its address or nil. It's intended to hint that the +JSON serializer should omit its field. +*/ +func MaybeInt(original int) *int { + if original != 0 { + return &original + } + return nil +} + +/* +func isUnderlyingStructZero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Ptr: + return isUnderlyingStructZero(v.Elem()) + default: + return isZero(v) + } +} +*/ + +var t time.Time + +func isZero(v reflect.Value) bool { + //fmt.Printf("\n\nchecking isZero for value: %+v\n", v) + switch v.Kind() { + case reflect.Ptr: + if v.IsNil() { + return true + } + return false + case reflect.Func, reflect.Map, reflect.Slice: + return v.IsNil() + case reflect.Array: + z := true + for i := 0; i < v.Len(); i++ { + z = z && isZero(v.Index(i)) + } + return z + case reflect.Struct: + if v.Type() == reflect.TypeOf(t) { + if v.Interface().(time.Time).IsZero() { + return true + } + return false + } + z := true + for i := 0; i < v.NumField(); i++ { + z = z && isZero(v.Field(i)) + } + return z + } + // Compare other types directly: + z := reflect.Zero(v.Type()) + //fmt.Printf("zero type for value: %+v\n\n\n", z) + return v.Interface() == z.Interface() +} + +/* +BuildQueryString is an internal function to be used by request methods in +individual resource packages. + +It accepts a tagged structure and expands it into a URL struct. Field names are +converted into query parameters based on a "q" tag. For example: + + type struct Something { + Bar string `q:"x_bar"` + Baz int `q:"lorem_ipsum"` + } + + instance := Something{ + Bar: "AAA", + Baz: "BBB", + } + +will be converted into "?x_bar=AAA&lorem_ipsum=BBB". + +The struct's fields may be strings, integers, or boolean values. Fields left at +their type's zero value will be omitted from the query. +*/ +func BuildQueryString(opts interface{}) (*url.URL, error) { + optsValue := reflect.ValueOf(opts) + if optsValue.Kind() == reflect.Ptr { + optsValue = optsValue.Elem() + } + + optsType := reflect.TypeOf(opts) + if optsType.Kind() == reflect.Ptr { + optsType = optsType.Elem() + } + + params := url.Values{} + + if optsValue.Kind() == reflect.Struct { + for i := 0; i < optsValue.NumField(); i++ { + v := optsValue.Field(i) + f := optsType.Field(i) + qTag := f.Tag.Get("q") + + // if the field has a 'q' tag, it goes in the query string + if qTag != "" { + tags := strings.Split(qTag, ",") + + // if the field is set, add it to the slice of query pieces + if !isZero(v) { + loop: + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + goto loop + case reflect.String: + params.Add(tags[0], v.String()) + case reflect.Int: + params.Add(tags[0], strconv.FormatInt(v.Int(), 10)) + case reflect.Bool: + params.Add(tags[0], strconv.FormatBool(v.Bool())) + case reflect.Slice: + switch v.Type().Elem() { + case reflect.TypeOf(0): + for i := 0; i < v.Len(); i++ { + params.Add(tags[0], strconv.FormatInt(v.Index(i).Int(), 10)) + } + default: + for i := 0; i < v.Len(); i++ { + params.Add(tags[0], v.Index(i).String()) + } + } + case reflect.Map: + if v.Type().Key().Kind() == reflect.String && v.Type().Elem().Kind() == reflect.String { + var s []string + for _, k := range v.MapKeys() { + value := v.MapIndex(k).String() + s = append(s, fmt.Sprintf("'%s':'%s'", k.String(), value)) + } + params.Add(tags[0], fmt.Sprintf("{%s}", strings.Join(s, ", "))) + } + } + } else { + // if the field has a 'required' tag, it can't have a zero-value + if requiredTag := f.Tag.Get("required"); requiredTag == "true" { + return &url.URL{}, fmt.Errorf("Required query parameter [%s] not set.", f.Name) + } + } + } + } + + return &url.URL{RawQuery: params.Encode()}, nil + } + // Return an error if the underlying type of 'opts' isn't a struct. + return nil, fmt.Errorf("Options type is not a struct.") +} + +/* +BuildHeaders is an internal function to be used by request methods in +individual resource packages. + +It accepts an arbitrary tagged structure and produces a string map that's +suitable for use as the HTTP headers of an outgoing request. Field names are +mapped to header names based in "h" tags. + + type struct Something { + Bar string `h:"x_bar"` + Baz int `h:"lorem_ipsum"` + } + + instance := Something{ + Bar: "AAA", + Baz: "BBB", + } + +will be converted into: + + map[string]string{ + "x_bar": "AAA", + "lorem_ipsum": "BBB", + } + +Untagged fields and fields left at their zero values are skipped. Integers, +booleans and string values are supported. +*/ +func BuildHeaders(opts interface{}) (map[string]string, error) { + optsValue := reflect.ValueOf(opts) + if optsValue.Kind() == reflect.Ptr { + optsValue = optsValue.Elem() + } + + optsType := reflect.TypeOf(opts) + if optsType.Kind() == reflect.Ptr { + optsType = optsType.Elem() + } + + optsMap := make(map[string]string) + if optsValue.Kind() == reflect.Struct { + for i := 0; i < optsValue.NumField(); i++ { + v := optsValue.Field(i) + f := optsType.Field(i) + hTag := f.Tag.Get("h") + + // if the field has a 'h' tag, it goes in the header + if hTag != "" { + tags := strings.Split(hTag, ",") + + // if the field is set, add it to the slice of query pieces + if !isZero(v) { + switch v.Kind() { + case reflect.String: + optsMap[tags[0]] = v.String() + case reflect.Int: + optsMap[tags[0]] = strconv.FormatInt(v.Int(), 10) + case reflect.Bool: + optsMap[tags[0]] = strconv.FormatBool(v.Bool()) + } + } else { + // if the field has a 'required' tag, it can't have a zero-value + if requiredTag := f.Tag.Get("required"); requiredTag == "true" { + return optsMap, fmt.Errorf("Required header [%s] not set.", f.Name) + } + } + } + + } + return optsMap, nil + } + // Return an error if the underlying type of 'opts' isn't a struct. + return optsMap, fmt.Errorf("Options type is not a struct.") +} + +// IDSliceToQueryString takes a slice of elements and converts them into a query +// string. For example, if name=foo and slice=[]int{20, 40, 60}, then the +// result would be `?name=20&name=40&name=60' +func IDSliceToQueryString(name string, ids []int) string { + str := "" + for k, v := range ids { + if k == 0 { + str += "?" + } else { + str += "&" + } + str += fmt.Sprintf("%s=%s", name, strconv.Itoa(v)) + } + return str +} + +// IntWithinRange returns TRUE if an integer falls within a defined range, and +// FALSE if not. +func IntWithinRange(val, min, max int) bool { + return val > min && val < max +} diff --git a/vendor/github.com/gophercloud/gophercloud/provider_client.go b/vendor/github.com/gophercloud/gophercloud/provider_client.go new file mode 100644 index 00000000..f2aae976 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/provider_client.go @@ -0,0 +1,412 @@ +package gophercloud + +import ( + "bytes" + "encoding/json" + "errors" + "io" + "io/ioutil" + "net/http" + "strings" + "sync" +) + +// DefaultUserAgent is the default User-Agent string set in the request header. +const DefaultUserAgent = "gophercloud/2.0.0" + +// UserAgent represents a User-Agent header. +type UserAgent struct { + // prepend is the slice of User-Agent strings to prepend to DefaultUserAgent. + // All the strings to prepend are accumulated and prepended in the Join method. + prepend []string +} + +// Prepend prepends a user-defined string to the default User-Agent string. Users +// may pass in one or more strings to prepend. +func (ua *UserAgent) Prepend(s ...string) { + ua.prepend = append(s, ua.prepend...) +} + +// Join concatenates all the user-defined User-Agend strings with the default +// Gophercloud User-Agent string. +func (ua *UserAgent) Join() string { + uaSlice := append(ua.prepend, DefaultUserAgent) + return strings.Join(uaSlice, " ") +} + +// ProviderClient stores details that are required to interact with any +// services within a specific provider's API. +// +// Generally, you acquire a ProviderClient by calling the NewClient method in +// the appropriate provider's child package, providing whatever authentication +// credentials are required. +type ProviderClient struct { + // IdentityBase is the base URL used for a particular provider's identity + // service - it will be used when issuing authenticatation requests. It + // should point to the root resource of the identity service, not a specific + // identity version. + IdentityBase string + + // IdentityEndpoint is the identity endpoint. This may be a specific version + // of the identity service. If this is the case, this endpoint is used rather + // than querying versions first. + IdentityEndpoint string + + // TokenID is the ID of the most recently issued valid token. + // NOTE: Aside from within a custom ReauthFunc, this field shouldn't be set by an application. + // To safely read or write this value, call `Token` or `SetToken`, respectively + TokenID string + + // EndpointLocator describes how this provider discovers the endpoints for + // its constituent services. + EndpointLocator EndpointLocator + + // HTTPClient allows users to interject arbitrary http, https, or other transit behaviors. + HTTPClient http.Client + + // UserAgent represents the User-Agent header in the HTTP request. + UserAgent UserAgent + + // ReauthFunc is the function used to re-authenticate the user if the request + // fails with a 401 HTTP response code. This a needed because there may be multiple + // authentication functions for different Identity service versions. + ReauthFunc func() error + + // IsThrowaway determines whether if this client is a throw-away client. It's a copy of user's provider client + // with the token and reauth func zeroed. Such client can be used to perform reauthorization. + IsThrowaway bool + + mut *sync.RWMutex + + reauthmut *reauthlock +} + +type reauthlock struct { + sync.RWMutex + reauthing bool + reauthingErr error + done *sync.Cond +} + +// AuthenticatedHeaders returns a map of HTTP headers that are common for all +// authenticated service requests. Blocks if Reauthenticate is in progress. +func (client *ProviderClient) AuthenticatedHeaders() (m map[string]string) { + if client.IsThrowaway { + return + } + if client.reauthmut != nil { + client.reauthmut.Lock() + for client.reauthmut.reauthing { + client.reauthmut.done.Wait() + } + client.reauthmut.Unlock() + } + t := client.Token() + if t == "" { + return + } + return map[string]string{"X-Auth-Token": t} +} + +// UseTokenLock creates a mutex that is used to allow safe concurrent access to the auth token. +// If the application's ProviderClient is not used concurrently, this doesn't need to be called. +func (client *ProviderClient) UseTokenLock() { + client.mut = new(sync.RWMutex) + client.reauthmut = new(reauthlock) +} + +// Token safely reads the value of the auth token from the ProviderClient. Applications should +// call this method to access the token instead of the TokenID field +func (client *ProviderClient) Token() string { + if client.mut != nil { + client.mut.RLock() + defer client.mut.RUnlock() + } + return client.TokenID +} + +// SetToken safely sets the value of the auth token in the ProviderClient. Applications may +// use this method in a custom ReauthFunc +func (client *ProviderClient) SetToken(t string) { + if client.mut != nil { + client.mut.Lock() + defer client.mut.Unlock() + } + client.TokenID = t +} + +// Reauthenticate calls client.ReauthFunc in a thread-safe way. If this is +// called because of a 401 response, the caller may pass the previous token. In +// this case, the reauthentication can be skipped if another thread has already +// reauthenticated in the meantime. If no previous token is known, an empty +// string should be passed instead to force unconditional reauthentication. +func (client *ProviderClient) Reauthenticate(previousToken string) (err error) { + if client.ReauthFunc == nil { + return nil + } + + if client.mut == nil { + return client.ReauthFunc() + } + + client.reauthmut.Lock() + if client.reauthmut.reauthing { + for !client.reauthmut.reauthing { + client.reauthmut.done.Wait() + } + err = client.reauthmut.reauthingErr + client.reauthmut.Unlock() + return err + } + client.reauthmut.Unlock() + + client.mut.Lock() + defer client.mut.Unlock() + + client.reauthmut.Lock() + client.reauthmut.reauthing = true + client.reauthmut.done = sync.NewCond(client.reauthmut) + client.reauthmut.reauthingErr = nil + client.reauthmut.Unlock() + + if previousToken == "" || client.TokenID == previousToken { + err = client.ReauthFunc() + } + + client.reauthmut.Lock() + client.reauthmut.reauthing = false + client.reauthmut.reauthingErr = err + client.reauthmut.done.Broadcast() + client.reauthmut.Unlock() + return +} + +// RequestOpts customizes the behavior of the provider.Request() method. +type RequestOpts struct { + // JSONBody, if provided, will be encoded as JSON and used as the body of the HTTP request. The + // content type of the request will default to "application/json" unless overridden by MoreHeaders. + // It's an error to specify both a JSONBody and a RawBody. + JSONBody interface{} + // RawBody contains an io.Reader that will be consumed by the request directly. No content-type + // will be set unless one is provided explicitly by MoreHeaders. + RawBody io.Reader + // JSONResponse, if provided, will be populated with the contents of the response body parsed as + // JSON. + JSONResponse interface{} + // OkCodes contains a list of numeric HTTP status codes that should be interpreted as success. If + // the response has a different code, an error will be returned. + OkCodes []int + // MoreHeaders specifies additional HTTP headers to be provide on the request. If a header is + // provided with a blank value (""), that header will be *omitted* instead: use this to suppress + // the default Accept header or an inferred Content-Type, for example. + MoreHeaders map[string]string + // ErrorContext specifies the resource error type to return if an error is encountered. + // This lets resources override default error messages based on the response status code. + ErrorContext error +} + +var applicationJSON = "application/json" + +// Request performs an HTTP request using the ProviderClient's current HTTPClient. An authentication +// header will automatically be provided. +func (client *ProviderClient) Request(method, url string, options *RequestOpts) (*http.Response, error) { + var body io.Reader + var contentType *string + + // Derive the content body by either encoding an arbitrary object as JSON, or by taking a provided + // io.ReadSeeker as-is. Default the content-type to application/json. + if options.JSONBody != nil { + if options.RawBody != nil { + return nil, errors.New("please provide only one of JSONBody or RawBody to gophercloud.Request()") + } + + rendered, err := json.Marshal(options.JSONBody) + if err != nil { + return nil, err + } + + body = bytes.NewReader(rendered) + contentType = &applicationJSON + } + + if options.RawBody != nil { + body = options.RawBody + } + + // Construct the http.Request. + req, err := http.NewRequest(method, url, body) + if err != nil { + return nil, err + } + + // Populate the request headers. Apply options.MoreHeaders last, to give the caller the chance to + // modify or omit any header. + if contentType != nil { + req.Header.Set("Content-Type", *contentType) + } + req.Header.Set("Accept", applicationJSON) + + // Set the User-Agent header + req.Header.Set("User-Agent", client.UserAgent.Join()) + + if options.MoreHeaders != nil { + for k, v := range options.MoreHeaders { + if v != "" { + req.Header.Set(k, v) + } else { + req.Header.Del(k) + } + } + } + + // get latest token from client + for k, v := range client.AuthenticatedHeaders() { + req.Header.Set(k, v) + } + + // Set connection parameter to close the connection immediately when we've got the response + req.Close = true + + prereqtok := req.Header.Get("X-Auth-Token") + + // Issue the request. + resp, err := client.HTTPClient.Do(req) + if err != nil { + return nil, err + } + + // Allow default OkCodes if none explicitly set + if options.OkCodes == nil { + options.OkCodes = defaultOkCodes(method) + } + + // Validate the HTTP response status. + var ok bool + for _, code := range options.OkCodes { + if resp.StatusCode == code { + ok = true + break + } + } + + if !ok { + body, _ := ioutil.ReadAll(resp.Body) + resp.Body.Close() + respErr := ErrUnexpectedResponseCode{ + URL: url, + Method: method, + Expected: options.OkCodes, + Actual: resp.StatusCode, + Body: body, + } + + errType := options.ErrorContext + switch resp.StatusCode { + case http.StatusBadRequest: + err = ErrDefault400{respErr} + if error400er, ok := errType.(Err400er); ok { + err = error400er.Error400(respErr) + } + case http.StatusUnauthorized: + if client.ReauthFunc != nil { + err = client.Reauthenticate(prereqtok) + if err != nil { + e := &ErrUnableToReauthenticate{} + e.ErrOriginal = respErr + return nil, e + } + if options.RawBody != nil { + if seeker, ok := options.RawBody.(io.Seeker); ok { + seeker.Seek(0, 0) + } + } + resp, err = client.Request(method, url, options) + if err != nil { + switch err.(type) { + case *ErrUnexpectedResponseCode: + e := &ErrErrorAfterReauthentication{} + e.ErrOriginal = err.(*ErrUnexpectedResponseCode) + return nil, e + default: + e := &ErrErrorAfterReauthentication{} + e.ErrOriginal = err + return nil, e + } + } + return resp, nil + } + err = ErrDefault401{respErr} + if error401er, ok := errType.(Err401er); ok { + err = error401er.Error401(respErr) + } + case http.StatusForbidden: + err = ErrDefault403{respErr} + if error403er, ok := errType.(Err403er); ok { + err = error403er.Error403(respErr) + } + case http.StatusNotFound: + err = ErrDefault404{respErr} + if error404er, ok := errType.(Err404er); ok { + err = error404er.Error404(respErr) + } + case http.StatusMethodNotAllowed: + err = ErrDefault405{respErr} + if error405er, ok := errType.(Err405er); ok { + err = error405er.Error405(respErr) + } + case http.StatusRequestTimeout: + err = ErrDefault408{respErr} + if error408er, ok := errType.(Err408er); ok { + err = error408er.Error408(respErr) + } + case 429: + err = ErrDefault429{respErr} + if error429er, ok := errType.(Err429er); ok { + err = error429er.Error429(respErr) + } + case http.StatusInternalServerError: + err = ErrDefault500{respErr} + if error500er, ok := errType.(Err500er); ok { + err = error500er.Error500(respErr) + } + case http.StatusServiceUnavailable: + err = ErrDefault503{respErr} + if error503er, ok := errType.(Err503er); ok { + err = error503er.Error503(respErr) + } + } + + if err == nil { + err = respErr + } + + return resp, err + } + + // Parse the response body as JSON, if requested to do so. + if options.JSONResponse != nil { + defer resp.Body.Close() + if err := json.NewDecoder(resp.Body).Decode(options.JSONResponse); err != nil { + return nil, err + } + } + + return resp, nil +} + +func defaultOkCodes(method string) []int { + switch { + case method == "GET": + return []int{200} + case method == "POST": + return []int{201, 202} + case method == "PUT": + return []int{201, 202} + case method == "PATCH": + return []int{200, 202, 204} + case method == "DELETE": + return []int{202, 204} + } + + return []int{} +} diff --git a/vendor/github.com/gophercloud/gophercloud/results.go b/vendor/github.com/gophercloud/gophercloud/results.go new file mode 100644 index 00000000..94a16bff --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/results.go @@ -0,0 +1,448 @@ +package gophercloud + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "reflect" + "strconv" + "time" +) + +/* +Result is an internal type to be used by individual resource packages, but its +methods will be available on a wide variety of user-facing embedding types. + +It acts as a base struct that other Result types, returned from request +functions, can embed for convenience. All Results capture basic information +from the HTTP transaction that was performed, including the response body, +HTTP headers, and any errors that happened. + +Generally, each Result type will have an Extract method that can be used to +further interpret the result's payload in a specific context. Extensions or +providers can then provide additional extraction functions to pull out +provider- or extension-specific information as well. +*/ +type Result struct { + // Body is the payload of the HTTP response from the server. In most cases, + // this will be the deserialized JSON structure. + Body interface{} + + // Header contains the HTTP header structure from the original response. + Header http.Header + + // Err is an error that occurred during the operation. It's deferred until + // extraction to make it easier to chain the Extract call. + Err error +} + +// ExtractInto allows users to provide an object into which `Extract` will extract +// the `Result.Body`. This would be useful for OpenStack providers that have +// different fields in the response object than OpenStack proper. +func (r Result) ExtractInto(to interface{}) error { + if r.Err != nil { + return r.Err + } + + if reader, ok := r.Body.(io.Reader); ok { + if readCloser, ok := reader.(io.Closer); ok { + defer readCloser.Close() + } + return json.NewDecoder(reader).Decode(to) + } + + b, err := json.Marshal(r.Body) + if err != nil { + return err + } + err = json.Unmarshal(b, to) + + return err +} + +func (r Result) extractIntoPtr(to interface{}, label string) error { + if label == "" { + return r.ExtractInto(&to) + } + + var m map[string]interface{} + err := r.ExtractInto(&m) + if err != nil { + return err + } + + b, err := json.Marshal(m[label]) + if err != nil { + return err + } + + toValue := reflect.ValueOf(to) + if toValue.Kind() == reflect.Ptr { + toValue = toValue.Elem() + } + + switch toValue.Kind() { + case reflect.Slice: + typeOfV := toValue.Type().Elem() + if typeOfV.Kind() == reflect.Struct { + if typeOfV.NumField() > 0 && typeOfV.Field(0).Anonymous { + newSlice := reflect.MakeSlice(reflect.SliceOf(typeOfV), 0, 0) + + if mSlice, ok := m[label].([]interface{}); ok { + for _, v := range mSlice { + // For each iteration of the slice, we create a new struct. + // This is to work around a bug where elements of a slice + // are reused and not overwritten when the same copy of the + // struct is used: + // + // https://github.com/golang/go/issues/21092 + // https://github.com/golang/go/issues/24155 + // https://play.golang.org/p/NHo3ywlPZli + newType := reflect.New(typeOfV).Elem() + + b, err := json.Marshal(v) + if err != nil { + return err + } + + // This is needed for structs with an UnmarshalJSON method. + // Technically this is just unmarshalling the response into + // a struct that is never used, but it's good enough to + // trigger the UnmarshalJSON method. + for i := 0; i < newType.NumField(); i++ { + s := newType.Field(i).Addr().Interface() + + // Unmarshal is used rather than NewDecoder to also work + // around the above-mentioned bug. + err = json.Unmarshal(b, s) + if err != nil { + return err + } + } + + newSlice = reflect.Append(newSlice, newType) + } + } + + // "to" should now be properly modeled to receive the + // JSON response body and unmarshal into all the correct + // fields of the struct or composed extension struct + // at the end of this method. + toValue.Set(newSlice) + } + } + case reflect.Struct: + typeOfV := toValue.Type() + if typeOfV.NumField() > 0 && typeOfV.Field(0).Anonymous { + for i := 0; i < toValue.NumField(); i++ { + toField := toValue.Field(i) + if toField.Kind() == reflect.Struct { + s := toField.Addr().Interface() + err = json.NewDecoder(bytes.NewReader(b)).Decode(s) + if err != nil { + return err + } + } + } + } + } + + err = json.Unmarshal(b, &to) + return err +} + +// ExtractIntoStructPtr will unmarshal the Result (r) into the provided +// interface{} (to). +// +// NOTE: For internal use only +// +// `to` must be a pointer to an underlying struct type +// +// If provided, `label` will be filtered out of the response +// body prior to `r` being unmarshalled into `to`. +func (r Result) ExtractIntoStructPtr(to interface{}, label string) error { + if r.Err != nil { + return r.Err + } + + t := reflect.TypeOf(to) + if k := t.Kind(); k != reflect.Ptr { + return fmt.Errorf("Expected pointer, got %v", k) + } + switch t.Elem().Kind() { + case reflect.Struct: + return r.extractIntoPtr(to, label) + default: + return fmt.Errorf("Expected pointer to struct, got: %v", t) + } +} + +// ExtractIntoSlicePtr will unmarshal the Result (r) into the provided +// interface{} (to). +// +// NOTE: For internal use only +// +// `to` must be a pointer to an underlying slice type +// +// If provided, `label` will be filtered out of the response +// body prior to `r` being unmarshalled into `to`. +func (r Result) ExtractIntoSlicePtr(to interface{}, label string) error { + if r.Err != nil { + return r.Err + } + + t := reflect.TypeOf(to) + if k := t.Kind(); k != reflect.Ptr { + return fmt.Errorf("Expected pointer, got %v", k) + } + switch t.Elem().Kind() { + case reflect.Slice: + return r.extractIntoPtr(to, label) + default: + return fmt.Errorf("Expected pointer to slice, got: %v", t) + } +} + +// PrettyPrintJSON creates a string containing the full response body as +// pretty-printed JSON. It's useful for capturing test fixtures and for +// debugging extraction bugs. If you include its output in an issue related to +// a buggy extraction function, we will all love you forever. +func (r Result) PrettyPrintJSON() string { + pretty, err := json.MarshalIndent(r.Body, "", " ") + if err != nil { + panic(err.Error()) + } + return string(pretty) +} + +// ErrResult is an internal type to be used by individual resource packages, but +// its methods will be available on a wide variety of user-facing embedding +// types. +// +// It represents results that only contain a potential error and +// nothing else. Usually, if the operation executed successfully, the Err field +// will be nil; otherwise it will be stocked with a relevant error. Use the +// ExtractErr method +// to cleanly pull it out. +type ErrResult struct { + Result +} + +// ExtractErr is a function that extracts error information, or nil, from a result. +func (r ErrResult) ExtractErr() error { + return r.Err +} + +/* +HeaderResult is an internal type to be used by individual resource packages, but +its methods will be available on a wide variety of user-facing embedding types. + +It represents a result that only contains an error (possibly nil) and an +http.Header. This is used, for example, by the objectstorage packages in +openstack, because most of the operations don't return response bodies, but do +have relevant information in headers. +*/ +type HeaderResult struct { + Result +} + +// ExtractInto allows users to provide an object into which `Extract` will +// extract the http.Header headers of the result. +func (r HeaderResult) ExtractInto(to interface{}) error { + if r.Err != nil { + return r.Err + } + + tmpHeaderMap := map[string]string{} + for k, v := range r.Header { + if len(v) > 0 { + tmpHeaderMap[k] = v[0] + } + } + + b, err := json.Marshal(tmpHeaderMap) + if err != nil { + return err + } + err = json.Unmarshal(b, to) + + return err +} + +// RFC3339Milli describes a common time format used by some API responses. +const RFC3339Milli = "2006-01-02T15:04:05.999999Z" + +type JSONRFC3339Milli time.Time + +func (jt *JSONRFC3339Milli) UnmarshalJSON(data []byte) error { + b := bytes.NewBuffer(data) + dec := json.NewDecoder(b) + var s string + if err := dec.Decode(&s); err != nil { + return err + } + t, err := time.Parse(RFC3339Milli, s) + if err != nil { + return err + } + *jt = JSONRFC3339Milli(t) + return nil +} + +const RFC3339MilliNoZ = "2006-01-02T15:04:05.999999" + +type JSONRFC3339MilliNoZ time.Time + +func (jt *JSONRFC3339MilliNoZ) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + if s == "" { + return nil + } + t, err := time.Parse(RFC3339MilliNoZ, s) + if err != nil { + return err + } + *jt = JSONRFC3339MilliNoZ(t) + return nil +} + +type JSONRFC1123 time.Time + +func (jt *JSONRFC1123) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + if s == "" { + return nil + } + t, err := time.Parse(time.RFC1123, s) + if err != nil { + return err + } + *jt = JSONRFC1123(t) + return nil +} + +type JSONUnix time.Time + +func (jt *JSONUnix) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + if s == "" { + return nil + } + unix, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return err + } + t = time.Unix(unix, 0) + *jt = JSONUnix(t) + return nil +} + +// RFC3339NoZ is the time format used in Heat (Orchestration). +const RFC3339NoZ = "2006-01-02T15:04:05" + +type JSONRFC3339NoZ time.Time + +func (jt *JSONRFC3339NoZ) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + if s == "" { + return nil + } + t, err := time.Parse(RFC3339NoZ, s) + if err != nil { + return err + } + *jt = JSONRFC3339NoZ(t) + return nil +} + +// RFC3339ZNoT is the time format used in Zun (Containers Service). +const RFC3339ZNoT = "2006-01-02 15:04:05-07:00" + +type JSONRFC3339ZNoT time.Time + +func (jt *JSONRFC3339ZNoT) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + if s == "" { + return nil + } + t, err := time.Parse(RFC3339ZNoT, s) + if err != nil { + return err + } + *jt = JSONRFC3339ZNoT(t) + return nil +} + +// RFC3339ZNoTNoZ is another time format used in Zun (Containers Service). +const RFC3339ZNoTNoZ = "2006-01-02 15:04:05" + +type JSONRFC3339ZNoTNoZ time.Time + +func (jt *JSONRFC3339ZNoTNoZ) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + if s == "" { + return nil + } + t, err := time.Parse(RFC3339ZNoTNoZ, s) + if err != nil { + return err + } + *jt = JSONRFC3339ZNoTNoZ(t) + return nil +} + +/* +Link is an internal type to be used in packages of collection resources that are +paginated in a certain way. + +It's a response substructure common to many paginated collection results that is +used to point to related pages. Usually, the one we care about is the one with +Rel field set to "next". +*/ +type Link struct { + Href string `json:"href"` + Rel string `json:"rel"` +} + +/* +ExtractNextURL is an internal function useful for packages of collection +resources that are paginated in a certain way. + +It attempts to extract the "next" URL from slice of Link structs, or +"" if no such URL is present. +*/ +func ExtractNextURL(links []Link) (string, error) { + var url string + + for _, l := range links { + if l.Rel == "next" { + url = l.Href + } + } + + if url == "" { + return "", nil + } + + return url, nil +} diff --git a/vendor/github.com/gophercloud/gophercloud/service_client.go b/vendor/github.com/gophercloud/gophercloud/service_client.go new file mode 100644 index 00000000..2734510e --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/service_client.go @@ -0,0 +1,150 @@ +package gophercloud + +import ( + "io" + "net/http" + "strings" +) + +// ServiceClient stores details required to interact with a specific service API implemented by a provider. +// Generally, you'll acquire these by calling the appropriate `New` method on a ProviderClient. +type ServiceClient struct { + // ProviderClient is a reference to the provider that implements this service. + *ProviderClient + + // Endpoint is the base URL of the service's API, acquired from a service catalog. + // It MUST end with a /. + Endpoint string + + // ResourceBase is the base URL shared by the resources within a service's API. It should include + // the API version and, like Endpoint, MUST end with a / if set. If not set, the Endpoint is used + // as-is, instead. + ResourceBase string + + // This is the service client type (e.g. compute, sharev2). + // NOTE: FOR INTERNAL USE ONLY. DO NOT SET. GOPHERCLOUD WILL SET THIS. + // It is only exported because it gets set in a different package. + Type string + + // The microversion of the service to use. Set this to use a particular microversion. + Microversion string + + // MoreHeaders allows users (or Gophercloud) to set service-wide headers on requests. Put another way, + // values set in this field will be set on all the HTTP requests the service client sends. + MoreHeaders map[string]string +} + +// ResourceBaseURL returns the base URL of any resources used by this service. It MUST end with a /. +func (client *ServiceClient) ResourceBaseURL() string { + if client.ResourceBase != "" { + return client.ResourceBase + } + return client.Endpoint +} + +// ServiceURL constructs a URL for a resource belonging to this provider. +func (client *ServiceClient) ServiceURL(parts ...string) string { + return client.ResourceBaseURL() + strings.Join(parts, "/") +} + +func (client *ServiceClient) initReqOpts(url string, JSONBody interface{}, JSONResponse interface{}, opts *RequestOpts) { + if v, ok := (JSONBody).(io.Reader); ok { + opts.RawBody = v + } else if JSONBody != nil { + opts.JSONBody = JSONBody + } + + if JSONResponse != nil { + opts.JSONResponse = JSONResponse + } + + if opts.MoreHeaders == nil { + opts.MoreHeaders = make(map[string]string) + } + + if client.Microversion != "" { + client.setMicroversionHeader(opts) + } +} + +// Get calls `Request` with the "GET" HTTP verb. +func (client *ServiceClient) Get(url string, JSONResponse interface{}, opts *RequestOpts) (*http.Response, error) { + if opts == nil { + opts = new(RequestOpts) + } + client.initReqOpts(url, nil, JSONResponse, opts) + return client.Request("GET", url, opts) +} + +// Post calls `Request` with the "POST" HTTP verb. +func (client *ServiceClient) Post(url string, JSONBody interface{}, JSONResponse interface{}, opts *RequestOpts) (*http.Response, error) { + if opts == nil { + opts = new(RequestOpts) + } + client.initReqOpts(url, JSONBody, JSONResponse, opts) + return client.Request("POST", url, opts) +} + +// Put calls `Request` with the "PUT" HTTP verb. +func (client *ServiceClient) Put(url string, JSONBody interface{}, JSONResponse interface{}, opts *RequestOpts) (*http.Response, error) { + if opts == nil { + opts = new(RequestOpts) + } + client.initReqOpts(url, JSONBody, JSONResponse, opts) + return client.Request("PUT", url, opts) +} + +// Patch calls `Request` with the "PATCH" HTTP verb. +func (client *ServiceClient) Patch(url string, JSONBody interface{}, JSONResponse interface{}, opts *RequestOpts) (*http.Response, error) { + if opts == nil { + opts = new(RequestOpts) + } + client.initReqOpts(url, JSONBody, JSONResponse, opts) + return client.Request("PATCH", url, opts) +} + +// Delete calls `Request` with the "DELETE" HTTP verb. +func (client *ServiceClient) Delete(url string, opts *RequestOpts) (*http.Response, error) { + if opts == nil { + opts = new(RequestOpts) + } + client.initReqOpts(url, nil, nil, opts) + return client.Request("DELETE", url, opts) +} + +// Head calls `Request` with the "HEAD" HTTP verb. +func (client *ServiceClient) Head(url string, opts *RequestOpts) (*http.Response, error) { + if opts == nil { + opts = new(RequestOpts) + } + client.initReqOpts(url, nil, nil, opts) + return client.Request("HEAD", url, opts) +} + +func (client *ServiceClient) setMicroversionHeader(opts *RequestOpts) { + switch client.Type { + case "compute": + opts.MoreHeaders["X-OpenStack-Nova-API-Version"] = client.Microversion + case "sharev2": + opts.MoreHeaders["X-OpenStack-Manila-API-Version"] = client.Microversion + case "volume": + opts.MoreHeaders["X-OpenStack-Volume-API-Version"] = client.Microversion + } + + if client.Type != "" { + opts.MoreHeaders["OpenStack-API-Version"] = client.Type + " " + client.Microversion + } +} + +// Request carries out the HTTP operation for the service client +func (client *ServiceClient) Request(method, url string, options *RequestOpts) (*http.Response, error) { + if len(client.MoreHeaders) > 0 { + if options == nil { + options = new(RequestOpts) + } + for k, v := range client.MoreHeaders { + options.MoreHeaders[k] = v + } + } + return client.ProviderClient.Request(method, url, options) +} diff --git a/vendor/github.com/gophercloud/gophercloud/util.go b/vendor/github.com/gophercloud/gophercloud/util.go new file mode 100644 index 00000000..68f9a5d3 --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/util.go @@ -0,0 +1,102 @@ +package gophercloud + +import ( + "fmt" + "net/url" + "path/filepath" + "strings" + "time" +) + +// WaitFor polls a predicate function, once per second, up to a timeout limit. +// This is useful to wait for a resource to transition to a certain state. +// To handle situations when the predicate might hang indefinitely, the +// predicate will be prematurely cancelled after the timeout. +// Resource packages will wrap this in a more convenient function that's +// specific to a certain resource, but it can also be useful on its own. +func WaitFor(timeout int, predicate func() (bool, error)) error { + type WaitForResult struct { + Success bool + Error error + } + + start := time.Now().Unix() + + for { + // If a timeout is set, and that's been exceeded, shut it down. + if timeout >= 0 && time.Now().Unix()-start >= int64(timeout) { + return fmt.Errorf("A timeout occurred") + } + + time.Sleep(1 * time.Second) + + var result WaitForResult + ch := make(chan bool, 1) + go func() { + defer close(ch) + satisfied, err := predicate() + result.Success = satisfied + result.Error = err + }() + + select { + case <-ch: + if result.Error != nil { + return result.Error + } + if result.Success { + return nil + } + // If the predicate has not finished by the timeout, cancel it. + case <-time.After(time.Duration(timeout) * time.Second): + return fmt.Errorf("A timeout occurred") + } + } +} + +// NormalizeURL is an internal function to be used by provider clients. +// +// It ensures that each endpoint URL has a closing `/`, as expected by +// ServiceClient's methods. +func NormalizeURL(url string) string { + if !strings.HasSuffix(url, "/") { + return url + "/" + } + return url +} + +// NormalizePathURL is used to convert rawPath to a fqdn, using basePath as +// a reference in the filesystem, if necessary. basePath is assumed to contain +// either '.' when first used, or the file:// type fqdn of the parent resource. +// e.g. myFavScript.yaml => file://opt/lib/myFavScript.yaml +func NormalizePathURL(basePath, rawPath string) (string, error) { + u, err := url.Parse(rawPath) + if err != nil { + return "", err + } + // if a scheme is defined, it must be a fqdn already + if u.Scheme != "" { + return u.String(), nil + } + // if basePath is a url, then child resources are assumed to be relative to it + bu, err := url.Parse(basePath) + if err != nil { + return "", err + } + var basePathSys, absPathSys string + if bu.Scheme != "" { + basePathSys = filepath.FromSlash(bu.Path) + absPathSys = filepath.Join(basePathSys, rawPath) + bu.Path = filepath.ToSlash(absPathSys) + return bu.String(), nil + } + + absPathSys = filepath.Join(basePath, rawPath) + u.Path = filepath.ToSlash(absPathSys) + if err != nil { + return "", err + } + u.Scheme = "file" + return u.String(), nil + +} diff --git a/vendor/github.com/hashicorp/golang-lru/LICENSE b/vendor/github.com/hashicorp/golang-lru/LICENSE deleted file mode 100644 index be2cc4df..00000000 --- a/vendor/github.com/hashicorp/golang-lru/LICENSE +++ /dev/null @@ -1,362 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. "Contributor" - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. "Contributor Version" - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the terms of - a Secondary License. - -1.6. "Executable Form" - - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - - means a work that combines Covered Software with other material, in a - separate file or files, that is not Covered Software. - -1.8. "License" - - means this document. - -1.9. "Licensable" - - means having the right to grant, to the maximum extent possible, whether - at the time of the initial grant or subsequently, any and all of the - rights conveyed by this License. - -1.10. "Modifications" - - means any of the following: - - a. any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. "Patent Claims" of a Contributor - - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the License, - by the making, using, selling, offering for sale, having made, import, - or transfer of either its Contributions or its Contributor Version. - -1.12. "Secondary License" - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. "Source Code Form" - - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, "control" means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution - become effective for each Contribution on the date the Contributor first - distributes such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under - this License. No additional rights or licenses will be implied from the - distribution or licensing of Covered Software under this License. - Notwithstanding Section 2.1(b) above, no patent license is granted by a - Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of - its Contributions. - - This License does not grant any rights in the trademarks, service marks, - or logos of any Contributor (except as may be necessary to comply with - the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this - License (see Section 10.2) or under the terms of a Secondary License (if - permitted under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its - Contributions are its original creation(s) or it has sufficient rights to - grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under - applicable copyright doctrines of fair use, fair dealing, or other - equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under - the terms of this License. You must inform recipients that the Source - Code Form of the Covered Software is governed by the terms of this - License, and how they can obtain a copy of this License. You may not - attempt to alter or restrict the recipients' rights in the Source Code - Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter the - recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for - the Covered Software. If the Larger Work is a combination of Covered - Software with a work governed by one or more Secondary Licenses, and the - Covered Software is not Incompatible With Secondary Licenses, this - License permits You to additionally distribute such Covered Software - under the terms of such Secondary License(s), so that the recipient of - the Larger Work may, at their option, further distribute the Covered - Software under the terms of either this License or such Secondary - License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices - (including copyright notices, patent notices, disclaimers of warranty, or - limitations of liability) contained within the Source Code Form of the - Covered Software, except that You may alter any license notices to the - extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on - behalf of any Contributor. You must make it absolutely clear that any - such warranty, support, indemnity, or liability obligation is offered by - You alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, - judicial order, or regulation then You must: (a) comply with the terms of - this License to the maximum extent possible; and (b) describe the - limitations and the code they affect. Such description must be placed in a - text file included with all distributions of the Covered Software under - this License. Except to the extent prohibited by statute or regulation, - such description must be sufficiently detailed for a recipient of ordinary - skill to be able to understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing - basis, if such Contributor fails to notify You of the non-compliance by - some reasonable means prior to 60 days after You have come back into - compliance. Moreover, Your grants from a particular Contributor are - reinstated on an ongoing basis if such Contributor notifies You of the - non-compliance by some reasonable means, this is the first time You have - received notice of non-compliance with this License from such - Contributor, and You become compliant prior to 30 days after Your receipt - of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, - counter-claims, and cross-claims) alleging that a Contributor Version - directly or indirectly infringes any patent, then the rights granted to - You by any and all Contributors for the Covered Software under Section - 2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an "as is" basis, - without warranty of any kind, either expressed, implied, or statutory, - including, without limitation, warranties that the Covered Software is free - of defects, merchantable, fit for a particular purpose or non-infringing. - The entire risk as to the quality and performance of the Covered Software - is with You. Should any Covered Software prove defective in any respect, - You (not any Contributor) assume the cost of any necessary servicing, - repair, or correction. This disclaimer of warranty constitutes an essential - part of this License. No use of any Covered Software is authorized under - this License except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from - such party's negligence to the extent applicable law prohibits such - limitation. Some jurisdictions do not allow the exclusion or limitation of - incidental or consequential damages, so this exclusion and limitation may - not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts - of a jurisdiction where the defendant maintains its principal place of - business and such litigation shall be governed by laws of that - jurisdiction, without reference to its conflict-of-law provisions. Nothing - in this Section shall prevent a party's ability to bring cross-claims or - counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. Any law or regulation which provides that - the language of a contract shall be construed against the drafter shall not - be used to construe this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version - of the License under which You originally received the Covered Software, - or under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a - modified version of this License if you rename the license and remove - any references to the name of the license steward (except to note that - such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary - Licenses If You choose to distribute Source Code Form that is - Incompatible With Secondary Licenses under the terms of this version of - the License, the notice described in Exhibit B of this License must be - attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, -then You may include the notice in a location (such as a LICENSE file in a -relevant directory) where a recipient would be likely to look for such a -notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice - - This Source Code Form is "Incompatible - With Secondary Licenses", as defined by - the Mozilla Public License, v. 2.0. diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go deleted file mode 100644 index 5673773b..00000000 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go +++ /dev/null @@ -1,161 +0,0 @@ -package simplelru - -import ( - "container/list" - "errors" -) - -// EvictCallback is used to get a callback when a cache entry is evicted -type EvictCallback func(key interface{}, value interface{}) - -// LRU implements a non-thread safe fixed size LRU cache -type LRU struct { - size int - evictList *list.List - items map[interface{}]*list.Element - onEvict EvictCallback -} - -// entry is used to hold a value in the evictList -type entry struct { - key interface{} - value interface{} -} - -// NewLRU constructs an LRU of the given size -func NewLRU(size int, onEvict EvictCallback) (*LRU, error) { - if size <= 0 { - return nil, errors.New("Must provide a positive size") - } - c := &LRU{ - size: size, - evictList: list.New(), - items: make(map[interface{}]*list.Element), - onEvict: onEvict, - } - return c, nil -} - -// Purge is used to completely clear the cache. -func (c *LRU) Purge() { - for k, v := range c.items { - if c.onEvict != nil { - c.onEvict(k, v.Value.(*entry).value) - } - delete(c.items, k) - } - c.evictList.Init() -} - -// Add adds a value to the cache. Returns true if an eviction occurred. -func (c *LRU) Add(key, value interface{}) (evicted bool) { - // Check for existing item - if ent, ok := c.items[key]; ok { - c.evictList.MoveToFront(ent) - ent.Value.(*entry).value = value - return false - } - - // Add new item - ent := &entry{key, value} - entry := c.evictList.PushFront(ent) - c.items[key] = entry - - evict := c.evictList.Len() > c.size - // Verify size not exceeded - if evict { - c.removeOldest() - } - return evict -} - -// Get looks up a key's value from the cache. -func (c *LRU) Get(key interface{}) (value interface{}, ok bool) { - if ent, ok := c.items[key]; ok { - c.evictList.MoveToFront(ent) - return ent.Value.(*entry).value, true - } - return -} - -// Contains checks if a key is in the cache, without updating the recent-ness -// or deleting it for being stale. -func (c *LRU) Contains(key interface{}) (ok bool) { - _, ok = c.items[key] - return ok -} - -// Peek returns the key value (or undefined if not found) without updating -// the "recently used"-ness of the key. -func (c *LRU) Peek(key interface{}) (value interface{}, ok bool) { - var ent *list.Element - if ent, ok = c.items[key]; ok { - return ent.Value.(*entry).value, true - } - return nil, ok -} - -// Remove removes the provided key from the cache, returning if the -// key was contained. -func (c *LRU) Remove(key interface{}) (present bool) { - if ent, ok := c.items[key]; ok { - c.removeElement(ent) - return true - } - return false -} - -// RemoveOldest removes the oldest item from the cache. -func (c *LRU) RemoveOldest() (key interface{}, value interface{}, ok bool) { - ent := c.evictList.Back() - if ent != nil { - c.removeElement(ent) - kv := ent.Value.(*entry) - return kv.key, kv.value, true - } - return nil, nil, false -} - -// GetOldest returns the oldest entry -func (c *LRU) GetOldest() (key interface{}, value interface{}, ok bool) { - ent := c.evictList.Back() - if ent != nil { - kv := ent.Value.(*entry) - return kv.key, kv.value, true - } - return nil, nil, false -} - -// Keys returns a slice of the keys in the cache, from oldest to newest. -func (c *LRU) Keys() []interface{} { - keys := make([]interface{}, len(c.items)) - i := 0 - for ent := c.evictList.Back(); ent != nil; ent = ent.Prev() { - keys[i] = ent.Value.(*entry).key - i++ - } - return keys -} - -// Len returns the number of items in the cache. -func (c *LRU) Len() int { - return c.evictList.Len() -} - -// removeOldest removes the oldest item from the cache. -func (c *LRU) removeOldest() { - ent := c.evictList.Back() - if ent != nil { - c.removeElement(ent) - } -} - -// removeElement is used to remove a given list element from the cache -func (c *LRU) removeElement(e *list.Element) { - c.evictList.Remove(e) - kv := e.Value.(*entry) - delete(c.items, kv.key) - if c.onEvict != nil { - c.onEvict(kv.key, kv.value) - } -} diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go deleted file mode 100644 index 74c70774..00000000 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go +++ /dev/null @@ -1,36 +0,0 @@ -package simplelru - -// LRUCache is the interface for simple LRU cache. -type LRUCache interface { - // Adds a value to the cache, returns true if an eviction occurred and - // updates the "recently used"-ness of the key. - Add(key, value interface{}) bool - - // Returns key's value from the cache and - // updates the "recently used"-ness of the key. #value, isFound - Get(key interface{}) (value interface{}, ok bool) - - // Check if a key exsists in cache without updating the recent-ness. - Contains(key interface{}) (ok bool) - - // Returns key's value without updating the "recently used"-ness of the key. - Peek(key interface{}) (value interface{}, ok bool) - - // Removes a key from the cache. - Remove(key interface{}) bool - - // Removes the oldest entry from cache. - RemoveOldest() (interface{}, interface{}, bool) - - // Returns the oldest entry from the cache. #key, value, isFound - GetOldest() (interface{}, interface{}, bool) - - // Returns a slice of the keys in the cache, from oldest to newest. - Keys() []interface{} - - // Returns the number of items in the cache. - Len() int - - // Clear all cache entries - Purge() -} diff --git a/vendor/github.com/json-iterator/go/adapter.go b/vendor/github.com/json-iterator/go/adapter.go index e674d0f3..92d2cc4a 100644 --- a/vendor/github.com/json-iterator/go/adapter.go +++ b/vendor/github.com/json-iterator/go/adapter.go @@ -16,7 +16,7 @@ func Unmarshal(data []byte, v interface{}) error { return ConfigDefault.Unmarshal(data, v) } -// UnmarshalFromString convenient method to read from string instead of []byte +// UnmarshalFromString is a convenient method to read from string instead of []byte func UnmarshalFromString(str string, v interface{}) error { return ConfigDefault.UnmarshalFromString(str, v) } diff --git a/vendor/github.com/json-iterator/go/go.mod b/vendor/github.com/json-iterator/go/go.mod new file mode 100644 index 00000000..e05c42ff --- /dev/null +++ b/vendor/github.com/json-iterator/go/go.mod @@ -0,0 +1,11 @@ +module github.com/json-iterator/go + +go 1.12 + +require ( + github.com/davecgh/go-spew v1.1.1 + github.com/google/gofuzz v1.0.0 + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 + github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 + github.com/stretchr/testify v1.3.0 +) diff --git a/vendor/github.com/json-iterator/go/go.sum b/vendor/github.com/json-iterator/go/go.sum new file mode 100644 index 00000000..d778b5a1 --- /dev/null +++ b/vendor/github.com/json-iterator/go/go.sum @@ -0,0 +1,14 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/json-iterator/go/iter_skip.go b/vendor/github.com/json-iterator/go/iter_skip.go index f58beb91..e91eefb1 100644 --- a/vendor/github.com/json-iterator/go/iter_skip.go +++ b/vendor/github.com/json-iterator/go/iter_skip.go @@ -37,17 +37,24 @@ func (iter *Iterator) SkipAndReturnBytes() []byte { return iter.stopCapture() } -type captureBuffer struct { - startedAt int - captured []byte +// SkipAndAppendBytes skips next JSON element and appends its content to +// buffer, returning the result. +func (iter *Iterator) SkipAndAppendBytes(buf []byte) []byte { + iter.startCaptureTo(buf, iter.head) + iter.Skip() + return iter.stopCapture() } -func (iter *Iterator) startCapture(captureStartedAt int) { +func (iter *Iterator) startCaptureTo(buf []byte, captureStartedAt int) { if iter.captured != nil { panic("already in capture mode") } iter.captureStartedAt = captureStartedAt - iter.captured = make([]byte, 0, 32) + iter.captured = buf +} + +func (iter *Iterator) startCapture(captureStartedAt int) { + iter.startCaptureTo(make([]byte, 0, 32), captureStartedAt) } func (iter *Iterator) stopCapture() []byte { @@ -58,13 +65,7 @@ func (iter *Iterator) stopCapture() []byte { remaining := iter.buf[iter.captureStartedAt:iter.head] iter.captureStartedAt = -1 iter.captured = nil - if len(captured) == 0 { - copied := make([]byte, len(remaining)) - copy(copied, remaining) - return copied - } - captured = append(captured, remaining...) - return captured + return append(captured, remaining...) } // Skip skips a json object and positions to relatively the next json object diff --git a/vendor/github.com/json-iterator/go/reflect_native.go b/vendor/github.com/json-iterator/go/reflect_native.go index 9042eb0c..f88722d1 100644 --- a/vendor/github.com/json-iterator/go/reflect_native.go +++ b/vendor/github.com/json-iterator/go/reflect_native.go @@ -432,17 +432,19 @@ func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { } func (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - src := *((*[]byte)(ptr)) - if len(src) == 0 { + if codec.sliceType.UnsafeIsNil(ptr) { stream.WriteNil() return } + src := *((*[]byte)(ptr)) encoding := base64.StdEncoding stream.writeByte('"') - size := encoding.EncodedLen(len(src)) - buf := make([]byte, size) - encoding.Encode(buf, src) - stream.buf = append(stream.buf, buf...) + if len(src) != 0 { + size := encoding.EncodedLen(len(src)) + buf := make([]byte, size) + encoding.Encode(buf, src) + stream.buf = append(stream.buf, buf...) + } stream.writeByte('"') } diff --git a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go b/vendor/github.com/json-iterator/go/reflect_struct_decoder.go index 355d2d11..932641ac 100644 --- a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go +++ b/vendor/github.com/json-iterator/go/reflect_struct_decoder.go @@ -530,8 +530,8 @@ func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *It } } if fieldDecoder == nil { - msg := "found unknown field: " + field if decoder.disallowUnknownFields { + msg := "found unknown field: " + field iter.ReportError("ReadObject", msg) } c := iter.nextToken() diff --git a/vendor/github.com/json-iterator/go/stream_float.go b/vendor/github.com/json-iterator/go/stream_float.go index f318d2c5..826aa594 100644 --- a/vendor/github.com/json-iterator/go/stream_float.go +++ b/vendor/github.com/json-iterator/go/stream_float.go @@ -1,6 +1,7 @@ package jsoniter import ( + "fmt" "math" "strconv" ) @@ -13,6 +14,10 @@ func init() { // WriteFloat32 write float32 to stream func (stream *Stream) WriteFloat32(val float32) { + if math.IsInf(float64(val), 0) || math.IsNaN(float64(val)) { + stream.Error = fmt.Errorf("unsupported value: %f", val) + return + } abs := math.Abs(float64(val)) fmt := byte('f') // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. @@ -26,6 +31,10 @@ func (stream *Stream) WriteFloat32(val float32) { // WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster func (stream *Stream) WriteFloat32Lossy(val float32) { + if math.IsInf(float64(val), 0) || math.IsNaN(float64(val)) { + stream.Error = fmt.Errorf("unsupported value: %f", val) + return + } if val < 0 { stream.writeByte('-') val = -val @@ -54,6 +63,10 @@ func (stream *Stream) WriteFloat32Lossy(val float32) { // WriteFloat64 write float64 to stream func (stream *Stream) WriteFloat64(val float64) { + if math.IsInf(val, 0) || math.IsNaN(val) { + stream.Error = fmt.Errorf("unsupported value: %f", val) + return + } abs := math.Abs(val) fmt := byte('f') // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. @@ -67,6 +80,10 @@ func (stream *Stream) WriteFloat64(val float64) { // WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster func (stream *Stream) WriteFloat64Lossy(val float64) { + if math.IsInf(val, 0) || math.IsNaN(val) { + stream.Error = fmt.Errorf("unsupported value: %f", val) + return + } if val < 0 { stream.writeByte('-') val = -val diff --git a/vendor/github.com/opencontainers/go-digest/.mailmap b/vendor/github.com/opencontainers/go-digest/.mailmap new file mode 100644 index 00000000..ba611cb2 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/.mailmap @@ -0,0 +1 @@ +Stephen J Day diff --git a/vendor/github.com/opencontainers/go-digest/.pullapprove.yml b/vendor/github.com/opencontainers/go-digest/.pullapprove.yml new file mode 100644 index 00000000..45fa4b9e --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/.pullapprove.yml @@ -0,0 +1,12 @@ +approve_by_comment: true +approve_regex: '^(Approved|lgtm|LGTM|:shipit:|:star:|:\+1:|:ship:)' +reject_regex: ^Rejected +reset_on_push: true +author_approval: ignored +signed_off_by: + required: true +reviewers: + teams: + - go-digest-maintainers + name: default + required: 2 diff --git a/vendor/github.com/opencontainers/go-digest/.travis.yml b/vendor/github.com/opencontainers/go-digest/.travis.yml new file mode 100644 index 00000000..7ea4ed1d --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/.travis.yml @@ -0,0 +1,4 @@ +language: go +go: + - 1.7 + - master diff --git a/vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md b/vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md new file mode 100644 index 00000000..e4d962ac --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md @@ -0,0 +1,72 @@ +# Contributing to Docker open source projects + +Want to hack on this project? Awesome! Here are instructions to get you started. + +This project is a part of the [Docker](https://www.docker.com) project, and follows +the same rules and principles. If you're already familiar with the way +Docker does things, you'll feel right at home. + +Otherwise, go read Docker's +[contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md), +[issue triaging](https://github.com/docker/docker/blob/master/project/ISSUE-TRIAGE.md), +[review process](https://github.com/docker/docker/blob/master/project/REVIEWING.md) and +[branches and tags](https://github.com/docker/docker/blob/master/project/BRANCHES-AND-TAGS.md). + +For an in-depth description of our contribution process, visit the +contributors guide: [Understand how to contribute](https://docs.docker.com/opensource/workflow/make-a-contribution/) + +### Sign your work + +The sign-off is a simple line at the end of the explanation for the patch. Your +signature certifies that you wrote the patch or otherwise have the right to pass +it on as an open-source patch. The rules are pretty simple: if you can certify +the below (from [developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +1 Letterman Drive +Suite D4700 +San Francisco, CA, 94129 + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +Then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +Use your real name (sorry, no pseudonyms or anonymous contributions.) + +If you set your `user.name` and `user.email` git configs, you can sign your +commit automatically with `git commit -s`. diff --git a/vendor/github.com/opencontainers/go-digest/LICENSE.code b/vendor/github.com/opencontainers/go-digest/LICENSE.code new file mode 100644 index 00000000..0ea3ff81 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/LICENSE.code @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2016 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/opencontainers/go-digest/LICENSE.docs b/vendor/github.com/opencontainers/go-digest/LICENSE.docs new file mode 100644 index 00000000..e26cd4fc --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/LICENSE.docs @@ -0,0 +1,425 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public licenses. +Notwithstanding, Creative Commons may elect to apply one of its public +licenses to material it publishes and in those instances will be +considered the "Licensor." Except for the limited purpose of indicating +that material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the public +licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/vendor/github.com/opencontainers/go-digest/MAINTAINERS b/vendor/github.com/opencontainers/go-digest/MAINTAINERS new file mode 100644 index 00000000..42a29795 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/MAINTAINERS @@ -0,0 +1,9 @@ +Aaron Lehmann (@aaronlehmann) +Brandon Philips (@philips) +Brendan Burns (@brendandburns) +Derek McGowan (@dmcgowan) +Jason Bouzane (@jbouzane) +John Starks (@jstarks) +Jonathan Boulle (@jonboulle) +Stephen Day (@stevvooe) +Vincent Batts (@vbatts) diff --git a/vendor/github.com/opencontainers/go-digest/README.md b/vendor/github.com/opencontainers/go-digest/README.md new file mode 100644 index 00000000..0f5a0409 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/README.md @@ -0,0 +1,104 @@ +# go-digest + +[![GoDoc](https://godoc.org/github.com/opencontainers/go-digest?status.svg)](https://godoc.org/github.com/opencontainers/go-digest) [![Go Report Card](https://goreportcard.com/badge/github.com/opencontainers/go-digest)](https://goreportcard.com/report/github.com/opencontainers/go-digest) [![Build Status](https://travis-ci.org/opencontainers/go-digest.svg?branch=master)](https://travis-ci.org/opencontainers/go-digest) + +Common digest package used across the container ecosystem. + +Please see the [godoc](https://godoc.org/github.com/opencontainers/go-digest) for more information. + +# What is a digest? + +A digest is just a hash. + +The most common use case for a digest is to create a content +identifier for use in [Content Addressable Storage](https://en.wikipedia.org/wiki/Content-addressable_storage) +systems: + +```go +id := digest.FromBytes([]byte("my content")) +``` + +In the example above, the id can be used to uniquely identify +the byte slice "my content". This allows two disparate applications +to agree on a verifiable identifier without having to trust one +another. + +An identifying digest can be verified, as follows: + +```go +if id != digest.FromBytes([]byte("my content")) { + return errors.New("the content has changed!") +} +``` + +A `Verifier` type can be used to handle cases where an `io.Reader` +makes more sense: + +```go +rd := getContent() +verifier := id.Verifier() +io.Copy(verifier, rd) + +if !verifier.Verified() { + return errors.New("the content has changed!") +} +``` + +Using [Merkle DAGs](https://en.wikipedia.org/wiki/Merkle_tree), this +can power a rich, safe, content distribution system. + +# Usage + +While the [godoc](https://godoc.org/github.com/opencontainers/go-digest) is +considered the best resource, a few important items need to be called +out when using this package. + +1. Make sure to import the hash implementations into your application + or the package will panic. You should have something like the + following in the main (or other entrypoint) of your application: + + ```go + import ( + _ "crypto/sha256" + _ "crypto/sha512" + ) + ``` + This may seem inconvenient but it allows you replace the hash + implementations with others, such as https://github.com/stevvooe/resumable. + +2. Even though `digest.Digest` may be assemable as a string, _always_ + verify your input with `digest.Parse` or use `Digest.Validate` + when accepting untrusted input. While there are measures to + avoid common problems, this will ensure you have valid digests + in the rest of your application. + +# Stability + +The Go API, at this stage, is considered stable, unless otherwise noted. + +As always, before using a package export, read the [godoc](https://godoc.org/github.com/opencontainers/go-digest). + +# Contributing + +This package is considered fairly complete. It has been in production +in thousands (millions?) of deployments and is fairly battle-hardened. +New additions will be met with skepticism. If you think there is a +missing feature, please file a bug clearly describing the problem and +the alternatives you tried before submitting a PR. + +# Reporting security issues + +Please DO NOT file a public issue, instead send your report privately to +security@opencontainers.org. + +The maintainers take security seriously. If you discover a security issue, +please bring it to their attention right away! + +If you are reporting a security issue, do not create an issue or file a pull +request on GitHub. Instead, disclose the issue responsibly by sending an email +to security@opencontainers.org (which is inhabited only by the maintainers of +the various OCI projects). + +# Copyright and license + +Copyright © 2016 Docker, Inc. All rights reserved, except as follows. Code is released under the [Apache 2.0 license](LICENSE.code). This `README.md` file and the [`CONTRIBUTING.md`](CONTRIBUTING.md) file are licensed under the Creative Commons Attribution 4.0 International License under the terms and conditions set forth in the file [`LICENSE.docs`](LICENSE.docs). You may obtain a duplicate copy of the same license, titled CC BY-SA 4.0, at http://creativecommons.org/licenses/by-sa/4.0/. diff --git a/vendor/github.com/opencontainers/go-digest/algorithm.go b/vendor/github.com/opencontainers/go-digest/algorithm.go new file mode 100644 index 00000000..8813bd26 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/algorithm.go @@ -0,0 +1,192 @@ +// Copyright 2017 Docker, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package digest + +import ( + "crypto" + "fmt" + "hash" + "io" + "regexp" +) + +// Algorithm identifies and implementation of a digester by an identifier. +// Note the that this defines both the hash algorithm used and the string +// encoding. +type Algorithm string + +// supported digest types +const ( + SHA256 Algorithm = "sha256" // sha256 with hex encoding (lower case only) + SHA384 Algorithm = "sha384" // sha384 with hex encoding (lower case only) + SHA512 Algorithm = "sha512" // sha512 with hex encoding (lower case only) + + // Canonical is the primary digest algorithm used with the distribution + // project. Other digests may be used but this one is the primary storage + // digest. + Canonical = SHA256 +) + +var ( + // TODO(stevvooe): Follow the pattern of the standard crypto package for + // registration of digests. Effectively, we are a registerable set and + // common symbol access. + + // algorithms maps values to hash.Hash implementations. Other algorithms + // may be available but they cannot be calculated by the digest package. + algorithms = map[Algorithm]crypto.Hash{ + SHA256: crypto.SHA256, + SHA384: crypto.SHA384, + SHA512: crypto.SHA512, + } + + // anchoredEncodedRegexps contains anchored regular expressions for hex-encoded digests. + // Note that /A-F/ disallowed. + anchoredEncodedRegexps = map[Algorithm]*regexp.Regexp{ + SHA256: regexp.MustCompile(`^[a-f0-9]{64}$`), + SHA384: regexp.MustCompile(`^[a-f0-9]{96}$`), + SHA512: regexp.MustCompile(`^[a-f0-9]{128}$`), + } +) + +// Available returns true if the digest type is available for use. If this +// returns false, Digester and Hash will return nil. +func (a Algorithm) Available() bool { + h, ok := algorithms[a] + if !ok { + return false + } + + // check availability of the hash, as well + return h.Available() +} + +func (a Algorithm) String() string { + return string(a) +} + +// Size returns number of bytes returned by the hash. +func (a Algorithm) Size() int { + h, ok := algorithms[a] + if !ok { + return 0 + } + return h.Size() +} + +// Set implemented to allow use of Algorithm as a command line flag. +func (a *Algorithm) Set(value string) error { + if value == "" { + *a = Canonical + } else { + // just do a type conversion, support is queried with Available. + *a = Algorithm(value) + } + + if !a.Available() { + return ErrDigestUnsupported + } + + return nil +} + +// Digester returns a new digester for the specified algorithm. If the algorithm +// does not have a digester implementation, nil will be returned. This can be +// checked by calling Available before calling Digester. +func (a Algorithm) Digester() Digester { + return &digester{ + alg: a, + hash: a.Hash(), + } +} + +// Hash returns a new hash as used by the algorithm. If not available, the +// method will panic. Check Algorithm.Available() before calling. +func (a Algorithm) Hash() hash.Hash { + if !a.Available() { + // Empty algorithm string is invalid + if a == "" { + panic(fmt.Sprintf("empty digest algorithm, validate before calling Algorithm.Hash()")) + } + + // NOTE(stevvooe): A missing hash is usually a programming error that + // must be resolved at compile time. We don't import in the digest + // package to allow users to choose their hash implementation (such as + // when using stevvooe/resumable or a hardware accelerated package). + // + // Applications that may want to resolve the hash at runtime should + // call Algorithm.Available before call Algorithm.Hash(). + panic(fmt.Sprintf("%v not available (make sure it is imported)", a)) + } + + return algorithms[a].New() +} + +// Encode encodes the raw bytes of a digest, typically from a hash.Hash, into +// the encoded portion of the digest. +func (a Algorithm) Encode(d []byte) string { + // TODO(stevvooe): Currently, all algorithms use a hex encoding. When we + // add support for back registration, we can modify this accordingly. + return fmt.Sprintf("%x", d) +} + +// FromReader returns the digest of the reader using the algorithm. +func (a Algorithm) FromReader(rd io.Reader) (Digest, error) { + digester := a.Digester() + + if _, err := io.Copy(digester.Hash(), rd); err != nil { + return "", err + } + + return digester.Digest(), nil +} + +// FromBytes digests the input and returns a Digest. +func (a Algorithm) FromBytes(p []byte) Digest { + digester := a.Digester() + + if _, err := digester.Hash().Write(p); err != nil { + // Writes to a Hash should never fail. None of the existing + // hash implementations in the stdlib or hashes vendored + // here can return errors from Write. Having a panic in this + // condition instead of having FromBytes return an error value + // avoids unnecessary error handling paths in all callers. + panic("write to hash function returned error: " + err.Error()) + } + + return digester.Digest() +} + +// FromString digests the string input and returns a Digest. +func (a Algorithm) FromString(s string) Digest { + return a.FromBytes([]byte(s)) +} + +// Validate validates the encoded portion string +func (a Algorithm) Validate(encoded string) error { + r, ok := anchoredEncodedRegexps[a] + if !ok { + return ErrDigestUnsupported + } + // Digests much always be hex-encoded, ensuring that their hex portion will + // always be size*2 + if a.Size()*2 != len(encoded) { + return ErrDigestInvalidLength + } + if r.MatchString(encoded) { + return nil + } + return ErrDigestInvalidFormat +} diff --git a/vendor/github.com/opencontainers/go-digest/digest.go b/vendor/github.com/opencontainers/go-digest/digest.go new file mode 100644 index 00000000..ad398cba --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/digest.go @@ -0,0 +1,156 @@ +// Copyright 2017 Docker, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package digest + +import ( + "fmt" + "hash" + "io" + "regexp" + "strings" +) + +// Digest allows simple protection of hex formatted digest strings, prefixed +// by their algorithm. Strings of type Digest have some guarantee of being in +// the correct format and it provides quick access to the components of a +// digest string. +// +// The following is an example of the contents of Digest types: +// +// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc +// +// This allows to abstract the digest behind this type and work only in those +// terms. +type Digest string + +// NewDigest returns a Digest from alg and a hash.Hash object. +func NewDigest(alg Algorithm, h hash.Hash) Digest { + return NewDigestFromBytes(alg, h.Sum(nil)) +} + +// NewDigestFromBytes returns a new digest from the byte contents of p. +// Typically, this can come from hash.Hash.Sum(...) or xxx.SumXXX(...) +// functions. This is also useful for rebuilding digests from binary +// serializations. +func NewDigestFromBytes(alg Algorithm, p []byte) Digest { + return NewDigestFromEncoded(alg, alg.Encode(p)) +} + +// NewDigestFromHex is deprecated. Please use NewDigestFromEncoded. +func NewDigestFromHex(alg, hex string) Digest { + return NewDigestFromEncoded(Algorithm(alg), hex) +} + +// NewDigestFromEncoded returns a Digest from alg and the encoded digest. +func NewDigestFromEncoded(alg Algorithm, encoded string) Digest { + return Digest(fmt.Sprintf("%s:%s", alg, encoded)) +} + +// DigestRegexp matches valid digest types. +var DigestRegexp = regexp.MustCompile(`[a-z0-9]+(?:[.+_-][a-z0-9]+)*:[a-zA-Z0-9=_-]+`) + +// DigestRegexpAnchored matches valid digest types, anchored to the start and end of the match. +var DigestRegexpAnchored = regexp.MustCompile(`^` + DigestRegexp.String() + `$`) + +var ( + // ErrDigestInvalidFormat returned when digest format invalid. + ErrDigestInvalidFormat = fmt.Errorf("invalid checksum digest format") + + // ErrDigestInvalidLength returned when digest has invalid length. + ErrDigestInvalidLength = fmt.Errorf("invalid checksum digest length") + + // ErrDigestUnsupported returned when the digest algorithm is unsupported. + ErrDigestUnsupported = fmt.Errorf("unsupported digest algorithm") +) + +// Parse parses s and returns the validated digest object. An error will +// be returned if the format is invalid. +func Parse(s string) (Digest, error) { + d := Digest(s) + return d, d.Validate() +} + +// FromReader consumes the content of rd until io.EOF, returning canonical digest. +func FromReader(rd io.Reader) (Digest, error) { + return Canonical.FromReader(rd) +} + +// FromBytes digests the input and returns a Digest. +func FromBytes(p []byte) Digest { + return Canonical.FromBytes(p) +} + +// FromString digests the input and returns a Digest. +func FromString(s string) Digest { + return Canonical.FromString(s) +} + +// Validate checks that the contents of d is a valid digest, returning an +// error if not. +func (d Digest) Validate() error { + s := string(d) + i := strings.Index(s, ":") + if i <= 0 || i+1 == len(s) { + return ErrDigestInvalidFormat + } + algorithm, encoded := Algorithm(s[:i]), s[i+1:] + if !algorithm.Available() { + if !DigestRegexpAnchored.MatchString(s) { + return ErrDigestInvalidFormat + } + return ErrDigestUnsupported + } + return algorithm.Validate(encoded) +} + +// Algorithm returns the algorithm portion of the digest. This will panic if +// the underlying digest is not in a valid format. +func (d Digest) Algorithm() Algorithm { + return Algorithm(d[:d.sepIndex()]) +} + +// Verifier returns a writer object that can be used to verify a stream of +// content against the digest. If the digest is invalid, the method will panic. +func (d Digest) Verifier() Verifier { + return hashVerifier{ + hash: d.Algorithm().Hash(), + digest: d, + } +} + +// Encoded returns the encoded portion of the digest. This will panic if the +// underlying digest is not in a valid format. +func (d Digest) Encoded() string { + return string(d[d.sepIndex()+1:]) +} + +// Hex is deprecated. Please use Digest.Encoded. +func (d Digest) Hex() string { + return d.Encoded() +} + +func (d Digest) String() string { + return string(d) +} + +func (d Digest) sepIndex() int { + i := strings.Index(string(d), ":") + + if i < 0 { + panic(fmt.Sprintf("no ':' separator in digest %q", d)) + } + + return i +} diff --git a/vendor/github.com/opencontainers/go-digest/digester.go b/vendor/github.com/opencontainers/go-digest/digester.go new file mode 100644 index 00000000..36fa2728 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/digester.go @@ -0,0 +1,39 @@ +// Copyright 2017 Docker, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package digest + +import "hash" + +// Digester calculates the digest of written data. Writes should go directly +// to the return value of Hash, while calling Digest will return the current +// value of the digest. +type Digester interface { + Hash() hash.Hash // provides direct access to underlying hash instance. + Digest() Digest +} + +// digester provides a simple digester definition that embeds a hasher. +type digester struct { + alg Algorithm + hash hash.Hash +} + +func (d *digester) Hash() hash.Hash { + return d.hash +} + +func (d *digester) Digest() Digest { + return NewDigest(d.alg, d.hash) +} diff --git a/vendor/github.com/opencontainers/go-digest/doc.go b/vendor/github.com/opencontainers/go-digest/doc.go new file mode 100644 index 00000000..491ea1ef --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/doc.go @@ -0,0 +1,56 @@ +// Copyright 2017 Docker, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package digest provides a generalized type to opaquely represent message +// digests and their operations within the registry. The Digest type is +// designed to serve as a flexible identifier in a content-addressable system. +// More importantly, it provides tools and wrappers to work with +// hash.Hash-based digests with little effort. +// +// Basics +// +// The format of a digest is simply a string with two parts, dubbed the +// "algorithm" and the "digest", separated by a colon: +// +// : +// +// An example of a sha256 digest representation follows: +// +// sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc +// +// In this case, the string "sha256" is the algorithm and the hex bytes are +// the "digest". +// +// Because the Digest type is simply a string, once a valid Digest is +// obtained, comparisons are cheap, quick and simple to express with the +// standard equality operator. +// +// Verification +// +// The main benefit of using the Digest type is simple verification against a +// given digest. The Verifier interface, modeled after the stdlib hash.Hash +// interface, provides a common write sink for digest verification. After +// writing is complete, calling the Verifier.Verified method will indicate +// whether or not the stream of bytes matches the target digest. +// +// Missing Features +// +// In addition to the above, we intend to add the following features to this +// package: +// +// 1. A Digester type that supports write sink digest calculation. +// +// 2. Suspend and resume of ongoing digest calculations to support efficient digest verification in the registry. +// +package digest diff --git a/vendor/github.com/opencontainers/go-digest/verifiers.go b/vendor/github.com/opencontainers/go-digest/verifiers.go new file mode 100644 index 00000000..32125e91 --- /dev/null +++ b/vendor/github.com/opencontainers/go-digest/verifiers.go @@ -0,0 +1,45 @@ +// Copyright 2017 Docker, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package digest + +import ( + "hash" + "io" +) + +// Verifier presents a general verification interface to be used with message +// digests and other byte stream verifications. Users instantiate a Verifier +// from one of the various methods, write the data under test to it then check +// the result with the Verified method. +type Verifier interface { + io.Writer + + // Verified will return true if the content written to Verifier matches + // the digest. + Verified() bool +} + +type hashVerifier struct { + digest Digest + hash hash.Hash +} + +func (hv hashVerifier) Write(p []byte) (n int, err error) { + return hv.hash.Write(p) +} + +func (hv hashVerifier) Verified() bool { + return hv.digest == NewDigest(hv.digest.Algorithm(), hv.hash) +} diff --git a/vendor/github.com/rivo/tview/form.go b/vendor/github.com/rivo/tview/form.go index a511f33e..8b9e77a5 100644 --- a/vendor/github.com/rivo/tview/form.go +++ b/vendor/github.com/rivo/tview/form.go @@ -59,7 +59,8 @@ type Form struct { itemPadding int // The index of the item or button which has focus. (Items are counted first, - // buttons are counted last.) + // buttons are counted last.) This is only used when the form itself receives + // focus so that the last element that had focus keeps it. focusedElement int // The label color. @@ -345,6 +346,11 @@ func (f *Form) SetCancelFunc(callback func()) *Form { func (f *Form) Draw(screen tcell.Screen) { f.Box.Draw(screen) + // Determine the actual item that has focus. + if index := f.focusIndex(); index >= 0 { + f.focusedElement = index + } + // Determine the dimensions. x, y, width, height := f.GetInnerRect() topLimit := y @@ -575,15 +581,22 @@ func (f *Form) HasFocus() bool { if f.hasFocus { return true } - for _, item := range f.items { - if item.GetFocusable().HasFocus() { - return true - } - } - for _, button := range f.buttons { - if button.focus.HasFocus() { - return true - } - } - return false + return f.focusIndex() >= 0 +} + +// focusIndex returns the index of the currently focused item, counting form +// items first, then buttons. A negative value indicates that no containeed item +// has focus. +func (f *Form) focusIndex() int { + for index, item := range f.items { + if item.GetFocusable().HasFocus() { + return index + } + } + for index, button := range f.buttons { + if button.focus.HasFocus() { + return len(f.items) + index + } + } + return -1 } diff --git a/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go b/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go deleted file mode 100644 index 83cb91a1..00000000 --- a/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go +++ /dev/null @@ -1,34 +0,0 @@ -// +build ignore - -/* -Input to cgo -godefs. -*/ - -package mem - -/* -#include -#include -#include -#include - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - CTLVm = 2 - CTLVfs = 10 - VmUvmexp = 4 // get uvmexp - VfsGeneric = 0 - VfsBcacheStat = 3 -) - -const ( - sizeOfUvmexp = C.sizeof_struct_uvmexp - sizeOfBcachestats = C.sizeof_struct_bcachestats -) - -type Uvmexp C.struct_uvmexp -type Bcachestats C.struct_bcachestats diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go index aa1c2b95..e0364e9e 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -113,6 +113,17 @@ func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { return Error(t, err, append([]interface{}{msg}, args...)...) } +// Eventuallyf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Eventually(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...) +} + // Exactlyf asserts that two objects are equal in value and type. // // assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) @@ -157,6 +168,31 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool return FileExists(t, path, append([]interface{}{msg}, args...)...) } +// Greaterf asserts that the first element is greater than the second +// +// assert.Greaterf(t, 2, 1, "error message %s", "formatted") +// assert.Greaterf(t, float64(2, "error message %s", "formatted"), float64(1)) +// assert.Greaterf(t, "b", "a", "error message %s", "formatted") +func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Greater(t, e1, e2, append([]interface{}{msg}, args...)...) +} + +// GreaterOrEqualf asserts that the first element is greater than or equal to the second +// +// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") +// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") +// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted") +// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted") +func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return GreaterOrEqual(t, e1, e2, append([]interface{}{msg}, args...)...) +} + // HTTPBodyContainsf asserts that a specified handler returns a // body that contains a string. // @@ -289,6 +325,14 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) } +// YAMLEqf asserts that two YAML strings are equivalent. +func YAMLEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return YAMLEq(t, expected, actual, append([]interface{}{msg}, args...)...) +} + // Lenf asserts that the specified object has specific length. // Lenf also fails if the object has a type that len() not accept. // @@ -300,6 +344,31 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf return Len(t, object, length, append([]interface{}{msg}, args...)...) } +// Lessf asserts that the first element is less than the second +// +// assert.Lessf(t, 1, 2, "error message %s", "formatted") +// assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2)) +// assert.Lessf(t, "a", "b", "error message %s", "formatted") +func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Less(t, e1, e2, append([]interface{}{msg}, args...)...) +} + +// LessOrEqualf asserts that the first element is less than or equal to the second +// +// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") +// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") +// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted") +// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted") +func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return LessOrEqual(t, e1, e2, append([]interface{}{msg}, args...)...) +} + // Nilf asserts that the specified object is nil. // // assert.Nilf(t, err, "error message %s", "formatted") @@ -444,6 +513,19 @@ func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...in return Regexp(t, rx, str, append([]interface{}{msg}, args...)...) } +// Samef asserts that two pointers reference the same object. +// +// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func Samef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Same(t, expected, actual, append([]interface{}{msg}, args...)...) +} + // Subsetf asserts that the specified list(array, slice...) contains all // elements given in the specified subset(array, slice...). // diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index de39f794..26830403 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -215,6 +215,28 @@ func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { return Errorf(a.t, err, msg, args...) } +// Eventually asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// a.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond) +func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Eventually(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// Eventuallyf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// a.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Eventuallyf(a.t, condition, waitFor, tick, msg, args...) +} + // Exactly asserts that two objects are equal in value and type. // // a.Exactly(int32(123), int64(123)) @@ -303,6 +325,56 @@ func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) b return FileExistsf(a.t, path, msg, args...) } +// Greater asserts that the first element is greater than the second +// +// a.Greater(2, 1) +// a.Greater(float64(2), float64(1)) +// a.Greater("b", "a") +func (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Greater(a.t, e1, e2, msgAndArgs...) +} + +// GreaterOrEqual asserts that the first element is greater than or equal to the second +// +// a.GreaterOrEqual(2, 1) +// a.GreaterOrEqual(2, 2) +// a.GreaterOrEqual("b", "a") +// a.GreaterOrEqual("b", "b") +func (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return GreaterOrEqual(a.t, e1, e2, msgAndArgs...) +} + +// GreaterOrEqualf asserts that the first element is greater than or equal to the second +// +// a.GreaterOrEqualf(2, 1, "error message %s", "formatted") +// a.GreaterOrEqualf(2, 2, "error message %s", "formatted") +// a.GreaterOrEqualf("b", "a", "error message %s", "formatted") +// a.GreaterOrEqualf("b", "b", "error message %s", "formatted") +func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return GreaterOrEqualf(a.t, e1, e2, msg, args...) +} + +// Greaterf asserts that the first element is greater than the second +// +// a.Greaterf(2, 1, "error message %s", "formatted") +// a.Greaterf(float64(2, "error message %s", "formatted"), float64(1)) +// a.Greaterf("b", "a", "error message %s", "formatted") +func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Greaterf(a.t, e1, e2, msg, args...) +} + // HTTPBodyContains asserts that a specified handler returns a // body that contains a string. // @@ -567,6 +639,22 @@ func (a *Assertions) JSONEqf(expected string, actual string, msg string, args .. return JSONEqf(a.t, expected, actual, msg, args...) } +// YAMLEq asserts that two YAML strings are equivalent. +func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return YAMLEq(a.t, expected, actual, msgAndArgs...) +} + +// YAMLEqf asserts that two YAML strings are equivalent. +func (a *Assertions) YAMLEqf(expected string, actual string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return YAMLEqf(a.t, expected, actual, msg, args...) +} + // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. // @@ -589,6 +677,56 @@ func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...in return Lenf(a.t, object, length, msg, args...) } +// Less asserts that the first element is less than the second +// +// a.Less(1, 2) +// a.Less(float64(1), float64(2)) +// a.Less("a", "b") +func (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Less(a.t, e1, e2, msgAndArgs...) +} + +// LessOrEqual asserts that the first element is less than or equal to the second +// +// a.LessOrEqual(1, 2) +// a.LessOrEqual(2, 2) +// a.LessOrEqual("a", "b") +// a.LessOrEqual("b", "b") +func (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return LessOrEqual(a.t, e1, e2, msgAndArgs...) +} + +// LessOrEqualf asserts that the first element is less than or equal to the second +// +// a.LessOrEqualf(1, 2, "error message %s", "formatted") +// a.LessOrEqualf(2, 2, "error message %s", "formatted") +// a.LessOrEqualf("a", "b", "error message %s", "formatted") +// a.LessOrEqualf("b", "b", "error message %s", "formatted") +func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return LessOrEqualf(a.t, e1, e2, msg, args...) +} + +// Lessf asserts that the first element is less than the second +// +// a.Lessf(1, 2, "error message %s", "formatted") +// a.Lessf(float64(1, "error message %s", "formatted"), float64(2)) +// a.Lessf("a", "b", "error message %s", "formatted") +func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Lessf(a.t, e1, e2, msg, args...) +} + // Nil asserts that the specified object is nil. // // a.Nil(err) @@ -877,6 +1015,32 @@ func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args . return Regexpf(a.t, rx, str, msg, args...) } +// Same asserts that two pointers reference the same object. +// +// a.Same(ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) Same(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Same(a.t, expected, actual, msgAndArgs...) +} + +// Samef asserts that two pointers reference the same object. +// +// a.Samef(ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) Samef(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Samef(a.t, expected, actual, msg, args...) +} + // Subset asserts that the specified list(array, slice...) contains all // elements given in the specified subset(array, slice...). // diff --git a/vendor/github.com/stretchr/testify/assert/assertion_order.go b/vendor/github.com/stretchr/testify/assert/assertion_order.go new file mode 100644 index 00000000..15a486ca --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/assertion_order.go @@ -0,0 +1,309 @@ +package assert + +import ( + "fmt" + "reflect" +) + +func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { + switch kind { + case reflect.Int: + { + intobj1 := obj1.(int) + intobj2 := obj2.(int) + if intobj1 > intobj2 { + return -1, true + } + if intobj1 == intobj2 { + return 0, true + } + if intobj1 < intobj2 { + return 1, true + } + } + case reflect.Int8: + { + int8obj1 := obj1.(int8) + int8obj2 := obj2.(int8) + if int8obj1 > int8obj2 { + return -1, true + } + if int8obj1 == int8obj2 { + return 0, true + } + if int8obj1 < int8obj2 { + return 1, true + } + } + case reflect.Int16: + { + int16obj1 := obj1.(int16) + int16obj2 := obj2.(int16) + if int16obj1 > int16obj2 { + return -1, true + } + if int16obj1 == int16obj2 { + return 0, true + } + if int16obj1 < int16obj2 { + return 1, true + } + } + case reflect.Int32: + { + int32obj1 := obj1.(int32) + int32obj2 := obj2.(int32) + if int32obj1 > int32obj2 { + return -1, true + } + if int32obj1 == int32obj2 { + return 0, true + } + if int32obj1 < int32obj2 { + return 1, true + } + } + case reflect.Int64: + { + int64obj1 := obj1.(int64) + int64obj2 := obj2.(int64) + if int64obj1 > int64obj2 { + return -1, true + } + if int64obj1 == int64obj2 { + return 0, true + } + if int64obj1 < int64obj2 { + return 1, true + } + } + case reflect.Uint: + { + uintobj1 := obj1.(uint) + uintobj2 := obj2.(uint) + if uintobj1 > uintobj2 { + return -1, true + } + if uintobj1 == uintobj2 { + return 0, true + } + if uintobj1 < uintobj2 { + return 1, true + } + } + case reflect.Uint8: + { + uint8obj1 := obj1.(uint8) + uint8obj2 := obj2.(uint8) + if uint8obj1 > uint8obj2 { + return -1, true + } + if uint8obj1 == uint8obj2 { + return 0, true + } + if uint8obj1 < uint8obj2 { + return 1, true + } + } + case reflect.Uint16: + { + uint16obj1 := obj1.(uint16) + uint16obj2 := obj2.(uint16) + if uint16obj1 > uint16obj2 { + return -1, true + } + if uint16obj1 == uint16obj2 { + return 0, true + } + if uint16obj1 < uint16obj2 { + return 1, true + } + } + case reflect.Uint32: + { + uint32obj1 := obj1.(uint32) + uint32obj2 := obj2.(uint32) + if uint32obj1 > uint32obj2 { + return -1, true + } + if uint32obj1 == uint32obj2 { + return 0, true + } + if uint32obj1 < uint32obj2 { + return 1, true + } + } + case reflect.Uint64: + { + uint64obj1 := obj1.(uint64) + uint64obj2 := obj2.(uint64) + if uint64obj1 > uint64obj2 { + return -1, true + } + if uint64obj1 == uint64obj2 { + return 0, true + } + if uint64obj1 < uint64obj2 { + return 1, true + } + } + case reflect.Float32: + { + float32obj1 := obj1.(float32) + float32obj2 := obj2.(float32) + if float32obj1 > float32obj2 { + return -1, true + } + if float32obj1 == float32obj2 { + return 0, true + } + if float32obj1 < float32obj2 { + return 1, true + } + } + case reflect.Float64: + { + float64obj1 := obj1.(float64) + float64obj2 := obj2.(float64) + if float64obj1 > float64obj2 { + return -1, true + } + if float64obj1 == float64obj2 { + return 0, true + } + if float64obj1 < float64obj2 { + return 1, true + } + } + case reflect.String: + { + stringobj1 := obj1.(string) + stringobj2 := obj2.(string) + if stringobj1 > stringobj2 { + return -1, true + } + if stringobj1 == stringobj2 { + return 0, true + } + if stringobj1 < stringobj2 { + return 1, true + } + } + } + + return 0, false +} + +// Greater asserts that the first element is greater than the second +// +// assert.Greater(t, 2, 1) +// assert.Greater(t, float64(2), float64(1)) +// assert.Greater(t, "b", "a") +func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + e1Kind := reflect.ValueOf(e1).Kind() + e2Kind := reflect.ValueOf(e2).Kind() + if e1Kind != e2Kind { + return Fail(t, "Elements should be the same type", msgAndArgs...) + } + + res, isComparable := compare(e1, e2, e1Kind) + if !isComparable { + return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) + } + + if res != -1 { + return Fail(t, fmt.Sprintf("\"%v\" is not greater than \"%v\"", e1, e2), msgAndArgs...) + } + + return true +} + +// GreaterOrEqual asserts that the first element is greater than or equal to the second +// +// assert.GreaterOrEqual(t, 2, 1) +// assert.GreaterOrEqual(t, 2, 2) +// assert.GreaterOrEqual(t, "b", "a") +// assert.GreaterOrEqual(t, "b", "b") +func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + e1Kind := reflect.ValueOf(e1).Kind() + e2Kind := reflect.ValueOf(e2).Kind() + if e1Kind != e2Kind { + return Fail(t, "Elements should be the same type", msgAndArgs...) + } + + res, isComparable := compare(e1, e2, e1Kind) + if !isComparable { + return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) + } + + if res != -1 && res != 0 { + return Fail(t, fmt.Sprintf("\"%v\" is not greater than or equal to \"%v\"", e1, e2), msgAndArgs...) + } + + return true +} + +// Less asserts that the first element is less than the second +// +// assert.Less(t, 1, 2) +// assert.Less(t, float64(1), float64(2)) +// assert.Less(t, "a", "b") +func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + e1Kind := reflect.ValueOf(e1).Kind() + e2Kind := reflect.ValueOf(e2).Kind() + if e1Kind != e2Kind { + return Fail(t, "Elements should be the same type", msgAndArgs...) + } + + res, isComparable := compare(e1, e2, e1Kind) + if !isComparable { + return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) + } + + if res != 1 { + return Fail(t, fmt.Sprintf("\"%v\" is not less than \"%v\"", e1, e2), msgAndArgs...) + } + + return true +} + +// LessOrEqual asserts that the first element is less than or equal to the second +// +// assert.LessOrEqual(t, 1, 2) +// assert.LessOrEqual(t, 2, 2) +// assert.LessOrEqual(t, "a", "b") +// assert.LessOrEqual(t, "b", "b") +func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + e1Kind := reflect.ValueOf(e1).Kind() + e2Kind := reflect.ValueOf(e2).Kind() + if e1Kind != e2Kind { + return Fail(t, "Elements should be the same type", msgAndArgs...) + } + + res, isComparable := compare(e1, e2, e1Kind) + if !isComparable { + return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) + } + + if res != 1 && res != 0 { + return Fail(t, fmt.Sprintf("\"%v\" is not less than or equal to \"%v\"", e1, e2), msgAndArgs...) + } + + return true +} diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index 9bd4a80e..044da8b0 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -18,6 +18,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/pmezard/go-difflib/difflib" + yaml "gopkg.in/yaml.v2" ) //go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_format.go.tmpl @@ -350,6 +351,37 @@ func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) } +// Same asserts that two pointers reference the same object. +// +// assert.Same(t, ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + expectedPtr, actualPtr := reflect.ValueOf(expected), reflect.ValueOf(actual) + if expectedPtr.Kind() != reflect.Ptr || actualPtr.Kind() != reflect.Ptr { + return Fail(t, "Invalid operation: both arguments must be pointers", msgAndArgs...) + } + + expectedType, actualType := reflect.TypeOf(expected), reflect.TypeOf(actual) + if expectedType != actualType { + return Fail(t, fmt.Sprintf("Pointer expected to be of type %v, but was %v", + expectedType, actualType), msgAndArgs...) + } + + if expected != actual { + return Fail(t, fmt.Sprintf("Not same: \n"+ + "expected: %p %#v\n"+ + "actual : %p %#v", expected, expected, actual, actual), msgAndArgs...) + } + + return true +} + // formatUnequalValues takes two values of arbitrary types and returns string // representations appropriate to be presented to the user. // @@ -479,14 +511,14 @@ func isEmpty(object interface{}) bool { // collection types are empty when they have no element case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: return objValue.Len() == 0 - // pointers are empty if nil or if the value they point to is empty + // pointers are empty if nil or if the value they point to is empty case reflect.Ptr: if objValue.IsNil() { return true } deref := objValue.Elem().Interface() return isEmpty(deref) - // for all other types, compare against the zero value + // for all other types, compare against the zero value default: zero := reflect.Zero(objValue.Type()) return reflect.DeepEqual(object, zero.Interface()) @@ -629,7 +661,7 @@ func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{ func includeElement(list interface{}, element interface{}) (ok, found bool) { listValue := reflect.ValueOf(list) - elementValue := reflect.ValueOf(element) + listKind := reflect.TypeOf(list).Kind() defer func() { if e := recover(); e != nil { ok = false @@ -637,11 +669,12 @@ func includeElement(list interface{}, element interface{}) (ok, found bool) { } }() - if reflect.TypeOf(list).Kind() == reflect.String { + if listKind == reflect.String { + elementValue := reflect.ValueOf(element) return true, strings.Contains(listValue.String(), elementValue.String()) } - if reflect.TypeOf(list).Kind() == reflect.Map { + if listKind == reflect.Map { mapKeys := listValue.MapKeys() for i := 0; i < len(mapKeys); i++ { if ObjectsAreEqual(mapKeys[i].Interface(), element) { @@ -1337,6 +1370,24 @@ func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{ return Equal(t, expectedJSONAsInterface, actualJSONAsInterface, msgAndArgs...) } +// YAMLEq asserts that two YAML strings are equivalent. +func YAMLEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + var expectedYAMLAsInterface, actualYAMLAsInterface interface{} + + if err := yaml.Unmarshal([]byte(expected), &expectedYAMLAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Expected value ('%s') is not valid yaml.\nYAML parsing error: '%s'", expected, err.Error()), msgAndArgs...) + } + + if err := yaml.Unmarshal([]byte(actual), &actualYAMLAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Input ('%s') needs to be valid yaml.\nYAML error: '%s'", actual, err.Error()), msgAndArgs...) + } + + return Equal(t, expectedYAMLAsInterface, actualYAMLAsInterface, msgAndArgs...) +} + func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { t := reflect.TypeOf(v) k := t.Kind() @@ -1371,8 +1422,8 @@ func diff(expected interface{}, actual interface{}) string { e = spewConfig.Sdump(expected) a = spewConfig.Sdump(actual) } else { - e = expected.(string) - a = actual.(string) + e = reflect.ValueOf(expected).String() + a = reflect.ValueOf(actual).String() } diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ @@ -1414,3 +1465,34 @@ var spewConfig = spew.ConfigState{ type tHelper interface { Helper() } + +// Eventually asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond) +func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + timer := time.NewTimer(waitFor) + ticker := time.NewTicker(tick) + checkPassed := make(chan bool) + defer timer.Stop() + defer ticker.Stop() + defer close(checkPassed) + for { + select { + case <-timer.C: + return Fail(t, "Condition never satisfied", msgAndArgs...) + case result := <-checkPassed: + if result { + return true + } + case <-ticker.C: + go func() { + checkPassed <- condition() + }() + } + } +} diff --git a/vendor/go.opencensus.io/README.md b/vendor/go.opencensus.io/README.md index fabab2e0..a8cd09ea 100644 --- a/vendor/go.opencensus.io/README.md +++ b/vendor/go.opencensus.io/README.md @@ -78,7 +78,7 @@ Package `tag` allows adding or modifying tags in the current context. [embedmd]:# (internal/readme/tags.go new) ```go -ctx, err = tag.New(ctx, +ctx, err := tag.New(ctx, tag.Insert(osKey, "macOS-10.12.5"), tag.Upsert(userIDKey, "cde36753ed"), ) diff --git a/vendor/go.opencensus.io/go.mod b/vendor/go.opencensus.io/go.mod index cb4de80f..7c1886e9 100644 --- a/vendor/go.opencensus.io/go.mod +++ b/vendor/go.opencensus.io/go.mod @@ -1,12 +1,14 @@ module go.opencensus.io require ( + github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 github.com/golang/protobuf v1.3.1 github.com/google/go-cmp v0.3.0 - github.com/hashicorp/golang-lru v0.5.1 - golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 + golang.org/x/net v0.0.0-20190620200207-3b0461eec859 golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd // indirect golang.org/x/text v0.3.2 // indirect google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb // indirect google.golang.org/grpc v1.20.1 ) + +go 1.13 diff --git a/vendor/go.opencensus.io/go.sum b/vendor/go.opencensus.io/go.sum index 0b948c2b..212b6b73 100644 --- a/vendor/go.opencensus.io/go.sum +++ b/vendor/go.opencensus.io/go.sum @@ -3,6 +3,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -10,20 +12,19 @@ github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 h1:KaQtG+aDELoNmXYas3TVkGNYRuq8JQ1aa7LJt8EXVyo= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -45,6 +46,7 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/vendor/go.opencensus.io/internal/internal.go b/vendor/go.opencensus.io/internal/internal.go index 9a638781..81dc7183 100644 --- a/vendor/go.opencensus.io/internal/internal.go +++ b/vendor/go.opencensus.io/internal/internal.go @@ -33,5 +33,5 @@ var UserAgent = fmt.Sprintf("opencensus-go/%s", opencensus.Version()) // end as a monotonic time. // See https://golang.org/pkg/time/#hdr-Monotonic_Clocks func MonotonicEndTime(start time.Time) time.Time { - return start.Add(time.Now().Sub(start)) + return start.Add(time.Since(start)) } diff --git a/vendor/go.opencensus.io/opencensus.go b/vendor/go.opencensus.io/opencensus.go index 626d7364..e5e4b436 100644 --- a/vendor/go.opencensus.io/opencensus.go +++ b/vendor/go.opencensus.io/opencensus.go @@ -17,5 +17,5 @@ package opencensus // import "go.opencensus.io" // Version is the current release version of OpenCensus in use. func Version() string { - return "0.22.0" + return "0.23.0" } diff --git a/vendor/go.opencensus.io/plugin/ochttp/server.go b/vendor/go.opencensus.io/plugin/ochttp/server.go index 4f6404fa..dc6563a1 100644 --- a/vendor/go.opencensus.io/plugin/ochttp/server.go +++ b/vendor/go.opencensus.io/plugin/ochttp/server.go @@ -128,7 +128,7 @@ func (h *Handler) startTrace(w http.ResponseWriter, r *http.Request) (*http.Requ // TODO: Handle cases where ContentLength is not set. } else if r.ContentLength > 0 { span.AddMessageReceiveEvent(0, /* TODO: messageID */ - int64(r.ContentLength), -1) + r.ContentLength, -1) } return r.WithContext(ctx), span.End } @@ -174,8 +174,6 @@ type trackingResponseWriter struct { // Compile time assertion for ResponseWriter interface var _ http.ResponseWriter = (*trackingResponseWriter)(nil) -var logTagsErrorOnce sync.Once - func (t *trackingResponseWriter) end(tags *addedTags) { t.endOnce.Do(func() { if t.statusCode == 0 { diff --git a/vendor/go.opencensus.io/plugin/ochttp/stats.go b/vendor/go.opencensus.io/plugin/ochttp/stats.go index 63bbcda5..ee372904 100644 --- a/vendor/go.opencensus.io/plugin/ochttp/stats.go +++ b/vendor/go.opencensus.io/plugin/ochttp/stats.go @@ -92,38 +92,38 @@ var ( // The value of this tag can be controlled by the HTTP client, so you need // to watch out for potentially generating high-cardinality labels in your // metrics backend if you use this tag in views. - Host, _ = tag.NewKey("http.host") + Host = tag.MustNewKey("http.host") // StatusCode is the numeric HTTP response status code, // or "error" if a transport error occurred and no status code was read. - StatusCode, _ = tag.NewKey("http.status") + StatusCode = tag.MustNewKey("http.status") // Path is the URL path (not including query string) in the request. // // The value of this tag can be controlled by the HTTP client, so you need // to watch out for potentially generating high-cardinality labels in your // metrics backend if you use this tag in views. - Path, _ = tag.NewKey("http.path") + Path = tag.MustNewKey("http.path") // Method is the HTTP method of the request, capitalized (GET, POST, etc.). - Method, _ = tag.NewKey("http.method") + Method = tag.MustNewKey("http.method") // KeyServerRoute is a low cardinality string representing the logical // handler of the request. This is usually the pattern registered on the a // ServeMux (or similar string). - KeyServerRoute, _ = tag.NewKey("http_server_route") + KeyServerRoute = tag.MustNewKey("http_server_route") ) // Client tag keys. var ( // KeyClientMethod is the HTTP method, capitalized (i.e. GET, POST, PUT, DELETE, etc.). - KeyClientMethod, _ = tag.NewKey("http_client_method") + KeyClientMethod = tag.MustNewKey("http_client_method") // KeyClientPath is the URL path (not including query string). - KeyClientPath, _ = tag.NewKey("http_client_path") + KeyClientPath = tag.MustNewKey("http_client_path") // KeyClientStatus is the HTTP status code as an integer (e.g. 200, 404, 500.), or "error" if no response status line was received. - KeyClientStatus, _ = tag.NewKey("http_client_status") + KeyClientStatus = tag.MustNewKey("http_client_status") // KeyClientHost is the value of the request Host header. - KeyClientHost, _ = tag.NewKey("http_client_host") + KeyClientHost = tag.MustNewKey("http_client_host") ) // Default distributions used by views in this package. diff --git a/vendor/go.opencensus.io/plugin/ochttp/trace.go b/vendor/go.opencensus.io/plugin/ochttp/trace.go index c23b97fb..53e71305 100644 --- a/vendor/go.opencensus.io/plugin/ochttp/trace.go +++ b/vendor/go.opencensus.io/plugin/ochttp/trace.go @@ -186,6 +186,8 @@ func TraceStatus(httpStatusCode int, statusLine string) trace.Status { code = trace.StatusCodeCancelled case http.StatusBadRequest: code = trace.StatusCodeInvalidArgument + case http.StatusUnprocessableEntity: + code = trace.StatusCodeInvalidArgument case http.StatusGatewayTimeout: code = trace.StatusCodeDeadlineExceeded case http.StatusNotFound: diff --git a/vendor/go.opencensus.io/stats/view/aggregation.go b/vendor/go.opencensus.io/stats/view/aggregation.go index b7f169b4..8bd25314 100644 --- a/vendor/go.opencensus.io/stats/view/aggregation.go +++ b/vendor/go.opencensus.io/stats/view/aggregation.go @@ -82,7 +82,7 @@ func Sum() *Aggregation { // Distribution indicates that the desired aggregation is // a histogram distribution. // -// An distribution aggregation may contain a histogram of the values in the +// A distribution aggregation may contain a histogram of the values in the // population. The bucket boundaries for that histogram are described // by the bounds. This defines len(bounds)+1 buckets. // diff --git a/vendor/go.opencensus.io/stats/view/doc.go b/vendor/go.opencensus.io/stats/view/doc.go index dced225c..7bbedfe1 100644 --- a/vendor/go.opencensus.io/stats/view/doc.go +++ b/vendor/go.opencensus.io/stats/view/doc.go @@ -29,7 +29,7 @@ // LastValue just keeps track of the most recently recorded measurement value. // All aggregations are cumulative. // -// Views can be registerd and unregistered at any time during program execution. +// Views can be registered and unregistered at any time during program execution. // // Libraries can define views but it is recommended that in most cases registering // views be left up to applications. diff --git a/vendor/go.opencensus.io/stats/view/view.go b/vendor/go.opencensus.io/stats/view/view.go index 37f88e1d..293b54ec 100644 --- a/vendor/go.opencensus.io/stats/view/view.go +++ b/vendor/go.opencensus.io/stats/view/view.go @@ -30,7 +30,7 @@ import ( ) // View allows users to aggregate the recorded stats.Measurements. -// Views need to be passed to the Register function to be before data will be +// Views need to be passed to the Register function before data will be // collected and sent to Exporters. type View struct { Name string // Name of View. Must be unique. If unset, will default to the name of the Measure. @@ -43,7 +43,7 @@ type View struct { // Measure is a stats.Measure to aggregate in this view. Measure stats.Measure - // Aggregation is the aggregation function tp apply to the set of Measurements. + // Aggregation is the aggregation function to apply to the set of Measurements. Aggregation *Aggregation } @@ -189,7 +189,7 @@ func (r *Row) String() string { } // Equal returns true if both rows are equal. Tags are expected to be ordered -// by the key name. Even both rows have the same tags but the tags appear in +// by the key name. Even if both rows have the same tags but the tags appear in // different orders it will return false. func (r *Row) Equal(other *Row) bool { if r == other { diff --git a/vendor/go.opencensus.io/stats/view/view_to_metric.go b/vendor/go.opencensus.io/stats/view/view_to_metric.go index f67b5c46..293c1646 100644 --- a/vendor/go.opencensus.io/stats/view/view_to_metric.go +++ b/vendor/go.opencensus.io/stats/view/view_to_metric.go @@ -85,12 +85,21 @@ func viewToMetricDescriptor(v *View) *metricdata.Descriptor { return &metricdata.Descriptor{ Name: v.Name, Description: v.Description, - Unit: getUnit(v.Measure.Unit()), + Unit: convertUnit(v), Type: getType(v), LabelKeys: getLabelKeys(v), } } +func convertUnit(v *View) metricdata.Unit { + switch v.Aggregation.Type { + case AggTypeCount: + return metricdata.UnitDimensionless + default: + return getUnit(v.Measure.Unit()) + } +} + func toLabelValues(row *Row, expectedKeys []metricdata.LabelKey) []metricdata.LabelValue { labelValues := []metricdata.LabelValue{} tagMap := make(map[string]string) diff --git a/vendor/go.opencensus.io/tag/key.go b/vendor/go.opencensus.io/tag/key.go index 4e63d08c..71ec9136 100644 --- a/vendor/go.opencensus.io/tag/key.go +++ b/vendor/go.opencensus.io/tag/key.go @@ -21,7 +21,7 @@ type Key struct { } // NewKey creates or retrieves a string key identified by name. -// Calling NewKey consequently with the same name returns the same key. +// Calling NewKey more than once with the same name returns the same key. func NewKey(name string) (Key, error) { if !checkKeyName(name) { return Key{}, errInvalidKeyName @@ -29,8 +29,7 @@ func NewKey(name string) (Key, error) { return Key{name: name}, nil } -// MustNewKey creates or retrieves a string key identified by name. -// An invalid key name raises a panic. +// MustNewKey returns a key with the given name, and panics if name is an invalid key name. func MustNewKey(name string) Key { k, err := NewKey(name) if err != nil { diff --git a/vendor/go.opencensus.io/tag/map_codec.go b/vendor/go.opencensus.io/tag/map_codec.go index f8b58276..c242e695 100644 --- a/vendor/go.opencensus.io/tag/map_codec.go +++ b/vendor/go.opencensus.io/tag/map_codec.go @@ -168,7 +168,7 @@ func Encode(m *Map) []byte { eg := &encoderGRPC{ buf: make([]byte, len(m.m)), } - eg.writeByte(byte(tagsVersionID)) + eg.writeByte(tagsVersionID) for k, v := range m.m { if v.m.ttl.ttl == valueTTLUnlimitedPropagation { eg.writeByte(byte(keyTypeString)) diff --git a/vendor/go.opencensus.io/trace/lrumap.go b/vendor/go.opencensus.io/trace/lrumap.go index 3f80a336..dc7a295c 100644 --- a/vendor/go.opencensus.io/trace/lrumap.go +++ b/vendor/go.opencensus.io/trace/lrumap.go @@ -15,23 +15,47 @@ package trace import ( - "github.com/hashicorp/golang-lru/simplelru" + "github.com/golang/groupcache/lru" ) +// A simple lru.Cache wrapper that tracks the keys of the current contents and +// the cumulative number of evicted items. type lruMap struct { - simpleLruMap *simplelru.LRU + cacheKeys map[lru.Key]bool + cache *lru.Cache droppedCount int } func newLruMap(size int) *lruMap { - lm := &lruMap{} - lm.simpleLruMap, _ = simplelru.NewLRU(size, nil) + lm := &lruMap{ + cacheKeys: make(map[lru.Key]bool), + cache: lru.New(size), + droppedCount: 0, + } + lm.cache.OnEvicted = func(key lru.Key, value interface{}) { + delete(lm.cacheKeys, key) + lm.droppedCount++ + } return lm } -func (lm *lruMap) add(key, value interface{}) { - evicted := lm.simpleLruMap.Add(key, value) - if evicted { - lm.droppedCount++ - } +func (lm lruMap) len() int { + return lm.cache.Len() +} + +func (lm lruMap) keys() []interface{} { + keys := []interface{}{} + for k := range lm.cacheKeys { + keys = append(keys, k) + } + return keys +} + +func (lm *lruMap) add(key, value interface{}) { + lm.cacheKeys[lru.Key(key)] = true + lm.cache.Add(lru.Key(key), value) +} + +func (lm *lruMap) get(key interface{}) (interface{}, bool) { + return lm.cache.Get(key) } diff --git a/vendor/go.opencensus.io/trace/trace.go b/vendor/go.opencensus.io/trace/trace.go index 38ead7bf..3f8977b4 100644 --- a/vendor/go.opencensus.io/trace/trace.go +++ b/vendor/go.opencensus.io/trace/trace.go @@ -296,7 +296,7 @@ func (s *Span) makeSpanData() *SpanData { var sd SpanData s.mu.Lock() sd = *s.data - if s.lruAttributes.simpleLruMap.Len() > 0 { + if s.lruAttributes.len() > 0 { sd.Attributes = s.lruAttributesToAttributeMap() sd.DroppedAttributeCount = s.lruAttributes.droppedCount } @@ -370,8 +370,8 @@ func (s *Span) interfaceArrayToAnnotationArray() []Annotation { func (s *Span) lruAttributesToAttributeMap() map[string]interface{} { attributes := make(map[string]interface{}) - for _, key := range s.lruAttributes.simpleLruMap.Keys() { - value, ok := s.lruAttributes.simpleLruMap.Get(key) + for _, key := range s.lruAttributes.keys() { + value, ok := s.lruAttributes.get(key) if ok { keyStr := key.(string) attributes[keyStr] = value diff --git a/vendor/golang.org/x/net/html/atom/gen.go b/vendor/golang.org/x/net/html/atom/gen.go deleted file mode 100644 index 5d052781..00000000 --- a/vendor/golang.org/x/net/html/atom/gen.go +++ /dev/null @@ -1,712 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -//go:generate go run gen.go -//go:generate go run gen.go -test - -package main - -import ( - "bytes" - "flag" - "fmt" - "go/format" - "io/ioutil" - "math/rand" - "os" - "sort" - "strings" -) - -// identifier converts s to a Go exported identifier. -// It converts "div" to "Div" and "accept-charset" to "AcceptCharset". -func identifier(s string) string { - b := make([]byte, 0, len(s)) - cap := true - for _, c := range s { - if c == '-' { - cap = true - continue - } - if cap && 'a' <= c && c <= 'z' { - c -= 'a' - 'A' - } - cap = false - b = append(b, byte(c)) - } - return string(b) -} - -var test = flag.Bool("test", false, "generate table_test.go") - -func genFile(name string, buf *bytes.Buffer) { - b, err := format.Source(buf.Bytes()) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - if err := ioutil.WriteFile(name, b, 0644); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func main() { - flag.Parse() - - var all []string - all = append(all, elements...) - all = append(all, attributes...) - all = append(all, eventHandlers...) - all = append(all, extra...) - sort.Strings(all) - - // uniq - lists have dups - w := 0 - for _, s := range all { - if w == 0 || all[w-1] != s { - all[w] = s - w++ - } - } - all = all[:w] - - if *test { - var buf bytes.Buffer - fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n") - fmt.Fprintln(&buf, "//go:generate go run gen.go -test\n") - fmt.Fprintln(&buf, "package atom\n") - fmt.Fprintln(&buf, "var testAtomList = []string{") - for _, s := range all { - fmt.Fprintf(&buf, "\t%q,\n", s) - } - fmt.Fprintln(&buf, "}") - - genFile("table_test.go", &buf) - return - } - - // Find hash that minimizes table size. - var best *table - for i := 0; i < 1000000; i++ { - if best != nil && 1<<(best.k-1) < len(all) { - break - } - h := rand.Uint32() - for k := uint(0); k <= 16; k++ { - if best != nil && k >= best.k { - break - } - var t table - if t.init(h, k, all) { - best = &t - break - } - } - } - if best == nil { - fmt.Fprintf(os.Stderr, "failed to construct string table\n") - os.Exit(1) - } - - // Lay out strings, using overlaps when possible. - layout := append([]string{}, all...) - - // Remove strings that are substrings of other strings - for changed := true; changed; { - changed = false - for i, s := range layout { - if s == "" { - continue - } - for j, t := range layout { - if i != j && t != "" && strings.Contains(s, t) { - changed = true - layout[j] = "" - } - } - } - } - - // Join strings where one suffix matches another prefix. - for { - // Find best i, j, k such that layout[i][len-k:] == layout[j][:k], - // maximizing overlap length k. - besti := -1 - bestj := -1 - bestk := 0 - for i, s := range layout { - if s == "" { - continue - } - for j, t := range layout { - if i == j { - continue - } - for k := bestk + 1; k <= len(s) && k <= len(t); k++ { - if s[len(s)-k:] == t[:k] { - besti = i - bestj = j - bestk = k - } - } - } - } - if bestk > 0 { - layout[besti] += layout[bestj][bestk:] - layout[bestj] = "" - continue - } - break - } - - text := strings.Join(layout, "") - - atom := map[string]uint32{} - for _, s := range all { - off := strings.Index(text, s) - if off < 0 { - panic("lost string " + s) - } - atom[s] = uint32(off<<8 | len(s)) - } - - var buf bytes.Buffer - // Generate the Go code. - fmt.Fprintln(&buf, "// Code generated by go generate gen.go; DO NOT EDIT.\n") - fmt.Fprintln(&buf, "//go:generate go run gen.go\n") - fmt.Fprintln(&buf, "package atom\n\nconst (") - - // compute max len - maxLen := 0 - for _, s := range all { - if maxLen < len(s) { - maxLen = len(s) - } - fmt.Fprintf(&buf, "\t%s Atom = %#x\n", identifier(s), atom[s]) - } - fmt.Fprintln(&buf, ")\n") - - fmt.Fprintf(&buf, "const hash0 = %#x\n\n", best.h0) - fmt.Fprintf(&buf, "const maxAtomLen = %d\n\n", maxLen) - - fmt.Fprintf(&buf, "var table = [1<<%d]Atom{\n", best.k) - for i, s := range best.tab { - if s == "" { - continue - } - fmt.Fprintf(&buf, "\t%#x: %#x, // %s\n", i, atom[s], s) - } - fmt.Fprintf(&buf, "}\n") - datasize := (1 << best.k) * 4 - - fmt.Fprintln(&buf, "const atomText =") - textsize := len(text) - for len(text) > 60 { - fmt.Fprintf(&buf, "\t%q +\n", text[:60]) - text = text[60:] - } - fmt.Fprintf(&buf, "\t%q\n\n", text) - - genFile("table.go", &buf) - - fmt.Fprintf(os.Stdout, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize) -} - -type byLen []string - -func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) } -func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x byLen) Len() int { return len(x) } - -// fnv computes the FNV hash with an arbitrary starting value h. -func fnv(h uint32, s string) uint32 { - for i := 0; i < len(s); i++ { - h ^= uint32(s[i]) - h *= 16777619 - } - return h -} - -// A table represents an attempt at constructing the lookup table. -// The lookup table uses cuckoo hashing, meaning that each string -// can be found in one of two positions. -type table struct { - h0 uint32 - k uint - mask uint32 - tab []string -} - -// hash returns the two hashes for s. -func (t *table) hash(s string) (h1, h2 uint32) { - h := fnv(t.h0, s) - h1 = h & t.mask - h2 = (h >> 16) & t.mask - return -} - -// init initializes the table with the given parameters. -// h0 is the initial hash value, -// k is the number of bits of hash value to use, and -// x is the list of strings to store in the table. -// init returns false if the table cannot be constructed. -func (t *table) init(h0 uint32, k uint, x []string) bool { - t.h0 = h0 - t.k = k - t.tab = make([]string, 1< len(t.tab) { - return false - } - s := t.tab[i] - h1, h2 := t.hash(s) - j := h1 + h2 - i - if t.tab[j] != "" && !t.push(j, depth+1) { - return false - } - t.tab[j] = s - return true -} - -// The lists of element names and attribute keys were taken from -// https://html.spec.whatwg.org/multipage/indices.html#index -// as of the "HTML Living Standard - Last Updated 16 April 2018" version. - -// "command", "keygen" and "menuitem" have been removed from the spec, -// but are kept here for backwards compatibility. -var elements = []string{ - "a", - "abbr", - "address", - "area", - "article", - "aside", - "audio", - "b", - "base", - "bdi", - "bdo", - "blockquote", - "body", - "br", - "button", - "canvas", - "caption", - "cite", - "code", - "col", - "colgroup", - "command", - "data", - "datalist", - "dd", - "del", - "details", - "dfn", - "dialog", - "div", - "dl", - "dt", - "em", - "embed", - "fieldset", - "figcaption", - "figure", - "footer", - "form", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "head", - "header", - "hgroup", - "hr", - "html", - "i", - "iframe", - "img", - "input", - "ins", - "kbd", - "keygen", - "label", - "legend", - "li", - "link", - "main", - "map", - "mark", - "menu", - "menuitem", - "meta", - "meter", - "nav", - "noscript", - "object", - "ol", - "optgroup", - "option", - "output", - "p", - "param", - "picture", - "pre", - "progress", - "q", - "rp", - "rt", - "ruby", - "s", - "samp", - "script", - "section", - "select", - "slot", - "small", - "source", - "span", - "strong", - "style", - "sub", - "summary", - "sup", - "table", - "tbody", - "td", - "template", - "textarea", - "tfoot", - "th", - "thead", - "time", - "title", - "tr", - "track", - "u", - "ul", - "var", - "video", - "wbr", -} - -// https://html.spec.whatwg.org/multipage/indices.html#attributes-3 -// -// "challenge", "command", "contextmenu", "dropzone", "icon", "keytype", "mediagroup", -// "radiogroup", "spellcheck", "scoped", "seamless", "sortable" and "sorted" have been removed from the spec, -// but are kept here for backwards compatibility. -var attributes = []string{ - "abbr", - "accept", - "accept-charset", - "accesskey", - "action", - "allowfullscreen", - "allowpaymentrequest", - "allowusermedia", - "alt", - "as", - "async", - "autocomplete", - "autofocus", - "autoplay", - "challenge", - "charset", - "checked", - "cite", - "class", - "color", - "cols", - "colspan", - "command", - "content", - "contenteditable", - "contextmenu", - "controls", - "coords", - "crossorigin", - "data", - "datetime", - "default", - "defer", - "dir", - "dirname", - "disabled", - "download", - "draggable", - "dropzone", - "enctype", - "for", - "form", - "formaction", - "formenctype", - "formmethod", - "formnovalidate", - "formtarget", - "headers", - "height", - "hidden", - "high", - "href", - "hreflang", - "http-equiv", - "icon", - "id", - "inputmode", - "integrity", - "is", - "ismap", - "itemid", - "itemprop", - "itemref", - "itemscope", - "itemtype", - "keytype", - "kind", - "label", - "lang", - "list", - "loop", - "low", - "manifest", - "max", - "maxlength", - "media", - "mediagroup", - "method", - "min", - "minlength", - "multiple", - "muted", - "name", - "nomodule", - "nonce", - "novalidate", - "open", - "optimum", - "pattern", - "ping", - "placeholder", - "playsinline", - "poster", - "preload", - "radiogroup", - "readonly", - "referrerpolicy", - "rel", - "required", - "reversed", - "rows", - "rowspan", - "sandbox", - "spellcheck", - "scope", - "scoped", - "seamless", - "selected", - "shape", - "size", - "sizes", - "sortable", - "sorted", - "slot", - "span", - "spellcheck", - "src", - "srcdoc", - "srclang", - "srcset", - "start", - "step", - "style", - "tabindex", - "target", - "title", - "translate", - "type", - "typemustmatch", - "updateviacache", - "usemap", - "value", - "width", - "workertype", - "wrap", -} - -// "onautocomplete", "onautocompleteerror", "onmousewheel", -// "onshow" and "onsort" have been removed from the spec, -// but are kept here for backwards compatibility. -var eventHandlers = []string{ - "onabort", - "onautocomplete", - "onautocompleteerror", - "onauxclick", - "onafterprint", - "onbeforeprint", - "onbeforeunload", - "onblur", - "oncancel", - "oncanplay", - "oncanplaythrough", - "onchange", - "onclick", - "onclose", - "oncontextmenu", - "oncopy", - "oncuechange", - "oncut", - "ondblclick", - "ondrag", - "ondragend", - "ondragenter", - "ondragexit", - "ondragleave", - "ondragover", - "ondragstart", - "ondrop", - "ondurationchange", - "onemptied", - "onended", - "onerror", - "onfocus", - "onhashchange", - "oninput", - "oninvalid", - "onkeydown", - "onkeypress", - "onkeyup", - "onlanguagechange", - "onload", - "onloadeddata", - "onloadedmetadata", - "onloadend", - "onloadstart", - "onmessage", - "onmessageerror", - "onmousedown", - "onmouseenter", - "onmouseleave", - "onmousemove", - "onmouseout", - "onmouseover", - "onmouseup", - "onmousewheel", - "onwheel", - "onoffline", - "ononline", - "onpagehide", - "onpageshow", - "onpaste", - "onpause", - "onplay", - "onplaying", - "onpopstate", - "onprogress", - "onratechange", - "onreset", - "onresize", - "onrejectionhandled", - "onscroll", - "onsecuritypolicyviolation", - "onseeked", - "onseeking", - "onselect", - "onshow", - "onsort", - "onstalled", - "onstorage", - "onsubmit", - "onsuspend", - "ontimeupdate", - "ontoggle", - "onunhandledrejection", - "onunload", - "onvolumechange", - "onwaiting", -} - -// extra are ad-hoc values not covered by any of the lists above. -var extra = []string{ - "acronym", - "align", - "annotation", - "annotation-xml", - "applet", - "basefont", - "bgsound", - "big", - "blink", - "center", - "color", - "desc", - "face", - "font", - "foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive. - "foreignobject", - "frame", - "frameset", - "image", - "isindex", - "listing", - "malignmark", - "marquee", - "math", - "mglyph", - "mi", - "mn", - "mo", - "ms", - "mtext", - "nobr", - "noembed", - "noframes", - "plaintext", - "prompt", - "public", - "rb", - "rtc", - "spacer", - "strike", - "svg", - "system", - "tt", - "xmp", -} diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 57334dc7..34d42932 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -52,10 +52,11 @@ import ( ) const ( - prefaceTimeout = 10 * time.Second - firstSettingsTimeout = 2 * time.Second // should be in-flight with preface anyway - handlerChunkWriteSize = 4 << 10 - defaultMaxStreams = 250 // TODO: make this 100 as the GFE seems to? + prefaceTimeout = 10 * time.Second + firstSettingsTimeout = 2 * time.Second // should be in-flight with preface anyway + handlerChunkWriteSize = 4 << 10 + defaultMaxStreams = 250 // TODO: make this 100 as the GFE seems to? + maxQueuedControlFrames = 10000 ) var ( @@ -163,6 +164,15 @@ func (s *Server) maxConcurrentStreams() uint32 { return defaultMaxStreams } +// maxQueuedControlFrames is the maximum number of control frames like +// SETTINGS, PING and RST_STREAM that will be queued for writing before +// the connection is closed to prevent memory exhaustion attacks. +func (s *Server) maxQueuedControlFrames() int { + // TODO: if anybody asks, add a Server field, and remember to define the + // behavior of negative values. + return maxQueuedControlFrames +} + type serverInternalState struct { mu sync.Mutex activeConns map[*serverConn]struct{} @@ -312,7 +322,7 @@ type ServeConnOpts struct { } func (o *ServeConnOpts) context() context.Context { - if o.Context != nil { + if o != nil && o.Context != nil { return o.Context } return context.Background() @@ -506,6 +516,7 @@ type serverConn struct { sawFirstSettings bool // got the initial SETTINGS frame after the preface needToSendSettingsAck bool unackedSettings int // how many SETTINGS have we sent without ACKs? + queuedControlFrames int // control frames in the writeSched queue clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit) advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client curClientStreams uint32 // number of open streams initiated by the client @@ -894,6 +905,14 @@ func (sc *serverConn) serve() { } } + // If the peer is causing us to generate a lot of control frames, + // but not reading them from us, assume they are trying to make us + // run out of memory. + if sc.queuedControlFrames > sc.srv.maxQueuedControlFrames() { + sc.vlogf("http2: too many control frames in send queue, closing connection") + return + } + // Start the shutdown timer after sending a GOAWAY. When sending GOAWAY // with no error code (graceful shutdown), don't start the timer until // all open streams have been completed. @@ -1093,6 +1112,14 @@ func (sc *serverConn) writeFrame(wr FrameWriteRequest) { } if !ignoreWrite { + if wr.isControl() { + sc.queuedControlFrames++ + // For extra safety, detect wraparounds, which should not happen, + // and pull the plug. + if sc.queuedControlFrames < 0 { + sc.conn.Close() + } + } sc.writeSched.Push(wr) } sc.scheduleFrameWrite() @@ -1210,10 +1237,8 @@ func (sc *serverConn) wroteFrame(res frameWriteResult) { // If a frame is already being written, nothing happens. This will be called again // when the frame is done being written. // -// If a frame isn't being written we need to send one, the best frame -// to send is selected, preferring first things that aren't -// stream-specific (e.g. ACKing settings), and then finding the -// highest priority stream. +// If a frame isn't being written and we need to send one, the best frame +// to send is selected by writeSched. // // If a frame isn't being written and there's nothing else to send, we // flush the write buffer. @@ -1241,6 +1266,9 @@ func (sc *serverConn) scheduleFrameWrite() { } if !sc.inGoAway || sc.goAwayCode == ErrCodeNo { if wr, ok := sc.writeSched.Pop(); ok { + if wr.isControl() { + sc.queuedControlFrames-- + } sc.startFrameWrite(wr) continue } @@ -1533,6 +1561,8 @@ func (sc *serverConn) processSettings(f *SettingsFrame) error { if err := f.ForeachSetting(sc.processSetting); err != nil { return err } + // TODO: judging by RFC 7540, Section 6.5.3 each SETTINGS frame should be + // acknowledged individually, even if multiple are received before the ACK. sc.needToSendSettingsAck = true sc.scheduleFrameWrite() return nil diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index c0c80d89..aeac7d8a 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -992,7 +992,7 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf req.Method != "HEAD" { // Request gzip only, not deflate. Deflate is ambiguous and // not as universally supported anyway. - // See: http://www.gzip.org/zlib/zlib_faq.html#faq38 + // See: https://zlib.net/zlib_faq.html#faq39 // // Note that we don't request this for HEAD requests, // due to a bug in nginx: diff --git a/vendor/golang.org/x/net/http2/writesched.go b/vendor/golang.org/x/net/http2/writesched.go index 4fe30730..f24d2b1e 100644 --- a/vendor/golang.org/x/net/http2/writesched.go +++ b/vendor/golang.org/x/net/http2/writesched.go @@ -32,7 +32,7 @@ type WriteScheduler interface { // Pop dequeues the next frame to write. Returns false if no frames can // be written. Frames with a given wr.StreamID() are Pop'd in the same - // order they are Push'd. + // order they are Push'd. No frames should be discarded except by CloseStream. Pop() (wr FrameWriteRequest, ok bool) } @@ -76,6 +76,12 @@ func (wr FrameWriteRequest) StreamID() uint32 { return wr.stream.id } +// isControl reports whether wr is a control frame for MaxQueuedControlFrames +// purposes. That includes non-stream frames and RST_STREAM frames. +func (wr FrameWriteRequest) isControl() bool { + return wr.stream == nil +} + // DataSize returns the number of flow control bytes that must be consumed // to write this entire frame. This is 0 for non-DATA frames. func (wr FrameWriteRequest) DataSize() int { diff --git a/vendor/golang.org/x/net/internal/socks/client.go b/vendor/golang.org/x/net/internal/socks/client.go new file mode 100644 index 00000000..3d6f516a --- /dev/null +++ b/vendor/golang.org/x/net/internal/socks/client.go @@ -0,0 +1,168 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package socks + +import ( + "context" + "errors" + "io" + "net" + "strconv" + "time" +) + +var ( + noDeadline = time.Time{} + aLongTimeAgo = time.Unix(1, 0) +) + +func (d *Dialer) connect(ctx context.Context, c net.Conn, address string) (_ net.Addr, ctxErr error) { + host, port, err := splitHostPort(address) + if err != nil { + return nil, err + } + if deadline, ok := ctx.Deadline(); ok && !deadline.IsZero() { + c.SetDeadline(deadline) + defer c.SetDeadline(noDeadline) + } + if ctx != context.Background() { + errCh := make(chan error, 1) + done := make(chan struct{}) + defer func() { + close(done) + if ctxErr == nil { + ctxErr = <-errCh + } + }() + go func() { + select { + case <-ctx.Done(): + c.SetDeadline(aLongTimeAgo) + errCh <- ctx.Err() + case <-done: + errCh <- nil + } + }() + } + + b := make([]byte, 0, 6+len(host)) // the size here is just an estimate + b = append(b, Version5) + if len(d.AuthMethods) == 0 || d.Authenticate == nil { + b = append(b, 1, byte(AuthMethodNotRequired)) + } else { + ams := d.AuthMethods + if len(ams) > 255 { + return nil, errors.New("too many authentication methods") + } + b = append(b, byte(len(ams))) + for _, am := range ams { + b = append(b, byte(am)) + } + } + if _, ctxErr = c.Write(b); ctxErr != nil { + return + } + + if _, ctxErr = io.ReadFull(c, b[:2]); ctxErr != nil { + return + } + if b[0] != Version5 { + return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0]))) + } + am := AuthMethod(b[1]) + if am == AuthMethodNoAcceptableMethods { + return nil, errors.New("no acceptable authentication methods") + } + if d.Authenticate != nil { + if ctxErr = d.Authenticate(ctx, c, am); ctxErr != nil { + return + } + } + + b = b[:0] + b = append(b, Version5, byte(d.cmd), 0) + if ip := net.ParseIP(host); ip != nil { + if ip4 := ip.To4(); ip4 != nil { + b = append(b, AddrTypeIPv4) + b = append(b, ip4...) + } else if ip6 := ip.To16(); ip6 != nil { + b = append(b, AddrTypeIPv6) + b = append(b, ip6...) + } else { + return nil, errors.New("unknown address type") + } + } else { + if len(host) > 255 { + return nil, errors.New("FQDN too long") + } + b = append(b, AddrTypeFQDN) + b = append(b, byte(len(host))) + b = append(b, host...) + } + b = append(b, byte(port>>8), byte(port)) + if _, ctxErr = c.Write(b); ctxErr != nil { + return + } + + if _, ctxErr = io.ReadFull(c, b[:4]); ctxErr != nil { + return + } + if b[0] != Version5 { + return nil, errors.New("unexpected protocol version " + strconv.Itoa(int(b[0]))) + } + if cmdErr := Reply(b[1]); cmdErr != StatusSucceeded { + return nil, errors.New("unknown error " + cmdErr.String()) + } + if b[2] != 0 { + return nil, errors.New("non-zero reserved field") + } + l := 2 + var a Addr + switch b[3] { + case AddrTypeIPv4: + l += net.IPv4len + a.IP = make(net.IP, net.IPv4len) + case AddrTypeIPv6: + l += net.IPv6len + a.IP = make(net.IP, net.IPv6len) + case AddrTypeFQDN: + if _, err := io.ReadFull(c, b[:1]); err != nil { + return nil, err + } + l += int(b[0]) + default: + return nil, errors.New("unknown address type " + strconv.Itoa(int(b[3]))) + } + if cap(b) < l { + b = make([]byte, l) + } else { + b = b[:l] + } + if _, ctxErr = io.ReadFull(c, b); ctxErr != nil { + return + } + if a.IP != nil { + copy(a.IP, b) + } else { + a.Name = string(b[:len(b)-2]) + } + a.Port = int(b[len(b)-2])<<8 | int(b[len(b)-1]) + return &a, nil +} + +func splitHostPort(address string) (string, int, error) { + host, port, err := net.SplitHostPort(address) + if err != nil { + return "", 0, err + } + portnum, err := strconv.Atoi(port) + if err != nil { + return "", 0, err + } + if 1 > portnum || portnum > 0xffff { + return "", 0, errors.New("port number out of range " + port) + } + return host, portnum, nil +} diff --git a/vendor/golang.org/x/net/internal/socks/socks.go b/vendor/golang.org/x/net/internal/socks/socks.go new file mode 100644 index 00000000..6929a9fd --- /dev/null +++ b/vendor/golang.org/x/net/internal/socks/socks.go @@ -0,0 +1,317 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package socks provides a SOCKS version 5 client implementation. +// +// SOCKS protocol version 5 is defined in RFC 1928. +// Username/Password authentication for SOCKS version 5 is defined in +// RFC 1929. +package socks + +import ( + "context" + "errors" + "io" + "net" + "strconv" +) + +// A Command represents a SOCKS command. +type Command int + +func (cmd Command) String() string { + switch cmd { + case CmdConnect: + return "socks connect" + case cmdBind: + return "socks bind" + default: + return "socks " + strconv.Itoa(int(cmd)) + } +} + +// An AuthMethod represents a SOCKS authentication method. +type AuthMethod int + +// A Reply represents a SOCKS command reply code. +type Reply int + +func (code Reply) String() string { + switch code { + case StatusSucceeded: + return "succeeded" + case 0x01: + return "general SOCKS server failure" + case 0x02: + return "connection not allowed by ruleset" + case 0x03: + return "network unreachable" + case 0x04: + return "host unreachable" + case 0x05: + return "connection refused" + case 0x06: + return "TTL expired" + case 0x07: + return "command not supported" + case 0x08: + return "address type not supported" + default: + return "unknown code: " + strconv.Itoa(int(code)) + } +} + +// Wire protocol constants. +const ( + Version5 = 0x05 + + AddrTypeIPv4 = 0x01 + AddrTypeFQDN = 0x03 + AddrTypeIPv6 = 0x04 + + CmdConnect Command = 0x01 // establishes an active-open forward proxy connection + cmdBind Command = 0x02 // establishes a passive-open forward proxy connection + + AuthMethodNotRequired AuthMethod = 0x00 // no authentication required + AuthMethodUsernamePassword AuthMethod = 0x02 // use username/password + AuthMethodNoAcceptableMethods AuthMethod = 0xff // no acceptable authentication methods + + StatusSucceeded Reply = 0x00 +) + +// An Addr represents a SOCKS-specific address. +// Either Name or IP is used exclusively. +type Addr struct { + Name string // fully-qualified domain name + IP net.IP + Port int +} + +func (a *Addr) Network() string { return "socks" } + +func (a *Addr) String() string { + if a == nil { + return "" + } + port := strconv.Itoa(a.Port) + if a.IP == nil { + return net.JoinHostPort(a.Name, port) + } + return net.JoinHostPort(a.IP.String(), port) +} + +// A Conn represents a forward proxy connection. +type Conn struct { + net.Conn + + boundAddr net.Addr +} + +// BoundAddr returns the address assigned by the proxy server for +// connecting to the command target address from the proxy server. +func (c *Conn) BoundAddr() net.Addr { + if c == nil { + return nil + } + return c.boundAddr +} + +// A Dialer holds SOCKS-specific options. +type Dialer struct { + cmd Command // either CmdConnect or cmdBind + proxyNetwork string // network between a proxy server and a client + proxyAddress string // proxy server address + + // ProxyDial specifies the optional dial function for + // establishing the transport connection. + ProxyDial func(context.Context, string, string) (net.Conn, error) + + // AuthMethods specifies the list of request authention + // methods. + // If empty, SOCKS client requests only AuthMethodNotRequired. + AuthMethods []AuthMethod + + // Authenticate specifies the optional authentication + // function. It must be non-nil when AuthMethods is not empty. + // It must return an error when the authentication is failed. + Authenticate func(context.Context, io.ReadWriter, AuthMethod) error +} + +// DialContext connects to the provided address on the provided +// network. +// +// The returned error value may be a net.OpError. When the Op field of +// net.OpError contains "socks", the Source field contains a proxy +// server address and the Addr field contains a command target +// address. +// +// See func Dial of the net package of standard library for a +// description of the network and address parameters. +func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { + if err := d.validateTarget(network, address); err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + if ctx == nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")} + } + var err error + var c net.Conn + if d.ProxyDial != nil { + c, err = d.ProxyDial(ctx, d.proxyNetwork, d.proxyAddress) + } else { + var dd net.Dialer + c, err = dd.DialContext(ctx, d.proxyNetwork, d.proxyAddress) + } + if err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + a, err := d.connect(ctx, c, address) + if err != nil { + c.Close() + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + return &Conn{Conn: c, boundAddr: a}, nil +} + +// DialWithConn initiates a connection from SOCKS server to the target +// network and address using the connection c that is already +// connected to the SOCKS server. +// +// It returns the connection's local address assigned by the SOCKS +// server. +func (d *Dialer) DialWithConn(ctx context.Context, c net.Conn, network, address string) (net.Addr, error) { + if err := d.validateTarget(network, address); err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + if ctx == nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: errors.New("nil context")} + } + a, err := d.connect(ctx, c, address) + if err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + return a, nil +} + +// Dial connects to the provided address on the provided network. +// +// Unlike DialContext, it returns a raw transport connection instead +// of a forward proxy connection. +// +// Deprecated: Use DialContext or DialWithConn instead. +func (d *Dialer) Dial(network, address string) (net.Conn, error) { + if err := d.validateTarget(network, address); err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + var err error + var c net.Conn + if d.ProxyDial != nil { + c, err = d.ProxyDial(context.Background(), d.proxyNetwork, d.proxyAddress) + } else { + c, err = net.Dial(d.proxyNetwork, d.proxyAddress) + } + if err != nil { + proxy, dst, _ := d.pathAddrs(address) + return nil, &net.OpError{Op: d.cmd.String(), Net: network, Source: proxy, Addr: dst, Err: err} + } + if _, err := d.DialWithConn(context.Background(), c, network, address); err != nil { + c.Close() + return nil, err + } + return c, nil +} + +func (d *Dialer) validateTarget(network, address string) error { + switch network { + case "tcp", "tcp6", "tcp4": + default: + return errors.New("network not implemented") + } + switch d.cmd { + case CmdConnect, cmdBind: + default: + return errors.New("command not implemented") + } + return nil +} + +func (d *Dialer) pathAddrs(address string) (proxy, dst net.Addr, err error) { + for i, s := range []string{d.proxyAddress, address} { + host, port, err := splitHostPort(s) + if err != nil { + return nil, nil, err + } + a := &Addr{Port: port} + a.IP = net.ParseIP(host) + if a.IP == nil { + a.Name = host + } + if i == 0 { + proxy = a + } else { + dst = a + } + } + return +} + +// NewDialer returns a new Dialer that dials through the provided +// proxy server's network and address. +func NewDialer(network, address string) *Dialer { + return &Dialer{proxyNetwork: network, proxyAddress: address, cmd: CmdConnect} +} + +const ( + authUsernamePasswordVersion = 0x01 + authStatusSucceeded = 0x00 +) + +// UsernamePassword are the credentials for the username/password +// authentication method. +type UsernamePassword struct { + Username string + Password string +} + +// Authenticate authenticates a pair of username and password with the +// proxy server. +func (up *UsernamePassword) Authenticate(ctx context.Context, rw io.ReadWriter, auth AuthMethod) error { + switch auth { + case AuthMethodNotRequired: + return nil + case AuthMethodUsernamePassword: + if len(up.Username) == 0 || len(up.Username) > 255 || len(up.Password) == 0 || len(up.Password) > 255 { + return errors.New("invalid username/password") + } + b := []byte{authUsernamePasswordVersion} + b = append(b, byte(len(up.Username))) + b = append(b, up.Username...) + b = append(b, byte(len(up.Password))) + b = append(b, up.Password...) + // TODO(mikio): handle IO deadlines and cancelation if + // necessary + if _, err := rw.Write(b); err != nil { + return err + } + if _, err := io.ReadFull(rw, b[:2]); err != nil { + return err + } + if b[0] != authUsernamePasswordVersion { + return errors.New("invalid username/password version") + } + if b[1] != authStatusSucceeded { + return errors.New("username/password authentication failed") + } + return nil + } + return errors.New("unsupported authentication method " + strconv.Itoa(int(auth))) +} diff --git a/vendor/golang.org/x/net/proxy/dial.go b/vendor/golang.org/x/net/proxy/dial.go new file mode 100644 index 00000000..811c2e4e --- /dev/null +++ b/vendor/golang.org/x/net/proxy/dial.go @@ -0,0 +1,54 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proxy + +import ( + "context" + "net" +) + +// A ContextDialer dials using a context. +type ContextDialer interface { + DialContext(ctx context.Context, network, address string) (net.Conn, error) +} + +// Dial works like DialContext on net.Dialer but using a dialer returned by FromEnvironment. +// +// The passed ctx is only used for returning the Conn, not the lifetime of the Conn. +// +// Custom dialers (registered via RegisterDialerType) that do not implement ContextDialer +// can leak a goroutine for as long as it takes the underlying Dialer implementation to timeout. +// +// A Conn returned from a successful Dial after the context has been cancelled will be immediately closed. +func Dial(ctx context.Context, network, address string) (net.Conn, error) { + d := FromEnvironment() + if xd, ok := d.(ContextDialer); ok { + return xd.DialContext(ctx, network, address) + } + return dialContext(ctx, d, network, address) +} + +// WARNING: this can leak a goroutine for as long as the underlying Dialer implementation takes to timeout +// A Conn returned from a successful Dial after the context has been cancelled will be immediately closed. +func dialContext(ctx context.Context, d Dialer, network, address string) (net.Conn, error) { + var ( + conn net.Conn + done = make(chan struct{}, 1) + err error + ) + go func() { + conn, err = d.Dial(network, address) + close(done) + if conn != nil && ctx.Err() != nil { + conn.Close() + } + }() + select { + case <-ctx.Done(): + err = ctx.Err() + case <-done: + } + return conn, err +} diff --git a/vendor/golang.org/x/net/proxy/direct.go b/vendor/golang.org/x/net/proxy/direct.go new file mode 100644 index 00000000..3d66bdef --- /dev/null +++ b/vendor/golang.org/x/net/proxy/direct.go @@ -0,0 +1,31 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proxy + +import ( + "context" + "net" +) + +type direct struct{} + +// Direct implements Dialer by making network connections directly using net.Dial or net.DialContext. +var Direct = direct{} + +var ( + _ Dialer = Direct + _ ContextDialer = Direct +) + +// Dial directly invokes net.Dial with the supplied parameters. +func (direct) Dial(network, addr string) (net.Conn, error) { + return net.Dial(network, addr) +} + +// DialContext instantiates a net.Dialer and invokes its DialContext receiver with the supplied parameters. +func (direct) DialContext(ctx context.Context, network, addr string) (net.Conn, error) { + var d net.Dialer + return d.DialContext(ctx, network, addr) +} diff --git a/vendor/golang.org/x/net/proxy/per_host.go b/vendor/golang.org/x/net/proxy/per_host.go new file mode 100644 index 00000000..573fe79e --- /dev/null +++ b/vendor/golang.org/x/net/proxy/per_host.go @@ -0,0 +1,155 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proxy + +import ( + "context" + "net" + "strings" +) + +// A PerHost directs connections to a default Dialer unless the host name +// requested matches one of a number of exceptions. +type PerHost struct { + def, bypass Dialer + + bypassNetworks []*net.IPNet + bypassIPs []net.IP + bypassZones []string + bypassHosts []string +} + +// NewPerHost returns a PerHost Dialer that directs connections to either +// defaultDialer or bypass, depending on whether the connection matches one of +// the configured rules. +func NewPerHost(defaultDialer, bypass Dialer) *PerHost { + return &PerHost{ + def: defaultDialer, + bypass: bypass, + } +} + +// Dial connects to the address addr on the given network through either +// defaultDialer or bypass. +func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + + return p.dialerForRequest(host).Dial(network, addr) +} + +// DialContext connects to the address addr on the given network through either +// defaultDialer or bypass. +func (p *PerHost) DialContext(ctx context.Context, network, addr string) (c net.Conn, err error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + d := p.dialerForRequest(host) + if x, ok := d.(ContextDialer); ok { + return x.DialContext(ctx, network, addr) + } + return dialContext(ctx, d, network, addr) +} + +func (p *PerHost) dialerForRequest(host string) Dialer { + if ip := net.ParseIP(host); ip != nil { + for _, net := range p.bypassNetworks { + if net.Contains(ip) { + return p.bypass + } + } + for _, bypassIP := range p.bypassIPs { + if bypassIP.Equal(ip) { + return p.bypass + } + } + return p.def + } + + for _, zone := range p.bypassZones { + if strings.HasSuffix(host, zone) { + return p.bypass + } + if host == zone[1:] { + // For a zone ".example.com", we match "example.com" + // too. + return p.bypass + } + } + for _, bypassHost := range p.bypassHosts { + if bypassHost == host { + return p.bypass + } + } + return p.def +} + +// AddFromString parses a string that contains comma-separated values +// specifying hosts that should use the bypass proxy. Each value is either an +// IP address, a CIDR range, a zone (*.example.com) or a host name +// (localhost). A best effort is made to parse the string and errors are +// ignored. +func (p *PerHost) AddFromString(s string) { + hosts := strings.Split(s, ",") + for _, host := range hosts { + host = strings.TrimSpace(host) + if len(host) == 0 { + continue + } + if strings.Contains(host, "/") { + // We assume that it's a CIDR address like 127.0.0.0/8 + if _, net, err := net.ParseCIDR(host); err == nil { + p.AddNetwork(net) + } + continue + } + if ip := net.ParseIP(host); ip != nil { + p.AddIP(ip) + continue + } + if strings.HasPrefix(host, "*.") { + p.AddZone(host[1:]) + continue + } + p.AddHost(host) + } +} + +// AddIP specifies an IP address that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match an IP. +func (p *PerHost) AddIP(ip net.IP) { + p.bypassIPs = append(p.bypassIPs, ip) +} + +// AddNetwork specifies an IP range that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match. +func (p *PerHost) AddNetwork(net *net.IPNet) { + p.bypassNetworks = append(p.bypassNetworks, net) +} + +// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of +// "example.com" matches "example.com" and all of its subdomains. +func (p *PerHost) AddZone(zone string) { + if strings.HasSuffix(zone, ".") { + zone = zone[:len(zone)-1] + } + if !strings.HasPrefix(zone, ".") { + zone = "." + zone + } + p.bypassZones = append(p.bypassZones, zone) +} + +// AddHost specifies a host name that will use the bypass proxy. +func (p *PerHost) AddHost(host string) { + if strings.HasSuffix(host, ".") { + host = host[:len(host)-1] + } + p.bypassHosts = append(p.bypassHosts, host) +} diff --git a/vendor/golang.org/x/net/proxy/proxy.go b/vendor/golang.org/x/net/proxy/proxy.go new file mode 100644 index 00000000..9ff4b9a7 --- /dev/null +++ b/vendor/golang.org/x/net/proxy/proxy.go @@ -0,0 +1,149 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package proxy provides support for a variety of protocols to proxy network +// data. +package proxy // import "golang.org/x/net/proxy" + +import ( + "errors" + "net" + "net/url" + "os" + "sync" +) + +// A Dialer is a means to establish a connection. +// Custom dialers should also implement ContextDialer. +type Dialer interface { + // Dial connects to the given address via the proxy. + Dial(network, addr string) (c net.Conn, err error) +} + +// Auth contains authentication parameters that specific Dialers may require. +type Auth struct { + User, Password string +} + +// FromEnvironment returns the dialer specified by the proxy-related +// variables in the environment and makes underlying connections +// directly. +func FromEnvironment() Dialer { + return FromEnvironmentUsing(Direct) +} + +// FromEnvironmentUsing returns the dialer specify by the proxy-related +// variables in the environment and makes underlying connections +// using the provided forwarding Dialer (for instance, a *net.Dialer +// with desired configuration). +func FromEnvironmentUsing(forward Dialer) Dialer { + allProxy := allProxyEnv.Get() + if len(allProxy) == 0 { + return forward + } + + proxyURL, err := url.Parse(allProxy) + if err != nil { + return forward + } + proxy, err := FromURL(proxyURL, forward) + if err != nil { + return forward + } + + noProxy := noProxyEnv.Get() + if len(noProxy) == 0 { + return proxy + } + + perHost := NewPerHost(proxy, forward) + perHost.AddFromString(noProxy) + return perHost +} + +// proxySchemes is a map from URL schemes to a function that creates a Dialer +// from a URL with such a scheme. +var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error) + +// RegisterDialerType takes a URL scheme and a function to generate Dialers from +// a URL with that scheme and a forwarding Dialer. Registered schemes are used +// by FromURL. +func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) { + if proxySchemes == nil { + proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error)) + } + proxySchemes[scheme] = f +} + +// FromURL returns a Dialer given a URL specification and an underlying +// Dialer for it to make network requests. +func FromURL(u *url.URL, forward Dialer) (Dialer, error) { + var auth *Auth + if u.User != nil { + auth = new(Auth) + auth.User = u.User.Username() + if p, ok := u.User.Password(); ok { + auth.Password = p + } + } + + switch u.Scheme { + case "socks5", "socks5h": + addr := u.Hostname() + port := u.Port() + if port == "" { + port = "1080" + } + return SOCKS5("tcp", net.JoinHostPort(addr, port), auth, forward) + } + + // If the scheme doesn't match any of the built-in schemes, see if it + // was registered by another package. + if proxySchemes != nil { + if f, ok := proxySchemes[u.Scheme]; ok { + return f(u, forward) + } + } + + return nil, errors.New("proxy: unknown scheme: " + u.Scheme) +} + +var ( + allProxyEnv = &envOnce{ + names: []string{"ALL_PROXY", "all_proxy"}, + } + noProxyEnv = &envOnce{ + names: []string{"NO_PROXY", "no_proxy"}, + } +) + +// envOnce looks up an environment variable (optionally by multiple +// names) once. It mitigates expensive lookups on some platforms +// (e.g. Windows). +// (Borrowed from net/http/transport.go) +type envOnce struct { + names []string + once sync.Once + val string +} + +func (e *envOnce) Get() string { + e.once.Do(e.init) + return e.val +} + +func (e *envOnce) init() { + for _, n := range e.names { + e.val = os.Getenv(n) + if e.val != "" { + return + } + } +} + +// reset is used by tests +func (e *envOnce) reset() { + e.once = sync.Once{} + e.val = "" +} diff --git a/vendor/golang.org/x/net/proxy/socks5.go b/vendor/golang.org/x/net/proxy/socks5.go new file mode 100644 index 00000000..c91651f9 --- /dev/null +++ b/vendor/golang.org/x/net/proxy/socks5.go @@ -0,0 +1,42 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proxy + +import ( + "context" + "net" + + "golang.org/x/net/internal/socks" +) + +// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given +// address with an optional username and password. +// See RFC 1928 and RFC 1929. +func SOCKS5(network, address string, auth *Auth, forward Dialer) (Dialer, error) { + d := socks.NewDialer(network, address) + if forward != nil { + if f, ok := forward.(ContextDialer); ok { + d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) { + return f.DialContext(ctx, network, address) + } + } else { + d.ProxyDial = func(ctx context.Context, network string, address string) (net.Conn, error) { + return dialContext(ctx, forward, network, address) + } + } + } + if auth != nil { + up := socks.UsernamePassword{ + Username: auth.User, + Password: auth.Password, + } + d.AuthMethods = []socks.AuthMethod{ + socks.AuthMethodNotRequired, + socks.AuthMethodUsernamePassword, + } + d.Authenticate = up.Authenticate + } + return d, nil +} diff --git a/vendor/golang.org/x/sys/unix/affinity_linux.go b/vendor/golang.org/x/sys/unix/affinity_linux.go index 72afe333..6e5c81ac 100644 --- a/vendor/golang.org/x/sys/unix/affinity_linux.go +++ b/vendor/golang.org/x/sys/unix/affinity_linux.go @@ -7,6 +7,7 @@ package unix import ( + "math/bits" "unsafe" ) @@ -79,46 +80,7 @@ func (s *CPUSet) IsSet(cpu int) bool { func (s *CPUSet) Count() int { c := 0 for _, b := range s { - c += onesCount64(uint64(b)) + c += bits.OnesCount64(uint64(b)) } return c } - -// onesCount64 is a copy of Go 1.9's math/bits.OnesCount64. -// Once this package can require Go 1.9, we can delete this -// and update the caller to use bits.OnesCount64. -func onesCount64(x uint64) int { - const m0 = 0x5555555555555555 // 01010101 ... - const m1 = 0x3333333333333333 // 00110011 ... - const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ... - const m3 = 0x00ff00ff00ff00ff // etc. - const m4 = 0x0000ffff0000ffff - - // Implementation: Parallel summing of adjacent bits. - // See "Hacker's Delight", Chap. 5: Counting Bits. - // The following pattern shows the general approach: - // - // x = x>>1&(m0&m) + x&(m0&m) - // x = x>>2&(m1&m) + x&(m1&m) - // x = x>>4&(m2&m) + x&(m2&m) - // x = x>>8&(m3&m) + x&(m3&m) - // x = x>>16&(m4&m) + x&(m4&m) - // x = x>>32&(m5&m) + x&(m5&m) - // return int(x) - // - // Masking (& operations) can be left away when there's no - // danger that a field's sum will carry over into the next - // field: Since the result cannot be > 64, 8 bits is enough - // and we can ignore the masks for the shifts by 8 and up. - // Per "Hacker's Delight", the first line can be simplified - // more, but it saves at best one instruction, so we leave - // it alone for clarity. - const m = 1<<64 - 1 - x = x>>1&(m0&m) + x&(m0&m) - x = x>>2&(m1&m) + x&(m1&m) - x = (x>>4 + x) & (m2 & m) - x += x >> 8 - x += x >> 16 - x += x >> 32 - return int(x) & (1<<7 - 1) -} diff --git a/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s b/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s new file mode 100644 index 00000000..6db717de --- /dev/null +++ b/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s @@ -0,0 +1,54 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build riscv64,!gccgo + +#include "textflag.h" + +// +// System calls for linux/riscv64. +// +// Where available, just jump to package syscall's implementation of +// these functions. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + CALL runtime·entersyscall(SB) + MOV a1+8(FP), A0 + MOV a2+16(FP), A1 + MOV a3+24(FP), A2 + MOV $0, A3 + MOV $0, A4 + MOV $0, A5 + MOV $0, A6 + MOV trap+0(FP), A7 // syscall entry + ECALL + MOV A0, r1+32(FP) // r1 + MOV A1, r2+40(FP) // r2 + CALL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOV a1+8(FP), A0 + MOV a2+16(FP), A1 + MOV a3+24(FP), A2 + MOV ZERO, A3 + MOV ZERO, A4 + MOV ZERO, A5 + MOV trap+0(FP), A7 // syscall entry + ECALL + MOV A0, r1+32(FP) + MOV A1, r2+40(FP) + RET diff --git a/vendor/golang.org/x/sys/unix/dirent.go b/vendor/golang.org/x/sys/unix/dirent.go index 4407c505..304016b6 100644 --- a/vendor/golang.org/x/sys/unix/dirent.go +++ b/vendor/golang.org/x/sys/unix/dirent.go @@ -2,16 +2,101 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package unix -import "syscall" +import "unsafe" + +// readInt returns the size-bytes unsigned integer in native byte order at offset off. +func readInt(b []byte, off, size uintptr) (u uint64, ok bool) { + if len(b) < int(off+size) { + return 0, false + } + if isBigEndian { + return readIntBE(b[off:], size), true + } + return readIntLE(b[off:], size), true +} + +func readIntBE(b []byte, size uintptr) uint64 { + switch size { + case 1: + return uint64(b[0]) + case 2: + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[1]) | uint64(b[0])<<8 + case 4: + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24 + case 8: + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | + uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 + default: + panic("syscall: readInt with unsupported size") + } +} + +func readIntLE(b []byte, size uintptr) uint64 { + switch size { + case 1: + return uint64(b[0]) + case 2: + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 + case 4: + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 + case 8: + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + default: + panic("syscall: readInt with unsupported size") + } +} // ParseDirent parses up to max directory entries in buf, // appending the names to names. It returns the number of // bytes consumed from buf, the number of entries added // to names, and the new names slice. func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { - return syscall.ParseDirent(buf, max, names) + origlen := len(buf) + count = 0 + for max != 0 && len(buf) > 0 { + reclen, ok := direntReclen(buf) + if !ok || reclen > uint64(len(buf)) { + return origlen, count, names + } + rec := buf[:reclen] + buf = buf[reclen:] + ino, ok := direntIno(rec) + if !ok { + break + } + if ino == 0 { // File absent in directory. + continue + } + const namoff = uint64(unsafe.Offsetof(Dirent{}.Name)) + namlen, ok := direntNamlen(rec) + if !ok || namoff+namlen > uint64(len(rec)) { + break + } + name := rec[namoff : namoff+namlen] + for i, c := range name { + if c == 0 { + name = name[:i] + break + } + } + // Check for useless names before allocating a string. + if string(name) == "." || string(name) == ".." { + continue + } + max-- + count++ + names = append(names, string(name)) + } + return origlen - len(buf), count, names } diff --git a/vendor/golang.org/x/sys/unix/endian_little.go b/vendor/golang.org/x/sys/unix/endian_little.go index 085df2d8..bcdb5d30 100644 --- a/vendor/golang.org/x/sys/unix/endian_little.go +++ b/vendor/golang.org/x/sys/unix/endian_little.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // -// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le +// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le riscv64 package unix diff --git a/vendor/golang.org/x/sys/unix/ioctl.go b/vendor/golang.org/x/sys/unix/ioctl.go index f121a8d6..3559e5dc 100644 --- a/vendor/golang.org/x/sys/unix/ioctl.go +++ b/vendor/golang.org/x/sys/unix/ioctl.go @@ -6,7 +6,19 @@ package unix -import "runtime" +import ( + "runtime" + "unsafe" +) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} // IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. // @@ -14,7 +26,7 @@ import "runtime" func IoctlSetWinsize(fd int, req uint, value *Winsize) error { // TODO: if we get the chance, remove the req parameter and // hardcode TIOCSWINSZ. - err := ioctlSetWinsize(fd, req, value) + err := ioctl(fd, req, uintptr(unsafe.Pointer(value))) runtime.KeepAlive(value) return err } @@ -24,7 +36,30 @@ func IoctlSetWinsize(fd int, req uint, value *Winsize) error { // The req value will usually be TCSETA or TIOCSETA. func IoctlSetTermios(fd int, req uint, value *Termios) error { // TODO: if we get the chance, remove the req parameter. - err := ioctlSetTermios(fd, req, value) + err := ioctl(fd, req, uintptr(unsafe.Pointer(value))) runtime.KeepAlive(value) return err } + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +// +// A few ioctl requests use the return value as an output parameter; +// for those, IoctlRetInt should be used instead of this function. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index 80d00707..5a22eca9 100644 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -105,25 +105,25 @@ dragonfly_amd64) freebsd_386) mkerrors="$mkerrors -m32" mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_amd64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_arm) mkerrors="$mkerrors" mksyscall="go run mksyscall.go -l32 -arm" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; freebsd_arm64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; netbsd_386) diff --git a/vendor/golang.org/x/sys/unix/mkasm_darwin.go b/vendor/golang.org/x/sys/unix/mkasm_darwin.go deleted file mode 100644 index 4548b993..00000000 --- a/vendor/golang.org/x/sys/unix/mkasm_darwin.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// mkasm_darwin.go generates assembly trampolines to call libSystem routines from Go. -//This program must be run after mksyscall.go. -package main - -import ( - "bytes" - "fmt" - "io/ioutil" - "log" - "os" - "strings" -) - -func main() { - in1, err := ioutil.ReadFile("syscall_darwin.go") - if err != nil { - log.Fatalf("can't open syscall_darwin.go: %s", err) - } - arch := os.Args[1] - in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_darwin_%s.go", arch)) - if err != nil { - log.Fatalf("can't open syscall_darwin_%s.go: %s", arch, err) - } - in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.go", arch)) - if err != nil { - log.Fatalf("can't open zsyscall_darwin_%s.go: %s", arch, err) - } - in := string(in1) + string(in2) + string(in3) - - trampolines := map[string]bool{} - - var out bytes.Buffer - - fmt.Fprintf(&out, "// go run mkasm_darwin.go %s\n", strings.Join(os.Args[1:], " ")) - fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n") - fmt.Fprintf(&out, "\n") - fmt.Fprintf(&out, "// +build go1.12\n") - fmt.Fprintf(&out, "\n") - fmt.Fprintf(&out, "#include \"textflag.h\"\n") - for _, line := range strings.Split(in, "\n") { - if !strings.HasPrefix(line, "func ") || !strings.HasSuffix(line, "_trampoline()") { - continue - } - fn := line[5 : len(line)-13] - if !trampolines[fn] { - trampolines[fn] = true - fmt.Fprintf(&out, "TEXT ·%s_trampoline(SB),NOSPLIT,$0-0\n", fn) - fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn) - } - } - err = ioutil.WriteFile(fmt.Sprintf("zsyscall_darwin_%s.s", arch), out.Bytes(), 0644) - if err != nil { - log.Fatalf("can't write zsyscall_darwin_%s.s: %s", arch, err) - } -} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 4c91159c..85cfbd04 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -183,6 +183,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -198,12 +199,14 @@ struct ltchars { #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -434,6 +437,8 @@ ccflags="$@" $2 ~ /^TC[IO](ON|OFF)$/ || $2 ~ /^IN_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || + $2 ~ /^LO_(KEY|NAME)_SIZE$/ || + $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|MCAST|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || $2 ~ /^TP_STATUS_/ || $2 ~ /^FALLOC_/ || @@ -447,6 +452,7 @@ ccflags="$@" $2 ~ /^SYSCTL_VERS/ || $2 !~ "MNT_BITS" && $2 ~ /^(MS|MNT|UMOUNT)_/ || + $2 ~ /^NS_GET_/ || $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || $2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT)_/ || $2 ~ /^KEXEC_/ || diff --git a/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/golang.org/x/sys/unix/mkpost.go deleted file mode 100644 index 4d5b531b..00000000 --- a/vendor/golang.org/x/sys/unix/mkpost.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// mkpost processes the output of cgo -godefs to -// modify the generated types. It is used to clean up -// the sys API in an architecture specific manner. -// -// mkpost is run after cgo -godefs; see README.md. -package main - -import ( - "bytes" - "fmt" - "go/format" - "io/ioutil" - "log" - "os" - "regexp" -) - -func main() { - // Get the OS and architecture (using GOARCH_TARGET if it exists) - goos := os.Getenv("GOOS") - goarch := os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - // Check that we are using the Docker-based build system if we should be. - if goos == "linux" { - if os.Getenv("GOLANG_SYS_BUILD") != "docker" { - os.Stderr.WriteString("In the Docker-based build system, mkpost should not be called directly.\n") - os.Stderr.WriteString("See README.md\n") - os.Exit(1) - } - } - - b, err := ioutil.ReadAll(os.Stdin) - if err != nil { - log.Fatal(err) - } - - if goos == "aix" { - // Replace type of Atim, Mtim and Ctim by Timespec in Stat_t - // to avoid having both StTimespec and Timespec. - sttimespec := regexp.MustCompile(`_Ctype_struct_st_timespec`) - b = sttimespec.ReplaceAll(b, []byte("Timespec")) - } - - // Intentionally export __val fields in Fsid and Sigset_t - valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`) - b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}")) - - // Intentionally export __fds_bits field in FdSet - fdSetRegex := regexp.MustCompile(`type (FdSet) struct {(\s+)X__fds_bits(\s+\S+\s+)}`) - b = fdSetRegex.ReplaceAll(b, []byte("type $1 struct {${2}Bits$3}")) - - // If we have empty Ptrace structs, we should delete them. Only s390x emits - // nonempty Ptrace structs. - ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) - b = ptraceRexexp.ReplaceAll(b, nil) - - // Replace the control_regs union with a blank identifier for now. - controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`) - b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64")) - - // Remove fields that are added by glibc - // Note that this is unstable as the identifers are private. - removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`) - b = removeFieldsRegex.ReplaceAll(b, []byte("_")) - - // Convert [65]int8 to [65]byte in Utsname members to simplify - // conversion to string; see golang.org/issue/20753 - convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) - b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) - - // Convert [1024]int8 to [1024]byte in Ptmget members - convertPtmget := regexp.MustCompile(`([SC]n)(\s+)\[(\d+)\]u?int8`) - b = convertPtmget.ReplaceAll(b, []byte("$1[$3]byte")) - - // Remove spare fields (e.g. in Statx_t) - spareFieldsRegex := regexp.MustCompile(`X__spare\S*`) - b = spareFieldsRegex.ReplaceAll(b, []byte("_")) - - // Remove cgo padding fields - removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`) - b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_")) - - // Remove padding, hidden, or unused fields - removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`) - b = removeFieldsRegex.ReplaceAll(b, []byte("_")) - - // Remove the first line of warning from cgo - b = b[bytes.IndexByte(b, '\n')+1:] - // Modify the command in the header to include: - // mkpost, our own warning, and a build tag. - replacement := fmt.Sprintf(`$1 | go run mkpost.go -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s,%s`, goarch, goos) - cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) - b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) - - // Rename Stat_t time fields - if goos == "freebsd" && goarch == "386" { - // Hide Stat_t.[AMCB]tim_ext fields - renameStatTimeExtFieldsRegex := regexp.MustCompile(`[AMCB]tim_ext`) - b = renameStatTimeExtFieldsRegex.ReplaceAll(b, []byte("_")) - } - renameStatTimeFieldsRegex := regexp.MustCompile(`([AMCB])(?:irth)?time?(?:spec)?\s+(Timespec|StTimespec)`) - b = renameStatTimeFieldsRegex.ReplaceAll(b, []byte("${1}tim ${2}")) - - // gofmt - b, err = format.Source(b) - if err != nil { - log.Fatal(err) - } - - os.Stdout.Write(b) -} diff --git a/vendor/golang.org/x/sys/unix/mksyscall.go b/vendor/golang.org/x/sys/unix/mksyscall.go deleted file mode 100644 index e4af9424..00000000 --- a/vendor/golang.org/x/sys/unix/mksyscall.go +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -This program reads a file containing function prototypes -(like syscall_darwin.go) and generates system call bodies. -The prototypes are marked by lines beginning with "//sys" -and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named errno. - -A line beginning with //sysnb is like //sys, except that the -goroutine will not be suspended during the execution of the system -call. This must only be used for system calls which can never -block, as otherwise the system call could cause all goroutines to -hang. -*/ -package main - -import ( - "bufio" - "flag" - "fmt" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - plan9 = flag.Bool("plan9", false, "plan9") - openbsd = flag.Bool("openbsd", false, "openbsd") - netbsd = flag.Bool("netbsd", false, "netbsd") - dragonfly = flag.Bool("dragonfly", false, "dragonfly") - arm = flag.Bool("arm", false, "arm") // 64-bit value should use (even, odd)-pair - tags = flag.String("tags", "", "build tags") - filename = flag.String("output", "", "output file name (standard output if omitted)") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - // Get the OS and architecture (using GOARCH_TARGET if it exists) - goos := os.Getenv("GOOS") - if goos == "" { - fmt.Fprintln(os.Stderr, "GOOS not defined in environment") - os.Exit(1) - } - goarch := os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - - // Check that we are using the Docker-based build system if we should - if goos == "linux" { - if os.Getenv("GOLANG_SYS_BUILD") != "docker" { - fmt.Fprintf(os.Stderr, "In the Docker-based build system, mksyscall should not be called directly.\n") - fmt.Fprintf(os.Stderr, "See README.md\n") - os.Exit(1) - } - } - - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - libc := false - if goos == "darwin" && strings.Contains(buildTags(), ",go1.12") { - libc = true - } - trampolines := map[string]bool{} - - text := "" - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, errno error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, sysname := f[2], f[3], f[4], f[5] - - // ClockGettime doesn't have a syscall number on Darwin, only generate libc wrappers. - if goos == "darwin" && !libc && funct == "ClockGettime" { - continue - } - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - - // Go function header. - outDecl := "" - if len(out) > 0 { - outDecl = fmt.Sprintf(" (%s)", strings.Join(out, ", ")) - } - text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outDecl) - - // Check if err return available - errvar := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - break - } - } - - // Prepare arguments to Syscall. - var args []string - n := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") - } else if p.Type == "string" && errvar != "" { - text += fmt.Sprintf("\tvar _p%d *byte\n", n) - text += fmt.Sprintf("\t_p%d, %s = BytePtrFromString(%s)\n", n, errvar, p.Name) - text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - text += fmt.Sprintf("\tvar _p%d *byte\n", n) - text += fmt.Sprintf("\t_p%d, _ = BytePtrFromString(%s)\n", n, p.Name) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass dummy pointer in that case. - // Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). - text += fmt.Sprintf("\tvar _p%d unsafe.Pointer\n", n) - text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = unsafe.Pointer(&%s[0])\n\t}", p.Name, n, p.Name) - text += fmt.Sprintf(" else {\n\t\t_p%d = unsafe.Pointer(&_zero)\n\t}\n", n) - args = append(args, fmt.Sprintf("uintptr(_p%d)", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) - n++ - } else if p.Type == "int64" && (*openbsd || *netbsd) { - args = append(args, "0") - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else if endianness == "little-endian" { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } else if p.Type == "int64" && *dragonfly { - if regexp.MustCompile(`^(?i)extp(read|write)`).FindStringSubmatch(funct) == nil { - args = append(args, "0") - } - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else if endianness == "little-endian" { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } else if (p.Type == "int64" || p.Type == "uint64") && endianness != "" { - if len(args)%2 == 1 && *arm { - // arm abi specifies 64-bit argument uses - // (even, odd) pair - args = append(args, "0") - } - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } - - // Determine which form to use; pad args with zeros. - asm := "Syscall" - if nonblock != nil { - if errvar == "" && goos == "linux" { - asm = "RawSyscallNoError" - } else { - asm = "RawSyscall" - } - } else { - if errvar == "" && goos == "linux" { - asm = "SyscallNoError" - } - } - if len(args) <= 3 { - for len(args) < 3 { - args = append(args, "0") - } - } else if len(args) <= 6 { - asm += "6" - for len(args) < 6 { - args = append(args, "0") - } - } else if len(args) <= 9 { - asm += "9" - for len(args) < 9 { - args = append(args, "0") - } - } else { - fmt.Fprintf(os.Stderr, "%s:%s too many arguments to system call\n", path, funct) - } - - // System call number. - if sysname == "" { - sysname = "SYS_" + funct - sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) - sysname = strings.ToUpper(sysname) - } - - var libcFn string - if libc { - asm = "syscall_" + strings.ToLower(asm[:1]) + asm[1:] // internal syscall call - sysname = strings.TrimPrefix(sysname, "SYS_") // remove SYS_ - sysname = strings.ToLower(sysname) // lowercase - if sysname == "getdirentries64" { - // Special case - libSystem name and - // raw syscall name don't match. - sysname = "__getdirentries64" - } - libcFn = sysname - sysname = "funcPC(libc_" + sysname + "_trampoline)" - } - - // Actual call. - arglist := strings.Join(args, ", ") - call := fmt.Sprintf("%s(%s, %s)", asm, sysname, arglist) - - // Assign return values. - body := "" - ret := []string{"_", "_", "_"} - doErrno := false - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" && !*plan9 { - reg = "e1" - ret[2] = reg - doErrno = true - } else if p.Name == "err" && *plan9 { - ret[0] = "r0" - ret[2] = "e1" - break - } else { - reg = fmt.Sprintf("r%d", i) - ret[i] = reg - } - if p.Type == "bool" { - reg = fmt.Sprintf("%s != 0", reg) - } - if p.Type == "int64" && endianness != "" { - // 64-bit number in r1:r0 or r0:r1. - if i+2 > len(out) { - fmt.Fprintf(os.Stderr, "%s:%s not enough registers for int64 return\n", path, funct) - } - if endianness == "big-endian" { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) - } else { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) - } - ret[i] = fmt.Sprintf("r%d", i) - ret[i+1] = fmt.Sprintf("r%d", i+1) - } - if reg != "e1" || *plan9 { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { - text += fmt.Sprintf("\t%s\n", call) - } else { - if errvar == "" && goos == "linux" { - // raw syscall without error on Linux, see golang.org/issue/22924 - text += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], call) - } else { - text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) - } - } - text += body - - if *plan9 && ret[2] == "e1" { - text += "\tif int32(r0) == -1 {\n" - text += "\t\terr = e1\n" - text += "\t}\n" - } else if doErrno { - text += "\tif e1 != 0 {\n" - text += "\t\terr = errnoErr(e1)\n" - text += "\t}\n" - } - text += "\treturn\n" - text += "}\n\n" - - if libc && !trampolines[libcFn] { - // some system calls share a trampoline, like read and readlen. - trampolines[libcFn] = true - // Declare assembly trampoline. - text += fmt.Sprintf("func libc_%s_trampoline()\n", libcFn) - // Assembly trampoline calls the libc_* function, which this magic - // redirects to use the function from libSystem. - text += fmt.Sprintf("//go:linkname libc_%s libc_%s\n", libcFn, libcFn) - text += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"/usr/lib/libSystem.B.dylib\"\n", libcFn, libcFn) - text += "\n" - } - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - fmt.Printf(srcTemplate, cmdLine(), buildTags(), text) -} - -const srcTemplate = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package unix - -import ( - "syscall" - "unsafe" -) - -var _ syscall.Errno - -%s -` diff --git a/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go deleted file mode 100644 index 3be3cdfc..00000000 --- a/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -This program reads a file containing function prototypes -(like syscall_aix.go) and generates system call bodies. -The prototypes are marked by lines beginning with "//sys" -and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named err. - * If go func name needs to be different than its libc name, - * or the function is not in libc, name could be specified - * at the end, after "=" sign, like - //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt -*/ -package main - -import ( - "bufio" - "flag" - "fmt" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - aix = flag.Bool("aix", false, "aix") - tags = flag.String("tags", "", "build tags") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall_aix_ppc.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - pack := "" - text := "" - cExtern := "/*\n#include \n#include \n" - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { - pack = p[1] - } - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, err error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - inps = strings.Join(in, ", ") - outps = strings.Join(out, ", ") - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - - // Check if value return, err return available - errvar := "" - retvar := "" - rettype := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - } else { - retvar = p.Name - rettype = p.Type - } - } - - // System call name. - if sysname == "" { - sysname = funct - } - sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) - sysname = strings.ToLower(sysname) // All libc functions are lowercase. - - cRettype := "" - if rettype == "unsafe.Pointer" { - cRettype = "uintptr_t" - } else if rettype == "uintptr" { - cRettype = "uintptr_t" - } else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { - cRettype = "uintptr_t" - } else if rettype == "int" { - cRettype = "int" - } else if rettype == "int32" { - cRettype = "int" - } else if rettype == "int64" { - cRettype = "long long" - } else if rettype == "uint32" { - cRettype = "unsigned int" - } else if rettype == "uint64" { - cRettype = "unsigned long long" - } else { - cRettype = "int" - } - if sysname == "exit" { - cRettype = "void" - } - - // Change p.Types to c - var cIn []string - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "string" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t", "size_t") - } else if p.Type == "unsafe.Pointer" { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "uintptr" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "int" { - cIn = append(cIn, "int") - } else if p.Type == "int32" { - cIn = append(cIn, "int") - } else if p.Type == "int64" { - cIn = append(cIn, "long long") - } else if p.Type == "uint32" { - cIn = append(cIn, "unsigned int") - } else if p.Type == "uint64" { - cIn = append(cIn, "unsigned long long") - } else { - cIn = append(cIn, "int") - } - } - - if funct != "fcntl" && funct != "FcntlInt" && funct != "readlen" && funct != "writelen" { - if sysname == "select" { - // select is a keyword of Go. Its name is - // changed to c_select. - cExtern += "#define c_select select\n" - } - // Imports of system calls from libc - cExtern += fmt.Sprintf("%s %s", cRettype, sysname) - cIn := strings.Join(cIn, ", ") - cExtern += fmt.Sprintf("(%s);\n", cIn) - } - - // So file name. - if *aix { - if modname == "" { - modname = "libc.a/shr_64.o" - } else { - fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) - os.Exit(1) - } - } - - strconvfunc := "C.CString" - - // Go function header. - if outps != "" { - outps = fmt.Sprintf(" (%s)", outps) - } - if text != "" { - text += "\n" - } - - text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) - - // Prepare arguments to Syscall. - var args []string - n := 0 - argN := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - args = append(args, "C.uintptr_t(uintptr(unsafe.Pointer("+p.Name+")))") - } else if p.Type == "string" && errvar != "" { - text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) - args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) - args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass nil in that case. - text += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) - text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) - args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(unsafe.Pointer(_p%d)))", n)) - n++ - text += fmt.Sprintf("\tvar _p%d int\n", n) - text += fmt.Sprintf("\t_p%d = len(%s)\n", n, p.Name) - args = append(args, fmt.Sprintf("C.size_t(_p%d)", n)) - n++ - } else if p.Type == "int64" && endianness != "" { - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } - n++ - } else if p.Type == "bool" { - text += fmt.Sprintf("\tvar _p%d uint32\n", n) - text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) - args = append(args, fmt.Sprintf("_p%d", n)) - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { - args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) - } else if p.Type == "unsafe.Pointer" { - args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) - } else if p.Type == "int" { - if (argN == 2) && ((funct == "readlen") || (funct == "writelen")) { - args = append(args, fmt.Sprintf("C.size_t(%s)", p.Name)) - } else if argN == 0 && funct == "fcntl" { - args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else if (argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt")) { - args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) - } - } else if p.Type == "int32" { - args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) - } else if p.Type == "int64" { - args = append(args, fmt.Sprintf("C.longlong(%s)", p.Name)) - } else if p.Type == "uint32" { - args = append(args, fmt.Sprintf("C.uint(%s)", p.Name)) - } else if p.Type == "uint64" { - args = append(args, fmt.Sprintf("C.ulonglong(%s)", p.Name)) - } else if p.Type == "uintptr" { - args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) - } - argN++ - } - - // Actual call. - arglist := strings.Join(args, ", ") - call := "" - if sysname == "exit" { - if errvar != "" { - call += "er :=" - } else { - call += "" - } - } else if errvar != "" { - call += "r0,er :=" - } else if retvar != "" { - call += "r0,_ :=" - } else { - call += "" - } - if sysname == "select" { - // select is a keyword of Go. Its name is - // changed to c_select. - call += fmt.Sprintf("C.c_%s(%s)", sysname, arglist) - } else { - call += fmt.Sprintf("C.%s(%s)", sysname, arglist) - } - - // Assign return values. - body := "" - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" { - reg = "e1" - } else { - reg = "r0" - } - if reg != "e1" { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - - // verify return - if sysname != "exit" && errvar != "" { - if regexp.MustCompile(`^uintptr`).FindStringSubmatch(cRettype) != nil { - body += "\tif (uintptr(r0) ==^uintptr(0) && er != nil) {\n" - body += fmt.Sprintf("\t\t%s = er\n", errvar) - body += "\t}\n" - } else { - body += "\tif (r0 ==-1 && er != nil) {\n" - body += fmt.Sprintf("\t\t%s = er\n", errvar) - body += "\t}\n" - } - } else if errvar != "" { - body += "\tif (er != nil) {\n" - body += fmt.Sprintf("\t\t%s = er\n", errvar) - body += "\t}\n" - } - - text += fmt.Sprintf("\t%s\n", call) - text += body - - text += "\treturn\n" - text += "}\n" - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - imp := "" - if pack != "unix" { - imp = "import \"golang.org/x/sys/unix\"\n" - - } - fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, cExtern, imp, text) -} - -const srcTemplate = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package %s - - -%s -*/ -import "C" -import ( - "unsafe" -) - - -%s - -%s -` diff --git a/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go deleted file mode 100644 index c9600995..00000000 --- a/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go +++ /dev/null @@ -1,614 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -This program reads a file containing function prototypes -(like syscall_aix.go) and generates system call bodies. -The prototypes are marked by lines beginning with "//sys" -and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named err. - * If go func name needs to be different than its libc name, - * or the function is not in libc, name could be specified - * at the end, after "=" sign, like - //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt - - -This program will generate three files and handle both gc and gccgo implementation: - - zsyscall_aix_ppc64.go: the common part of each implementation (error handler, pointer creation) - - zsyscall_aix_ppc64_gc.go: gc part with //go_cgo_import_dynamic and a call to syscall6 - - zsyscall_aix_ppc64_gccgo.go: gccgo part with C function and conversion to C type. - - The generated code looks like this - -zsyscall_aix_ppc64.go -func asyscall(...) (n int, err error) { - // Pointer Creation - r1, e1 := callasyscall(...) - // Type Conversion - // Error Handler - return -} - -zsyscall_aix_ppc64_gc.go -//go:cgo_import_dynamic libc_asyscall asyscall "libc.a/shr_64.o" -//go:linkname libc_asyscall libc_asyscall -var asyscall syscallFunc - -func callasyscall(...) (r1 uintptr, e1 Errno) { - r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_asyscall)), "nb_args", ... ) - return -} - -zsyscall_aix_ppc64_ggcgo.go - -// int asyscall(...) - -import "C" - -func callasyscall(...) (r1 uintptr, e1 Errno) { - r1 = uintptr(C.asyscall(...)) - e1 = syscall.GetErrno() - return -} -*/ - -package main - -import ( - "bufio" - "flag" - "fmt" - "io/ioutil" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - aix = flag.Bool("aix", false, "aix") - tags = flag.String("tags", "", "build tags") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall_aix_ppc64.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc64.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - pack := "" - // GCCGO - textgccgo := "" - cExtern := "/*\n#include \n" - // GC - textgc := "" - dynimports := "" - linknames := "" - var vars []string - // COMMON - textcommon := "" - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { - pack = p[1] - } - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, err error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - inps = strings.Join(in, ", ") - outps = strings.Join(out, ", ") - - if sysname == "" { - sysname = funct - } - - onlyCommon := false - if funct == "readlen" || funct == "writelen" || funct == "FcntlInt" || funct == "FcntlFlock" { - // This function call another syscall which is already implemented. - // Therefore, the gc and gccgo part must not be generated. - onlyCommon = true - } - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - - textcommon += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - if !onlyCommon { - textgccgo += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - textgc += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - } - - // Check if value return, err return available - errvar := "" - rettype := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - } else { - rettype = p.Type - } - } - - sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) - sysname = strings.ToLower(sysname) // All libc functions are lowercase. - - // GCCGO Prototype return type - cRettype := "" - if rettype == "unsafe.Pointer" { - cRettype = "uintptr_t" - } else if rettype == "uintptr" { - cRettype = "uintptr_t" - } else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { - cRettype = "uintptr_t" - } else if rettype == "int" { - cRettype = "int" - } else if rettype == "int32" { - cRettype = "int" - } else if rettype == "int64" { - cRettype = "long long" - } else if rettype == "uint32" { - cRettype = "unsigned int" - } else if rettype == "uint64" { - cRettype = "unsigned long long" - } else { - cRettype = "int" - } - if sysname == "exit" { - cRettype = "void" - } - - // GCCGO Prototype arguments type - var cIn []string - for i, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "string" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t", "size_t") - } else if p.Type == "unsafe.Pointer" { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "uintptr" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "int" { - if (i == 0 || i == 2) && funct == "fcntl" { - // These fcntl arguments needs to be uintptr to be able to call FcntlInt and FcntlFlock - cIn = append(cIn, "uintptr_t") - } else { - cIn = append(cIn, "int") - } - - } else if p.Type == "int32" { - cIn = append(cIn, "int") - } else if p.Type == "int64" { - cIn = append(cIn, "long long") - } else if p.Type == "uint32" { - cIn = append(cIn, "unsigned int") - } else if p.Type == "uint64" { - cIn = append(cIn, "unsigned long long") - } else { - cIn = append(cIn, "int") - } - } - - if !onlyCommon { - // GCCGO Prototype Generation - // Imports of system calls from libc - if sysname == "select" { - // select is a keyword of Go. Its name is - // changed to c_select. - cExtern += "#define c_select select\n" - } - cExtern += fmt.Sprintf("%s %s", cRettype, sysname) - cIn := strings.Join(cIn, ", ") - cExtern += fmt.Sprintf("(%s);\n", cIn) - } - // GC Library name - if modname == "" { - modname = "libc.a/shr_64.o" - } else { - fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) - os.Exit(1) - } - sysvarname := fmt.Sprintf("libc_%s", sysname) - - if !onlyCommon { - // GC Runtime import of function to allow cross-platform builds. - dynimports += fmt.Sprintf("//go:cgo_import_dynamic %s %s \"%s\"\n", sysvarname, sysname, modname) - // GC Link symbol to proc address variable. - linknames += fmt.Sprintf("//go:linkname %s %s\n", sysvarname, sysvarname) - // GC Library proc address variable. - vars = append(vars, sysvarname) - } - - strconvfunc := "BytePtrFromString" - strconvtype := "*byte" - - // Go function header. - if outps != "" { - outps = fmt.Sprintf(" (%s)", outps) - } - if textcommon != "" { - textcommon += "\n" - } - - textcommon += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) - - // Prepare arguments tocall. - var argscommon []string // Arguments in the common part - var argscall []string // Arguments for call prototype - var argsgc []string // Arguments for gc call (with syscall6) - var argsgccgo []string // Arguments for gccgo call (with C.name_of_syscall) - n := 0 - argN := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(%s))", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else if p.Type == "string" && errvar != "" { - textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) - textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - argscall = append(argscall, fmt.Sprintf("_p%d uintptr ", n)) - argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) - textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n)) - argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass nil in that case. - textcommon += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) - textcommon += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("len(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n), fmt.Sprintf("_lenp%d int", n)) - argsgc = append(argsgc, fmt.Sprintf("_p%d", n), fmt.Sprintf("uintptr(_lenp%d)", n)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n), fmt.Sprintf("C.size_t(_lenp%d)", n)) - n++ - } else if p.Type == "int64" && endianness != "" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses int64 with 32 bits mode. Case not yet implemented\n") - } else if p.Type == "bool" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses bool. Case not yet implemented\n") - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil || p.Type == "unsafe.Pointer" { - argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else if p.Type == "int" { - if (argN == 0 || argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt") || (funct == "FcntlFlock")) { - // These fcntl arguments need to be uintptr to be able to call FcntlInt and FcntlFlock - argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - - } else { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) - } - } else if p.Type == "int32" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s int32", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) - } else if p.Type == "int64" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s int64", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.longlong(%s)", p.Name)) - } else if p.Type == "uint32" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s uint32", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uint(%s)", p.Name)) - } else if p.Type == "uint64" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s uint64", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.ulonglong(%s)", p.Name)) - } else if p.Type == "uintptr" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else { - argscommon = append(argscommon, fmt.Sprintf("int(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) - } - argN++ - } - nargs := len(argsgc) - - // COMMON function generation - argscommonlist := strings.Join(argscommon, ", ") - callcommon := fmt.Sprintf("call%s(%s)", sysname, argscommonlist) - ret := []string{"_", "_"} - body := "" - doErrno := false - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" { - reg = "e1" - ret[1] = reg - doErrno = true - } else { - reg = "r0" - ret[0] = reg - } - if p.Type == "bool" { - reg = fmt.Sprintf("%s != 0", reg) - } - if reg != "e1" { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - if ret[0] == "_" && ret[1] == "_" { - textcommon += fmt.Sprintf("\t%s\n", callcommon) - } else { - textcommon += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], callcommon) - } - textcommon += body - - if doErrno { - textcommon += "\tif e1 != 0 {\n" - textcommon += "\t\terr = errnoErr(e1)\n" - textcommon += "\t}\n" - } - textcommon += "\treturn\n" - textcommon += "}\n" - - if onlyCommon { - continue - } - - // CALL Prototype - callProto := fmt.Sprintf("func call%s(%s) (r1 uintptr, e1 Errno) {\n", sysname, strings.Join(argscall, ", ")) - - // GC function generation - asm := "syscall6" - if nonblock != nil { - asm = "rawSyscall6" - } - - if len(argsgc) <= 6 { - for len(argsgc) < 6 { - argsgc = append(argsgc, "0") - } - } else { - fmt.Fprintf(os.Stderr, "%s: too many arguments to system call", funct) - os.Exit(1) - } - argsgclist := strings.Join(argsgc, ", ") - callgc := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, argsgclist) - - textgc += callProto - textgc += fmt.Sprintf("\tr1, _, e1 = %s\n", callgc) - textgc += "\treturn\n}\n" - - // GCCGO function generation - argsgccgolist := strings.Join(argsgccgo, ", ") - var callgccgo string - if sysname == "select" { - // select is a keyword of Go. Its name is - // changed to c_select. - callgccgo = fmt.Sprintf("C.c_%s(%s)", sysname, argsgccgolist) - } else { - callgccgo = fmt.Sprintf("C.%s(%s)", sysname, argsgccgolist) - } - textgccgo += callProto - textgccgo += fmt.Sprintf("\tr1 = uintptr(%s)\n", callgccgo) - textgccgo += "\te1 = syscall.GetErrno()\n" - textgccgo += "\treturn\n}\n" - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - imp := "" - if pack != "unix" { - imp = "import \"golang.org/x/sys/unix\"\n" - - } - - // Print zsyscall_aix_ppc64.go - err := ioutil.WriteFile("zsyscall_aix_ppc64.go", - []byte(fmt.Sprintf(srcTemplate1, cmdLine(), buildTags(), pack, imp, textcommon)), - 0644) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - - // Print zsyscall_aix_ppc64_gc.go - vardecls := "\t" + strings.Join(vars, ",\n\t") - vardecls += " syscallFunc" - err = ioutil.WriteFile("zsyscall_aix_ppc64_gc.go", - []byte(fmt.Sprintf(srcTemplate2, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, textgc)), - 0644) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - - // Print zsyscall_aix_ppc64_gccgo.go - err = ioutil.WriteFile("zsyscall_aix_ppc64_gccgo.go", - []byte(fmt.Sprintf(srcTemplate3, cmdLine(), buildTags(), pack, cExtern, imp, textgccgo)), - 0644) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } -} - -const srcTemplate1 = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package %s - -import ( - "unsafe" -) - - -%s - -%s -` -const srcTemplate2 = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s -// +build !gccgo - -package %s - -import ( - "unsafe" -) -%s -%s -%s -type syscallFunc uintptr - -var ( -%s -) - -// Implemented in runtime/syscall_aix.go. -func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) -func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) - -%s -` -const srcTemplate3 = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s -// +build gccgo - -package %s - -%s -*/ -import "C" -import ( - "syscall" -) - - -%s - -%s -` diff --git a/vendor/golang.org/x/sys/unix/mksyscall_solaris.go b/vendor/golang.org/x/sys/unix/mksyscall_solaris.go deleted file mode 100644 index 3d864738..00000000 --- a/vendor/golang.org/x/sys/unix/mksyscall_solaris.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* - This program reads a file containing function prototypes - (like syscall_solaris.go) and generates system call bodies. - The prototypes are marked by lines beginning with "//sys" - and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named err. - * If go func name needs to be different than its libc name, - * or the function is not in libc, name could be specified - * at the end, after "=" sign, like - //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt -*/ - -package main - -import ( - "bufio" - "flag" - "fmt" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - tags = flag.String("tags", "", "build tags") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall_solaris.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall_solaris.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - pack := "" - text := "" - dynimports := "" - linknames := "" - var vars []string - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { - pack = p[1] - } - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, err error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - inps = strings.Join(in, ", ") - outps = strings.Join(out, ", ") - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - - // So file name. - if modname == "" { - modname = "libc" - } - - // System call name. - if sysname == "" { - sysname = funct - } - - // System call pointer variable name. - sysvarname := fmt.Sprintf("proc%s", sysname) - - strconvfunc := "BytePtrFromString" - strconvtype := "*byte" - - sysname = strings.ToLower(sysname) // All libc functions are lowercase. - - // Runtime import of function to allow cross-platform builds. - dynimports += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"%s.so\"\n", sysname, sysname, modname) - // Link symbol to proc address variable. - linknames += fmt.Sprintf("//go:linkname %s libc_%s\n", sysvarname, sysname) - // Library proc address variable. - vars = append(vars, sysvarname) - - // Go function header. - outlist := strings.Join(out, ", ") - if outlist != "" { - outlist = fmt.Sprintf(" (%s)", outlist) - } - if text != "" { - text += "\n" - } - text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outlist) - - // Check if err return available - errvar := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - continue - } - } - - // Prepare arguments to Syscall. - var args []string - n := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") - } else if p.Type == "string" && errvar != "" { - text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - text += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) - text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - text += fmt.Sprintf("\t_p%d, _ = %s(%s)\n", n, strconvfunc, p.Name) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if s := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); s != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass nil in that case. - text += fmt.Sprintf("\tvar _p%d *%s\n", n, s[1]) - text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) - n++ - } else if p.Type == "int64" && endianness != "" { - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } - } else if p.Type == "bool" { - text += fmt.Sprintf("\tvar _p%d uint32\n", n) - text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) - args = append(args, fmt.Sprintf("uintptr(_p%d)", n)) - n++ - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } - nargs := len(args) - - // Determine which form to use; pad args with zeros. - asm := "sysvicall6" - if nonblock != nil { - asm = "rawSysvicall6" - } - if len(args) <= 6 { - for len(args) < 6 { - args = append(args, "0") - } - } else { - fmt.Fprintf(os.Stderr, "%s: too many arguments to system call\n", path) - os.Exit(1) - } - - // Actual call. - arglist := strings.Join(args, ", ") - call := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, arglist) - - // Assign return values. - body := "" - ret := []string{"_", "_", "_"} - doErrno := false - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" { - reg = "e1" - ret[2] = reg - doErrno = true - } else { - reg = fmt.Sprintf("r%d", i) - ret[i] = reg - } - if p.Type == "bool" { - reg = fmt.Sprintf("%d != 0", reg) - } - if p.Type == "int64" && endianness != "" { - // 64-bit number in r1:r0 or r0:r1. - if i+2 > len(out) { - fmt.Fprintf(os.Stderr, "%s: not enough registers for int64 return\n", path) - os.Exit(1) - } - if endianness == "big-endian" { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) - } else { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) - } - ret[i] = fmt.Sprintf("r%d", i) - ret[i+1] = fmt.Sprintf("r%d", i+1) - } - if reg != "e1" { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { - text += fmt.Sprintf("\t%s\n", call) - } else { - text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) - } - text += body - - if doErrno { - text += "\tif e1 != 0 {\n" - text += "\t\terr = e1\n" - text += "\t}\n" - } - text += "\treturn\n" - text += "}\n" - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - imp := "" - if pack != "unix" { - imp = "import \"golang.org/x/sys/unix\"\n" - - } - vardecls := "\t" + strings.Join(vars, ",\n\t") - vardecls += " syscallFunc" - fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, text) -} - -const srcTemplate = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package %s - -import ( - "syscall" - "unsafe" -) -%s -%s -%s -var ( -%s -) - -%s -` diff --git a/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go b/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go deleted file mode 100644 index b6b40990..00000000 --- a/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go +++ /dev/null @@ -1,355 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Parse the header files for OpenBSD and generate a Go usable sysctl MIB. -// -// Build a MIB with each entry being an array containing the level, type and -// a hash that will contain additional entries if the current entry is a node. -// We then walk this MIB and create a flattened sysctl name to OID hash. - -package main - -import ( - "bufio" - "fmt" - "os" - "path/filepath" - "regexp" - "sort" - "strings" -) - -var ( - goos, goarch string -) - -// cmdLine returns this programs's commandline arguments. -func cmdLine() string { - return "go run mksysctl_openbsd.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags. -func buildTags() string { - return fmt.Sprintf("%s,%s", goarch, goos) -} - -// reMatch performs regular expression match and stores the substring slice to value pointed by m. -func reMatch(re *regexp.Regexp, str string, m *[]string) bool { - *m = re.FindStringSubmatch(str) - if *m != nil { - return true - } - return false -} - -type nodeElement struct { - n int - t string - pE *map[string]nodeElement -} - -var ( - debugEnabled bool - mib map[string]nodeElement - node *map[string]nodeElement - nodeMap map[string]string - sysCtl []string -) - -var ( - ctlNames1RE = regexp.MustCompile(`^#define\s+(CTL_NAMES)\s+{`) - ctlNames2RE = regexp.MustCompile(`^#define\s+(CTL_(.*)_NAMES)\s+{`) - ctlNames3RE = regexp.MustCompile(`^#define\s+((.*)CTL_NAMES)\s+{`) - netInetRE = regexp.MustCompile(`^netinet/`) - netInet6RE = regexp.MustCompile(`^netinet6/`) - netRE = regexp.MustCompile(`^net/`) - bracesRE = regexp.MustCompile(`{.*}`) - ctlTypeRE = regexp.MustCompile(`{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}`) - fsNetKernRE = regexp.MustCompile(`^(fs|net|kern)_`) -) - -func debug(s string) { - if debugEnabled { - fmt.Fprintln(os.Stderr, s) - } -} - -// Walk the MIB and build a sysctl name to OID mapping. -func buildSysctl(pNode *map[string]nodeElement, name string, oid []int) { - lNode := pNode // local copy of pointer to node - var keys []string - for k := range *lNode { - keys = append(keys, k) - } - sort.Strings(keys) - - for _, key := range keys { - nodename := name - if name != "" { - nodename += "." - } - nodename += key - - nodeoid := append(oid, (*pNode)[key].n) - - if (*pNode)[key].t == `CTLTYPE_NODE` { - if _, ok := nodeMap[nodename]; ok { - lNode = &mib - ctlName := nodeMap[nodename] - for _, part := range strings.Split(ctlName, ".") { - lNode = ((*lNode)[part]).pE - } - } else { - lNode = (*pNode)[key].pE - } - buildSysctl(lNode, nodename, nodeoid) - } else if (*pNode)[key].t != "" { - oidStr := []string{} - for j := range nodeoid { - oidStr = append(oidStr, fmt.Sprintf("%d", nodeoid[j])) - } - text := "\t{ \"" + nodename + "\", []_C_int{ " + strings.Join(oidStr, ", ") + " } }, \n" - sysCtl = append(sysCtl, text) - } - } -} - -func main() { - // Get the OS (using GOOS_TARGET if it exist) - goos = os.Getenv("GOOS_TARGET") - if goos == "" { - goos = os.Getenv("GOOS") - } - // Get the architecture (using GOARCH_TARGET if it exists) - goarch = os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - // Check if GOOS and GOARCH environment variables are defined - if goarch == "" || goos == "" { - fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n") - os.Exit(1) - } - - mib = make(map[string]nodeElement) - headers := [...]string{ - `sys/sysctl.h`, - `sys/socket.h`, - `sys/tty.h`, - `sys/malloc.h`, - `sys/mount.h`, - `sys/namei.h`, - `sys/sem.h`, - `sys/shm.h`, - `sys/vmmeter.h`, - `uvm/uvmexp.h`, - `uvm/uvm_param.h`, - `uvm/uvm_swap_encrypt.h`, - `ddb/db_var.h`, - `net/if.h`, - `net/if_pfsync.h`, - `net/pipex.h`, - `netinet/in.h`, - `netinet/icmp_var.h`, - `netinet/igmp_var.h`, - `netinet/ip_ah.h`, - `netinet/ip_carp.h`, - `netinet/ip_divert.h`, - `netinet/ip_esp.h`, - `netinet/ip_ether.h`, - `netinet/ip_gre.h`, - `netinet/ip_ipcomp.h`, - `netinet/ip_ipip.h`, - `netinet/pim_var.h`, - `netinet/tcp_var.h`, - `netinet/udp_var.h`, - `netinet6/in6.h`, - `netinet6/ip6_divert.h`, - `netinet6/pim6_var.h`, - `netinet/icmp6.h`, - `netmpls/mpls.h`, - } - - ctls := [...]string{ - `kern`, - `vm`, - `fs`, - `net`, - //debug /* Special handling required */ - `hw`, - //machdep /* Arch specific */ - `user`, - `ddb`, - //vfs /* Special handling required */ - `fs.posix`, - `kern.forkstat`, - `kern.intrcnt`, - `kern.malloc`, - `kern.nchstats`, - `kern.seminfo`, - `kern.shminfo`, - `kern.timecounter`, - `kern.tty`, - `kern.watchdog`, - `net.bpf`, - `net.ifq`, - `net.inet`, - `net.inet.ah`, - `net.inet.carp`, - `net.inet.divert`, - `net.inet.esp`, - `net.inet.etherip`, - `net.inet.gre`, - `net.inet.icmp`, - `net.inet.igmp`, - `net.inet.ip`, - `net.inet.ip.ifq`, - `net.inet.ipcomp`, - `net.inet.ipip`, - `net.inet.mobileip`, - `net.inet.pfsync`, - `net.inet.pim`, - `net.inet.tcp`, - `net.inet.udp`, - `net.inet6`, - `net.inet6.divert`, - `net.inet6.ip6`, - `net.inet6.icmp6`, - `net.inet6.pim6`, - `net.inet6.tcp6`, - `net.inet6.udp6`, - `net.mpls`, - `net.mpls.ifq`, - `net.key`, - `net.pflow`, - `net.pfsync`, - `net.pipex`, - `net.rt`, - `vm.swapencrypt`, - //vfsgenctl /* Special handling required */ - } - - // Node name "fixups" - ctlMap := map[string]string{ - "ipproto": "net.inet", - "net.inet.ipproto": "net.inet", - "net.inet6.ipv6proto": "net.inet6", - "net.inet6.ipv6": "net.inet6.ip6", - "net.inet.icmpv6": "net.inet6.icmp6", - "net.inet6.divert6": "net.inet6.divert", - "net.inet6.tcp6": "net.inet.tcp", - "net.inet6.udp6": "net.inet.udp", - "mpls": "net.mpls", - "swpenc": "vm.swapencrypt", - } - - // Node mappings - nodeMap = map[string]string{ - "net.inet.ip.ifq": "net.ifq", - "net.inet.pfsync": "net.pfsync", - "net.mpls.ifq": "net.ifq", - } - - mCtls := make(map[string]bool) - for _, ctl := range ctls { - mCtls[ctl] = true - } - - for _, header := range headers { - debug("Processing " + header) - file, err := os.Open(filepath.Join("/usr/include", header)) - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - var sub []string - if reMatch(ctlNames1RE, s.Text(), &sub) || - reMatch(ctlNames2RE, s.Text(), &sub) || - reMatch(ctlNames3RE, s.Text(), &sub) { - if sub[1] == `CTL_NAMES` { - // Top level. - node = &mib - } else { - // Node. - nodename := strings.ToLower(sub[2]) - ctlName := "" - if reMatch(netInetRE, header, &sub) { - ctlName = "net.inet." + nodename - } else if reMatch(netInet6RE, header, &sub) { - ctlName = "net.inet6." + nodename - } else if reMatch(netRE, header, &sub) { - ctlName = "net." + nodename - } else { - ctlName = nodename - ctlName = fsNetKernRE.ReplaceAllString(ctlName, `$1.`) - } - - if val, ok := ctlMap[ctlName]; ok { - ctlName = val - } - if _, ok := mCtls[ctlName]; !ok { - debug("Ignoring " + ctlName + "...") - continue - } - - // Walk down from the top of the MIB. - node = &mib - for _, part := range strings.Split(ctlName, ".") { - if _, ok := (*node)[part]; !ok { - debug("Missing node " + part) - (*node)[part] = nodeElement{n: 0, t: "", pE: &map[string]nodeElement{}} - } - node = (*node)[part].pE - } - } - - // Populate current node with entries. - i := -1 - for !strings.HasPrefix(s.Text(), "}") { - s.Scan() - if reMatch(bracesRE, s.Text(), &sub) { - i++ - } - if !reMatch(ctlTypeRE, s.Text(), &sub) { - continue - } - (*node)[sub[1]] = nodeElement{n: i, t: sub[2], pE: &map[string]nodeElement{}} - } - } - } - err = s.Err() - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) - } - file.Close() - } - buildSysctl(&mib, "", []int{}) - - sort.Strings(sysCtl) - text := strings.Join(sysCtl, "") - - fmt.Printf(srcTemplate, cmdLine(), buildTags(), text) -} - -const srcTemplate = `// %s -// Code generated by the command above; DO NOT EDIT. - -// +build %s - -package unix - -type mibentry struct { - ctlname string - ctloid []_C_int -} - -var sysctlMib = []mibentry { -%s -} -` diff --git a/vendor/golang.org/x/sys/unix/mksysnum.go b/vendor/golang.org/x/sys/unix/mksysnum.go deleted file mode 100644 index 07f8960f..00000000 --- a/vendor/golang.org/x/sys/unix/mksysnum.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Generate system call table for DragonFly, NetBSD, -// FreeBSD, OpenBSD or Darwin from master list -// (for example, /usr/src/sys/kern/syscalls.master or -// sys/syscall.h). -package main - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "regexp" - "strings" -) - -var ( - goos, goarch string -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksysnum.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return fmt.Sprintf("%s,%s", goarch, goos) -} - -func checkErr(err error) { - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) - } -} - -// source string and substring slice for regexp -type re struct { - str string // source string - sub []string // matched sub-string -} - -// Match performs regular expression match -func (r *re) Match(exp string) bool { - r.sub = regexp.MustCompile(exp).FindStringSubmatch(r.str) - if r.sub != nil { - return true - } - return false -} - -// fetchFile fetches a text file from URL -func fetchFile(URL string) io.Reader { - resp, err := http.Get(URL) - checkErr(err) - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - checkErr(err) - return strings.NewReader(string(body)) -} - -// readFile reads a text file from path -func readFile(path string) io.Reader { - file, err := os.Open(os.Args[1]) - checkErr(err) - return file -} - -func format(name, num, proto string) string { - name = strings.ToUpper(name) - // There are multiple entries for enosys and nosys, so comment them out. - nm := re{str: name} - if nm.Match(`^SYS_E?NOSYS$`) { - name = fmt.Sprintf("// %s", name) - } - if name == `SYS_SYS_EXIT` { - name = `SYS_EXIT` - } - return fmt.Sprintf(" %s = %s; // %s\n", name, num, proto) -} - -func main() { - // Get the OS (using GOOS_TARGET if it exist) - goos = os.Getenv("GOOS_TARGET") - if goos == "" { - goos = os.Getenv("GOOS") - } - // Get the architecture (using GOARCH_TARGET if it exists) - goarch = os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - // Check if GOOS and GOARCH environment variables are defined - if goarch == "" || goos == "" { - fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n") - os.Exit(1) - } - - file := strings.TrimSpace(os.Args[1]) - var syscalls io.Reader - if strings.HasPrefix(file, "https://") || strings.HasPrefix(file, "http://") { - // Download syscalls.master file - syscalls = fetchFile(file) - } else { - syscalls = readFile(file) - } - - var text, line string - s := bufio.NewScanner(syscalls) - for s.Scan() { - t := re{str: line} - if t.Match(`^(.*)\\$`) { - // Handle continuation - line = t.sub[1] - line += strings.TrimLeft(s.Text(), " \t") - } else { - // New line - line = s.Text() - } - t = re{str: line} - if t.Match(`\\$`) { - continue - } - t = re{str: line} - - switch goos { - case "dragonfly": - if t.Match(`^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$`) { - num, proto := t.sub[1], t.sub[2] - name := fmt.Sprintf("SYS_%s", t.sub[3]) - text += format(name, num, proto) - } - case "freebsd": - if t.Match(`^([0-9]+)\s+\S+\s+(?:NO)?STD\s+({ \S+\s+(\w+).*)$`) { - num, proto := t.sub[1], t.sub[2] - name := fmt.Sprintf("SYS_%s", t.sub[3]) - text += format(name, num, proto) - } - case "openbsd": - if t.Match(`^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$`) { - num, proto, name := t.sub[1], t.sub[3], t.sub[4] - text += format(name, num, proto) - } - case "netbsd": - if t.Match(`^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$`) { - num, proto, compat := t.sub[1], t.sub[6], t.sub[8] - name := t.sub[7] + "_" + t.sub[9] - if t.sub[11] != "" { - name = t.sub[7] + "_" + t.sub[11] - } - name = strings.ToUpper(name) - if compat == "" || compat == "13" || compat == "30" || compat == "50" { - text += fmt.Sprintf(" %s = %s; // %s\n", name, num, proto) - } - } - case "darwin": - if t.Match(`^#define\s+SYS_(\w+)\s+([0-9]+)`) { - name, num := t.sub[1], t.sub[2] - name = strings.ToUpper(name) - text += fmt.Sprintf(" SYS_%s = %s;\n", name, num) - } - default: - fmt.Fprintf(os.Stderr, "unrecognized GOOS=%s\n", goos) - os.Exit(1) - - } - } - err := s.Err() - checkErr(err) - - fmt.Printf(template, cmdLine(), buildTags(), text) -} - -const template = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package unix - -const( -%s)` diff --git a/vendor/golang.org/x/sys/unix/readdirent_getdents.go b/vendor/golang.org/x/sys/unix/readdirent_getdents.go new file mode 100644 index 00000000..3a90aa6d --- /dev/null +++ b/vendor/golang.org/x/sys/unix/readdirent_getdents.go @@ -0,0 +1,12 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix dragonfly freebsd linux netbsd openbsd + +package unix + +// ReadDirent reads directory entries from fd and writes them into buf. +func ReadDirent(fd int, buf []byte) (n int, err error) { + return Getdents(fd, buf) +} diff --git a/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go b/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go new file mode 100644 index 00000000..5fdae40b --- /dev/null +++ b/vendor/golang.org/x/sys/unix/readdirent_getdirentries.go @@ -0,0 +1,19 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin + +package unix + +import "unsafe" + +// ReadDirent reads directory entries from fd and writes them into buf. +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // 64 bits should be enough. (32 bits isn't even on 386). Since the + // actual system call is getdirentries64, 64 is a good guess. + // TODO(rsc): Can we use a single global basep for all calls? + var base = (*uintptr)(unsafe.Pointer(new(uint64))) + return Getdirentries(fd, buf, base) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index 45e12fb8..9ad8a0d4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -280,8 +280,24 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e return -1, ENOSYS } +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + reclen, ok := direntReclen(buf) + if !ok { + return 0, false + } + return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true +} + //sys getdirent(fd int, buf []byte) (n int, err error) -func ReadDirent(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { return getdirent(fd, buf) } @@ -334,49 +350,12 @@ func (w WaitStatus) Signal() Signal { func (w WaitStatus) Continued() bool { return w&0x01000000 != 0 } -func (w WaitStatus) CoreDump() bool { return w&0x200 != 0 } +func (w WaitStatus) CoreDump() bool { return w&0x80 == 0x80 } func (w WaitStatus) TrapCause() int { return -1 } //sys ioctl(fd int, req uint, arg uintptr) (err error) -// ioctl itself should not be exposed directly, but additional get/set -// functions for specific types are permissible. - -// IoctlSetInt performs an ioctl operation which sets an integer value -// on fd, using the specified request number. -func IoctlSetInt(fd int, req uint, value int) error { - return ioctl(fd, req, uintptr(value)) -} - -func ioctlSetWinsize(fd int, req uint, value *Winsize) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -func ioctlSetTermios(fd int, req uint, value *Termios) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -// IoctlGetInt performs an ioctl operation which gets an integer value -// from fd, using the specified request number. -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return value, err -} - -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { - var value Winsize - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - -func IoctlGetTermios(fd int, req uint) (*Termios, error) { - var value Termios - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - // fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX // There is no way to create a custom fcntl and to keep //sys fcntl easily, // Therefore, the programmer must call dup2 instead of fcntl in this case. diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 33c8b5f0..97a8eef6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -63,15 +63,6 @@ func Setgroups(gids []int) (err error) { return setgroups(len(a), &a[0]) } -func ReadDirent(fd int, buf []byte) (n int, err error) { - // Final argument is (basep *uintptr) and the syscall doesn't take nil. - // 64 bits should be enough. (32 bits isn't even on 386). Since the - // actual system call is getdirentries64, 64 is a good guess. - // TODO(rsc): Can we use a single global basep for all calls? - var base = (*uintptr)(unsafe.Pointer(new(uint64))) - return Getdirentries(fd, buf, base) -} - // Wait status is 7 bits at bottom, either 0 (exited), // 0x7F (stopped), or a signal number that caused an exit. // The 0x80 bit is whether there was a core dump. @@ -86,6 +77,7 @@ const ( shift = 8 exited = 0 + killed = 9 stopped = 0x7F ) @@ -112,6 +104,8 @@ func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } +func (w WaitStatus) Killed() bool { return w&mask == killed && syscall.Signal(w>>shift) != SIGKILL } + func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } func (w WaitStatus) StopSignal() syscall.Signal { diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 21200918..f26a19eb 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -77,7 +77,18 @@ func nametomib(name string) (mib []_C_int, err error) { return buf[0 : n/siz], nil } -//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) +} + func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } @@ -328,43 +339,6 @@ func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(sig //sys ioctl(fd int, req uint, arg uintptr) (err error) -// ioctl itself should not be exposed directly, but additional get/set -// functions for specific types are permissible. - -// IoctlSetInt performs an ioctl operation which sets an integer value -// on fd, using the specified request number. -func IoctlSetInt(fd int, req uint, value int) error { - return ioctl(fd, req, uintptr(value)) -} - -func ioctlSetWinsize(fd int, req uint, value *Winsize) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -func ioctlSetTermios(fd int, req uint, value *Termios) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -// IoctlGetInt performs an ioctl operation which gets an integer value -// from fd, using the specified request number. -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return value, err -} - -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { - var value Winsize - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - -func IoctlGetTermios(fd int, req uint) (*Termios, error) { - var value Termios - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - func Uname(uname *Utsname) error { mib := []_C_int{CTL_KERN, KERN_OSTYPE} n := unsafe.Sizeof(uname.Sysname) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go index 489726fa..cd8be182 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go @@ -10,6 +10,8 @@ import ( "syscall" ) +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) + func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go index 914b89bd..d0d07243 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -10,6 +10,8 @@ import ( "syscall" ) +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) + func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go index 4a284cf5..01e8a38a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go @@ -8,6 +8,10 @@ import ( "syscall" ) +func ptrace(request int, pid int, addr uintptr, data uintptr) error { + return ENOTSUP +} + func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: int32(sec), Nsec: int32(nsec)} } diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go index 52dcd88f..e674f81d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -10,6 +10,10 @@ import ( "syscall" ) +func ptrace(request int, pid int, addr uintptr, data uintptr) error { + return ENOTSUP +} + func setTimespec(sec, nsec int64) Timespec { return Timespec{Sec: sec, Nsec: nsec} } diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index 962eee30..474181c0 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -57,6 +57,22 @@ func nametomib(name string) (mib []_C_int, err error) { return buf[0 : n/siz], nil } +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + namlen, ok := direntNamlen(buf) + if !ok { + return 0, false + } + return (16 + namlen + 1 + 7) &^ 7, true +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) +} + //sysnb pipe() (r int, w int, err error) func Pipe(p []int) (err error) { @@ -134,43 +150,6 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { //sys ioctl(fd int, req uint, arg uintptr) (err error) -// ioctl itself should not be exposed directly, but additional get/set -// functions for specific types are permissible. - -// IoctlSetInt performs an ioctl operation which sets an integer value -// on fd, using the specified request number. -func IoctlSetInt(fd int, req uint, value int) error { - return ioctl(fd, req, uintptr(value)) -} - -func ioctlSetWinsize(fd int, req uint, value *Winsize) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -func ioctlSetTermios(fd int, req uint, value *Termios) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -// IoctlGetInt performs an ioctl operation which gets an integer value -// from fd, using the specified request number. -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return value, err -} - -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { - var value Winsize - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - -func IoctlGetTermios(fd int, req uint) (*Termios, error) { - var value Termios - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error { err := sysctl(mib, old, oldlen, nil, 0) if err != nil { @@ -269,6 +248,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Fstatfs(fd int, stat *Statfs_t) (err error) //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) +//sys Getdents(fd int, buf []byte) (n int, err error) //sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) //sys Getdtablesize() (size int) //sysnb Getegid() (egid int) diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index f135812a..d95c4436 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -82,6 +82,18 @@ func nametomib(name string) (mib []_C_int, err error) { return buf[0 : n/siz], nil } +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) +} + func Pipe(p []int) (err error) { return Pipe2(p, 0) } @@ -189,43 +201,6 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { //sys ioctl(fd int, req uint, arg uintptr) (err error) -// ioctl itself should not be exposed directly, but additional get/set -// functions for specific types are permissible. - -// IoctlSetInt performs an ioctl operation which sets an integer value -// on fd, using the specified request number. -func IoctlSetInt(fd int, req uint, value int) error { - return ioctl(fd, req, uintptr(value)) -} - -func ioctlSetWinsize(fd int, req uint, value *Winsize) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -func ioctlSetTermios(fd int, req uint, value *Termios) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -// IoctlGetInt performs an ioctl operation which gets an integer value -// from fd, using the specified request number. -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return value, err -} - -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { - var value Winsize - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - -func IoctlGetTermios(fd int, req uint) (*Termios, error) { - var value Termios - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - func Uname(uname *Utsname) error { mib := []_C_int{CTL_KERN, KERN_OSTYPE} n := unsafe.Sizeof(uname.Sysname) @@ -362,7 +337,21 @@ func Getdents(fd int, buf []byte) (n int, err error) { func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { if supportsABI(_ino64First) { - return getdirentries_freebsd12(fd, buf, basep) + if basep == nil || unsafe.Sizeof(*basep) == 8 { + return getdirentries_freebsd12(fd, buf, (*uint64)(unsafe.Pointer(basep))) + } + // The freebsd12 syscall needs a 64-bit base. On 32-bit machines + // we can't just use the basep passed in. See #32498. + var base uint64 = uint64(*basep) + n, err = getdirentries_freebsd12(fd, buf, &base) + *basep = uintptr(base) + if base>>32 != 0 { + // We can't stuff the base back into a uintptr, so any + // future calls would be suspect. Generate an error. + // EIO is allowed by getdirentries. + err = EIO + } + return } // The old syscall entries are smaller than the new. Use 1/4 of the original @@ -507,6 +496,70 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e return sendfile(outfd, infd, offset, count) } +//sys ptrace(request int, pid int, addr uintptr, data int) (err error) + +func PtraceAttach(pid int) (err error) { + return ptrace(PTRACE_ATTACH, pid, 0, 0) +} + +func PtraceCont(pid int, signal int) (err error) { + return ptrace(PTRACE_CONT, pid, 1, signal) +} + +func PtraceDetach(pid int) (err error) { + return ptrace(PTRACE_DETACH, pid, 1, 0) +} + +func PtraceGetFpRegs(pid int, fpregsout *FpReg) (err error) { + return ptrace(PTRACE_GETFPREGS, pid, uintptr(unsafe.Pointer(fpregsout)), 0) +} + +func PtraceGetFsBase(pid int, fsbase *int64) (err error) { + return ptrace(PTRACE_GETFSBASE, pid, uintptr(unsafe.Pointer(fsbase)), 0) +} + +func PtraceGetRegs(pid int, regsout *Reg) (err error) { + return ptrace(PTRACE_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0) +} + +func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { + ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint(countin)} + err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + return int(ioDesc.Len), err +} + +func PtraceLwpEvents(pid int, enable int) (err error) { + return ptrace(PTRACE_LWPEVENTS, pid, 0, enable) +} + +func PtraceLwpInfo(pid int, info uintptr) (err error) { + return ptrace(PTRACE_LWPINFO, pid, info, int(unsafe.Sizeof(PtraceLwpInfoStruct{}))) +} + +func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { + return PtraceIO(PIOD_READ_D, pid, addr, out, SizeofLong) +} + +func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) { + return PtraceIO(PIOD_READ_I, pid, addr, out, SizeofLong) +} + +func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) { + return PtraceIO(PIOD_WRITE_D, pid, addr, data, SizeofLong) +} + +func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { + return PtraceIO(PIOD_WRITE_I, pid, addr, data, SizeofLong) +} + +func PtraceSetRegs(pid int, regs *Reg) (err error) { + return ptrace(PTRACE_SETREGS, pid, uintptr(unsafe.Pointer(regs)), 0) +} + +func PtraceSingleStep(pid int) (err error) { + return ptrace(PTRACE_SINGLESTEP, pid, 1, 0) +} + /* * Exposed directly */ @@ -555,7 +608,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) //sys getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) -//sys getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) //sys Getdtablesize() (size int) //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index c92545ea..fe30b954 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -13,7 +13,6 @@ package unix import ( "encoding/binary" - "net" "runtime" "syscall" "unsafe" @@ -72,6 +71,17 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { // ioctl itself should not be exposed directly, but additional get/set // functions for specific types are permissible. +// IoctlRetInt performs an ioctl operation specified by req on a device +// associated with opened file descriptor fd, and returns a non-negative +// integer that is returned by the ioctl syscall. +func IoctlRetInt(fd int, req uint) (int, error) { + ret, _, err := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), 0) + if err != 0 { + return 0, err + } + return int(ret), nil +} + // IoctlSetPointerInt performs an ioctl operation which sets an // integer value on fd, using the specified request number. The ioctl // argument is called with a pointer to the integer value, rather than @@ -81,52 +91,18 @@ func IoctlSetPointerInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(unsafe.Pointer(&v))) } -// IoctlSetInt performs an ioctl operation which sets an integer value -// on fd, using the specified request number. -func IoctlSetInt(fd int, req uint, value int) error { - return ioctl(fd, req, uintptr(value)) -} - -func ioctlSetWinsize(fd int, req uint, value *Winsize) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -func ioctlSetTermios(fd int, req uint, value *Termios) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - func IoctlSetRTCTime(fd int, value *RTCTime) error { err := ioctl(fd, RTC_SET_TIME, uintptr(unsafe.Pointer(value))) runtime.KeepAlive(value) return err } -// IoctlGetInt performs an ioctl operation which gets an integer value -// from fd, using the specified request number. -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return value, err -} - func IoctlGetUint32(fd int, req uint) (uint32, error) { var value uint32 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) return value, err } -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { - var value Winsize - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - -func IoctlGetTermios(fd int, req uint) (*Termios, error) { - var value Termios - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - func IoctlGetRTCTime(fd int) (*RTCTime, error) { var value RTCTime err := ioctl(fd, RTC_RD_TIME, uintptr(unsafe.Pointer(&value))) @@ -765,7 +741,7 @@ const px_proto_oe = 0 type SockaddrPPPoE struct { SID uint16 - Remote net.HardwareAddr + Remote []byte Dev string raw RawSockaddrPPPoX } @@ -916,7 +892,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { } sa := &SockaddrPPPoE{ SID: binary.BigEndian.Uint16(pp[6:8]), - Remote: net.HardwareAddr(pp[8:14]), + Remote: pp[8:14], } for i := 14; i < 14+IFNAMSIZ; i++ { if pp[i] == 0 { @@ -1414,8 +1390,20 @@ func Reboot(cmd int) (err error) { return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "") } -func ReadDirent(fd int, buf []byte) (n int, err error) { - return Getdents(fd, buf) +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + reclen, ok := direntReclen(buf) + if !ok { + return 0, false + } + return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true } //sys mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) @@ -1450,6 +1438,8 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Acct(path string) (err error) //sys AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) //sys Adjtimex(buf *Timex) (state int, err error) +//sys Capget(hdr *CapUserHeader, data *CapUserData) (err error) +//sys Capset(hdr *CapUserHeader, data *CapUserData) (err error) //sys Chdir(path string) (err error) //sys Chroot(path string) (err error) //sys ClockGetres(clockid int32, res *Timespec) (err error) @@ -1755,8 +1745,6 @@ func OpenByHandleAt(mountFD int, handle FileHandle, flags int) (fd int, err erro // Alarm // ArchPrctl // Brk -// Capget -// Capset // ClockNanosleep // ClockSettime // Clone diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 5240e16e..7f9812b4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -94,6 +94,18 @@ func nametomib(name string) (mib []_C_int, err error) { return mib, nil } +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) +} + func SysctlClockinfo(name string) (*Clockinfo, error) { mib, err := sysctlmib(name) if err != nil { @@ -120,9 +132,30 @@ func Pipe(p []int) (err error) { return } -//sys getdents(fd int, buf []byte) (n int, err error) +//sys Getdents(fd int, buf []byte) (n int, err error) func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - return getdents(fd, buf) + n, err = Getdents(fd, buf) + if err != nil || basep == nil { + return + } + + var off int64 + off, err = Seek(fd, 0, 1 /* SEEK_CUR */) + if err != nil { + *basep = ^uintptr(0) + return + } + *basep = uintptr(off) + if unsafe.Sizeof(*basep) == 8 { + return + } + if off>>32 != 0 { + // We can't stuff the offset back into a uintptr, so any + // future calls would be suspect. Generate an error. + // EIO is allowed by getdirentries. + err = EIO + } + return } const ImplementsGetwd = true @@ -154,43 +187,6 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { //sys ioctl(fd int, req uint, arg uintptr) (err error) -// ioctl itself should not be exposed directly, but additional get/set -// functions for specific types are permissible. - -// IoctlSetInt performs an ioctl operation which sets an integer value -// on fd, using the specified request number. -func IoctlSetInt(fd int, req uint, value int) error { - return ioctl(fd, req, uintptr(value)) -} - -func ioctlSetWinsize(fd int, req uint, value *Winsize) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -func ioctlSetTermios(fd int, req uint, value *Termios) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -// IoctlGetInt performs an ioctl operation which gets an integer value -// from fd, using the specified request number. -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return value, err -} - -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { - var value Winsize - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - -func IoctlGetTermios(fd int, req uint) (*Termios, error) { - var value Termios - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - func IoctlGetPtmget(fd int, req uint) (*Ptmget, error) { var value Ptmget err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index c8648ec0..9a26768f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -43,6 +43,18 @@ func nametomib(name string) (mib []_C_int, err error) { return nil, EINVAL } +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) +} + func SysctlClockinfo(name string) (*Clockinfo, error) { mib, err := sysctlmib(name) if err != nil { @@ -89,9 +101,30 @@ func Pipe(p []int) (err error) { return } -//sys getdents(fd int, buf []byte) (n int, err error) +//sys Getdents(fd int, buf []byte) (n int, err error) func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - return getdents(fd, buf) + n, err = Getdents(fd, buf) + if err != nil || basep == nil { + return + } + + var off int64 + off, err = Seek(fd, 0, 1 /* SEEK_CUR */) + if err != nil { + *basep = ^uintptr(0) + return + } + *basep = uintptr(off) + if unsafe.Sizeof(*basep) == 8 { + return + } + if off>>32 != 0 { + // We can't stuff the offset back into a uintptr, so any + // future calls would be suspect. Generate an error. + // EIO was allowed by getdirentries. + err = EIO + } + return } const ImplementsGetwd = true @@ -145,43 +178,6 @@ func setattrlistTimes(path string, times []Timespec, flags int) error { //sys ioctl(fd int, req uint, arg uintptr) (err error) -// ioctl itself should not be exposed directly, but additional get/set -// functions for specific types are permissible. - -// IoctlSetInt performs an ioctl operation which sets an integer value -// on fd, using the specified request number. -func IoctlSetInt(fd int, req uint, value int) error { - return ioctl(fd, req, uintptr(value)) -} - -func ioctlSetWinsize(fd int, req uint, value *Winsize) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -func ioctlSetTermios(fd int, req uint, value *Termios) error { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -// IoctlGetInt performs an ioctl operation which gets an integer value -// from fd, using the specified request number. -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return value, err -} - -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { - var value Winsize - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - -func IoctlGetTermios(fd int, req uint) (*Termios, error) { - var value Termios - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - //sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index e4780127..1610f551 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -35,6 +35,22 @@ type SockaddrDatalink struct { raw RawSockaddrDatalink } +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + reclen, ok := direntReclen(buf) + if !ok { + return 0, false + } + return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true +} + //sysnb pipe(p *[2]_C_int) (n int, err error) func Pipe(p []int) (err error) { @@ -189,6 +205,7 @@ func Setgroups(gids []int) (err error) { return setgroups(len(a), &a[0]) } +// ReadDirent reads directory entries from fd and writes them into buf. func ReadDirent(fd int, buf []byte) (n int, err error) { // Final argument is (basep *uintptr) and the syscall doesn't take nil. // TODO(rsc): Can we use a single global basep for all calls? @@ -536,40 +553,10 @@ func Minor(dev uint64) uint32 { //sys ioctl(fd int, req uint, arg uintptr) (err error) -func IoctlSetInt(fd int, req uint, value int) (err error) { - return ioctl(fd, req, uintptr(value)) -} - -func ioctlSetWinsize(fd int, req uint, value *Winsize) (err error) { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - -func ioctlSetTermios(fd int, req uint, value *Termios) (err error) { - return ioctl(fd, req, uintptr(unsafe.Pointer(value))) -} - func IoctlSetTermio(fd int, req uint, value *Termio) (err error) { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlGetInt(fd int, req uint) (int, error) { - var value int - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return value, err -} - -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { - var value Winsize - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - -func IoctlGetTermios(fd int, req uint) (*Termios, error) { - var value Termios - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) - return &value, err -} - func IoctlGetTermio(fd int, req uint) (*Termio, error) { var value Termio err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) diff --git a/vendor/golang.org/x/sys/unix/types_aix.go b/vendor/golang.org/x/sys/unix/types_aix.go deleted file mode 100644 index 40d2beed..00000000 --- a/vendor/golang.org/x/sys/unix/types_aix.go +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore -// +build aix - -/* -Input to cgo -godefs. See also mkerrors.sh and mkall.sh -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - - -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong - PathMax = C.PATH_MAX -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -type off64 C.off64_t -type off C.off_t -type Mode_t C.mode_t - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -type Timex C.struct_timex - -type Time_t C.time_t - -type Tms C.struct_tms - -type Utimbuf C.struct_utimbuf - -type Timezone C.struct_timezone - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit64 - -type Pid_t C.pid_t - -type _Gid_t C.gid_t - -type dev_t C.dev_t - -// Files - -type Stat_t C.struct_stat - -type StatxTimestamp C.struct_statx_timestamp - -type Statx_t C.struct_statx - -type Dirent C.struct_dirent - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Cmsghdr C.struct_cmsghdr - -type ICMPv6Filter C.struct_icmp6_filter - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type Linger C.struct_linger - -type Msghdr C.struct_msghdr - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr -) - -type IfMsgHdr C.struct_if_msghdr - -// Misc - -type FdSet C.fd_set - -type Utsname C.struct_utsname - -type Ustat_t C.struct_ustat - -type Sigset_t C.sigset_t - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// Terminal handling - -type Termios C.struct_termios - -type Termio C.struct_termio - -type Winsize C.struct_winsize - -//poll - -type PollFd struct { - Fd int32 - Events uint16 - Revents uint16 -} - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -//flock_t - -type Flock_t C.struct_flock64 - -// Statfs - -type Fsid_t C.struct_fsid_t -type Fsid64_t C.struct_fsid64_t - -type Statfs_t C.struct_statfs - -const RNDGETENTCNT = 0x80045200 diff --git a/vendor/golang.org/x/sys/unix/types_darwin.go b/vendor/golang.org/x/sys/unix/types_darwin.go deleted file mode 100644 index 155c2e69..00000000 --- a/vendor/golang.org/x/sys/unix/types_darwin.go +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define __DARWIN_UNIX03 0 -#define KERNEL -#define _DARWIN_USE_64_BIT_INODE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat64 - -type Statfs_t C.struct_statfs64 - -type Flock_t C.struct_flock - -type Fstore_t C.struct_fstore - -type Radvisory_t C.struct_radvisory - -type Fbootstraptransfer_t C.struct_fbootstraptransfer - -type Log2phys_t C.struct_log2phys - -type Fsid C.struct_fsid - -type Dirent C.struct_dirent - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet4Pktinfo C.struct_in_pktinfo - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfmaMsghdr2 C.struct_ifma_msghdr2 - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// uname - -type Utsname C.struct_utsname - -// Clockinfo - -const SizeofClockinfo = C.sizeof_struct_clockinfo - -type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_dragonfly.go b/vendor/golang.org/x/sys/unix/types_dragonfly.go deleted file mode 100644 index 3365dd79..00000000 --- a/vendor/golang.org/x/sys/unix/types_dragonfly.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.struct_fsid - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Uname - -type Utsname C.struct_utsname diff --git a/vendor/golang.org/x/sys/unix/types_freebsd.go b/vendor/golang.org/x/sys/unix/types_freebsd.go deleted file mode 100644 index 74707989..00000000 --- a/vendor/golang.org/x/sys/unix/types_freebsd.go +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define _WANT_FREEBSD11_STAT 1 -#define _WANT_FREEBSD11_STATFS 1 -#define _WANT_FREEBSD11_DIRENT 1 -#define _WANT_FREEBSD11_KEVENT 1 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -// This structure is a duplicate of if_data on FreeBSD 8-STABLE. -// See /usr/include/net/if.h. -struct if_data8 { - u_char ifi_type; - u_char ifi_physical; - u_char ifi_addrlen; - u_char ifi_hdrlen; - u_char ifi_link_state; - u_char ifi_spare_char1; - u_char ifi_spare_char2; - u_char ifi_datalen; - u_long ifi_mtu; - u_long ifi_metric; - u_long ifi_baudrate; - u_long ifi_ipackets; - u_long ifi_ierrors; - u_long ifi_opackets; - u_long ifi_oerrors; - u_long ifi_collisions; - u_long ifi_ibytes; - u_long ifi_obytes; - u_long ifi_imcasts; - u_long ifi_omcasts; - u_long ifi_iqdrops; - u_long ifi_noproto; - u_long ifi_hwassist; -// FIXME: these are now unions, so maybe need to change definitions? -#undef ifi_epoch - time_t ifi_epoch; -#undef ifi_lastchange - struct timeval ifi_lastchange; -}; - -// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. -// See /usr/include/net/if.h. -struct if_msghdr8 { - u_short ifm_msglen; - u_char ifm_version; - u_char ifm_type; - int ifm_addrs; - int ifm_flags; - u_short ifm_index; - struct if_data8 ifm_data; -}; -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -const ( - _statfsVersion = C.STATFS_VERSION - _dirblksiz = C.DIRBLKSIZ -) - -type Stat_t C.struct_stat - -type stat_freebsd11_t C.struct_freebsd11_stat - -type Statfs_t C.struct_statfs - -type statfs_freebsd11_t C.struct_freebsd11_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type dirent_freebsd11 C.struct_freebsd11_dirent - -type Fsid C.struct_fsid - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Advice to Fadvise - -const ( - FADV_NORMAL = C.POSIX_FADV_NORMAL - FADV_RANDOM = C.POSIX_FADV_RANDOM - FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL - FADV_WILLNEED = C.POSIX_FADV_WILLNEED - FADV_DONTNEED = C.POSIX_FADV_DONTNEED - FADV_NOREUSE = C.POSIX_FADV_NOREUSE -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPMreqn C.struct_ip_mreqn - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPMreqn = C.sizeof_struct_ip_mreqn - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent_freebsd11 - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - sizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 - sizeofIfData = C.sizeof_struct_if_data - SizeofIfData = C.sizeof_struct_if_data8 - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type ifMsghdr C.struct_if_msghdr - -type IfMsghdr C.struct_if_msghdr8 - -type ifData C.struct_if_data - -type IfData C.struct_if_data8 - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr - SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfZbuf C.struct_bpf_zbuf - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfZbufHeader C.struct_bpf_zbuf_header - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLINIGNEOF = C.POLLINIGNEOF - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Capabilities - -type CapRights C.struct_cap_rights - -// Uname - -type Utsname C.struct_utsname diff --git a/vendor/golang.org/x/sys/unix/types_netbsd.go b/vendor/golang.org/x/sys/unix/types_netbsd.go deleted file mode 100644 index 2dd4f954..00000000 --- a/vendor/golang.org/x/sys/unix/types_netbsd.go +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.fsid_t - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Advice to Fadvise - -const ( - FADV_NORMAL = C.POSIX_FADV_NORMAL - FADV_RANDOM = C.POSIX_FADV_RANDOM - FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL - FADV_WILLNEED = C.POSIX_FADV_WILLNEED - FADV_DONTNEED = C.POSIX_FADV_DONTNEED - FADV_NOREUSE = C.POSIX_FADV_NOREUSE -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -type Mclpool C.struct_mclpool - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfTimeval C.struct_bpf_timeval - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -type Ptmget C.struct_ptmget - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Sysctl - -type Sysctlnode C.struct_sysctlnode - -// Uname - -type Utsname C.struct_utsname - -// Clockinfo - -const SizeofClockinfo = C.sizeof_struct_clockinfo - -type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_openbsd.go b/vendor/golang.org/x/sys/unix/types_openbsd.go deleted file mode 100644 index 8aafbe44..00000000 --- a/vendor/golang.org/x/sys/unix/types_openbsd.go +++ /dev/null @@ -1,282 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.fsid_t - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -type Mclpool C.struct_mclpool - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfTimeval C.struct_bpf_timeval - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Signal Sets - -type Sigset_t C.sigset_t - -// Uname - -type Utsname C.struct_utsname - -// Uvmexp - -const SizeofUvmexp = C.sizeof_struct_uvmexp - -type Uvmexp C.struct_uvmexp - -// Clockinfo - -const SizeofClockinfo = C.sizeof_struct_clockinfo - -type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_solaris.go b/vendor/golang.org/x/sys/unix/types_solaris.go deleted file mode 100644 index 2b716f93..00000000 --- a/vendor/golang.org/x/sys/unix/types_solaris.go +++ /dev/null @@ -1,266 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -// These defines ensure that builds done on newer versions of Solaris are -// backwards-compatible with older versions of Solaris and -// OpenSolaris-based derivatives. -#define __USE_SUNOS_SOCKETS__ // msghdr -#define __USE_LEGACY_PROTOTYPES__ // iovec -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong - PathMax = C.PATH_MAX - MaxHostNameLen = C.MAXHOSTNAMELEN -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -type Tms C.struct_tms - -type Utimbuf C.struct_utimbuf - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -// Filesystems - -type _Fsblkcnt_t C.fsblkcnt_t - -type Statvfs_t C.struct_statvfs - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Select - -type FdSet C.fd_set - -// Misc - -type Utsname C.struct_utsname - -type Ustat_t C.struct_ustat - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_EACCESS = C.AT_EACCESS -) - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfTimeval C.struct_bpf_timeval - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios - -type Termio C.struct_termio - -type Winsize C.struct_winsize - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 881e69f1..2839b3df 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -669,6 +722,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -934,6 +988,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1096,6 +1151,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1339,6 +1408,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1958,6 +2031,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b @@ -2165,6 +2242,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2384,6 +2462,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x400854d5 TUNDETACHFILTER = 0x400854d6 + TUNGETDEVNETNS = 0x54e3 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x800854db TUNGETIFF = 0x800454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 039b007d..99e3a3de 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -669,6 +722,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -934,6 +988,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1096,6 +1151,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1339,6 +1408,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1959,6 +2032,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b @@ -2166,6 +2243,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2385,6 +2463,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 + TUNGETDEVNETNS = 0x54e3 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x801054db TUNGETIFF = 0x800454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index 97ed569a..f5f5ee56 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -668,6 +721,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -933,6 +987,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1095,6 +1150,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1337,6 +1406,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1965,6 +2038,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b @@ -2172,6 +2249,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2391,6 +2469,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x400854d5 TUNDETACHFILTER = 0x400854d6 + TUNGETDEVNETNS = 0x54e3 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x800854db TUNGETIFF = 0x800454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index d47f3ba6..64573bdb 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -489,6 +541,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -671,6 +724,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -936,6 +990,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1098,6 +1153,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1340,6 +1409,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1949,6 +2022,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b @@ -2157,6 +2234,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2376,6 +2454,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 + TUNGETDEVNETNS = 0x54e3 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x801054db TUNGETIFF = 0x800454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 0ae030ee..3e948be3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -668,6 +721,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -933,6 +987,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1095,6 +1150,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1337,6 +1406,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1958,6 +2031,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x467f SIOCOUTQ = 0x7472 SIOCOUTQNSD = 0x894b @@ -2166,6 +2243,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2386,6 +2464,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x800854d5 TUNDETACHFILTER = 0x800854d6 + TUNGETDEVNETNS = 0x200054e3 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x400854db TUNGETIFF = 0x400454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 91b49ddd..8ac128bb 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -668,6 +721,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -933,6 +987,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1095,6 +1150,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1337,6 +1406,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1958,6 +2031,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x467f SIOCOUTQ = 0x7472 SIOCOUTQNSD = 0x894b @@ -2166,6 +2243,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2386,6 +2464,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x801054d5 TUNDETACHFILTER = 0x801054d6 + TUNGETDEVNETNS = 0x200054e3 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x401054db TUNGETIFF = 0x400454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 7f1ef04e..e8845a7d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -668,6 +721,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -933,6 +987,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1095,6 +1150,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1337,6 +1406,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1958,6 +2031,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x467f SIOCOUTQ = 0x7472 SIOCOUTQNSD = 0x894b @@ -2166,6 +2243,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2386,6 +2464,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x801054d5 TUNDETACHFILTER = 0x801054d6 + TUNGETDEVNETNS = 0x200054e3 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x401054db TUNGETIFF = 0x400454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 724a244f..338c044e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -668,6 +721,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -933,6 +987,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1095,6 +1150,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1337,6 +1406,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1958,6 +2031,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x467f SIOCOUTQ = 0x7472 SIOCOUTQNSD = 0x894b @@ -2166,6 +2243,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2386,6 +2464,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x800854d5 TUNDETACHFILTER = 0x800854d6 + TUNGETDEVNETNS = 0x200054e3 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x400854db TUNGETIFF = 0x400454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 25044629..a696532f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0xff CBAUDEX = 0x0 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -668,6 +721,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -933,6 +987,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1095,6 +1150,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1338,6 +1407,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80000000 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -2016,6 +2089,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x4004667f SIOCOUTQ = 0x40047473 SIOCOUTQNSD = 0x894b @@ -2223,6 +2300,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2446,6 +2524,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x801054d5 TUNDETACHFILTER = 0x801054d6 + TUNGETDEVNETNS = 0x200054e3 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x401054db TUNGETIFF = 0x400454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index e7c49911..9197b335 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0xff CBAUDEX = 0x0 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -668,6 +721,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -933,6 +987,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1095,6 +1150,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1338,6 +1407,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80000000 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -2016,6 +2089,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x4004667f SIOCOUTQ = 0x40047473 SIOCOUTQNSD = 0x894b @@ -2223,6 +2300,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2446,6 +2524,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x801054d5 TUNDETACHFILTER = 0x801054d6 + TUNGETDEVNETNS = 0x200054e3 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x401054db TUNGETIFF = 0x400454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index 0373d65a..d1e023ed 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -668,6 +721,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -933,6 +987,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1095,6 +1150,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1337,6 +1406,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -1946,6 +2019,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b @@ -2153,6 +2230,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2372,6 +2450,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 + TUNGETDEVNETNS = 0x54e3 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x801054db TUNGETIFF = 0x800454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index b2ed7ee6..1dfacf18 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -196,6 +196,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -217,6 +219,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -238,16 +245,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -290,8 +300,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -334,6 +346,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -372,6 +423,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -488,6 +540,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -668,6 +721,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -933,6 +987,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1095,6 +1150,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1337,6 +1406,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -2019,6 +2092,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x541b SIOCOUTQ = 0x5411 SIOCOUTQNSD = 0x894b @@ -2226,6 +2303,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2445,6 +2523,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 + TUNGETDEVNETNS = 0x54e3 TUNGETFEATURES = 0x800454cf TUNGETFILTER = 0x801054db TUNGETIFF = 0x800454d2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 58067c52..b78e49fc 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -199,6 +199,8 @@ const ( BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_ALU = 0x4 BPF_ALU64 = 0x7 BPF_AND = 0x50 @@ -220,6 +222,11 @@ const ( BPF_FROM_BE = 0x8 BPF_FROM_LE = 0x0 BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 BPF_F_ALLOW_MULTI = 0x2 BPF_F_ALLOW_OVERRIDE = 0x1 BPF_F_ANY_ALIGNMENT = 0x2 @@ -241,16 +248,19 @@ const ( BPF_F_PSEUDO_HDR = 0x10 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 BPF_F_RECOMPUTE_CSUM = 0x1 BPF_F_REUSE_STACKID = 0x400 BPF_F_SEQ_NUMBER = 0x8 BPF_F_SKIP_FIELD_MASK = 0xff BPF_F_STACK_BUILD_ID = 0x20 BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 BPF_F_TUNINFO_IPV6 = 0x1 BPF_F_USER_BUILD_ID = 0x800 BPF_F_USER_STACK = 0x100 BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_ZERO_SEED = 0x40 BPF_H = 0x8 @@ -293,8 +303,10 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7 BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 @@ -337,6 +349,45 @@ const ( CAN_SFF_MASK = 0x7ff CAN_TP16 = 0x3 CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 CBAUD = 0x100f CBAUDEX = 0x1000 CFLUSH = 0xf @@ -375,6 +426,7 @@ const ( CLONE_NEWUTS = 0x4000000 CLONE_PARENT = 0x8000 CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 CLONE_PTRACE = 0x2000 CLONE_SETTLS = 0x80000 CLONE_SIGHAND = 0x800 @@ -492,6 +544,7 @@ const ( ETH_P_DNA_RC = 0x6002 ETH_P_DNA_RT = 0x6003 ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb ETH_P_ECONET = 0x18 ETH_P_EDSA = 0xdada ETH_P_ERSPAN = 0x88be @@ -672,6 +725,7 @@ const ( F_OFD_SETLKW = 0x26 F_OK = 0x0 F_RDLCK = 0x1 + F_SEAL_FUTURE_WRITE = 0x10 F_SEAL_GROW = 0x4 F_SEAL_SEAL = 0x1 F_SEAL_SHRINK = 0x2 @@ -937,6 +991,7 @@ const ( IPV6_RECVRTHDR = 0x38 IPV6_RECVTCLASS = 0x42 IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e IPV6_RTHDR = 0x39 IPV6_RTHDRDSTOPTS = 0x37 IPV6_RTHDR_LOOSE = 0x0 @@ -1099,6 +1154,20 @@ const ( LOCK_NB = 0x4 LOCK_SH = 0x1 LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 MADV_DODUMP = 0x11 MADV_DOFORK = 0xb MADV_DONTDUMP = 0x10 @@ -1341,6 +1410,10 @@ const ( NLM_F_ROOT = 0x100 NOFLSH = 0x80 NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 OCFS2_SUPER_MAGIC = 0x7461636f OCRNL = 0x8 OFDEL = 0x80 @@ -2011,6 +2084,10 @@ const ( SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 SIOCINQ = 0x4004667f SIOCOUTQ = 0x40047473 SIOCOUTQNSD = 0x894b @@ -2218,6 +2295,7 @@ const ( SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 SYSFS_MAGIC = 0x62656572 S_BLKSIZE = 0x200 S_IEXEC = 0x40 @@ -2434,6 +2512,7 @@ const ( TS_COMM_LEN = 0x20 TUNATTACHFILTER = 0x801054d5 TUNDETACHFILTER = 0x801054d6 + TUNGETDEVNETNS = 0x200054e3 TUNGETFEATURES = 0x400454cf TUNGETFILTER = 0x401054db TUNGETIFF = 0x400454d2 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go index c4ec7ff8..dd5ea36e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go @@ -377,16 +377,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := Syscall6(SYS_GETATTRLIST, uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -1691,6 +1681,16 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) sec = int32(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go index 23346dc6..78ca9233 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -527,21 +527,6 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_ptrace_trampoline() - -//go:linkname libc_ptrace libc_ptrace -//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_getattrlist_trampoline), uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -2341,6 +2326,21 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_ptrace_trampoline() + +//go:linkname libc_ptrace libc_ptrace +//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { r0, r1, e1 := syscall_rawSyscall(funcPC(libc_gettimeofday_trampoline), uintptr(unsafe.Pointer(tp)), 0, 0) sec = int32(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s index 37b85b4f..f40465ca 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s @@ -64,8 +64,6 @@ TEXT ·libc_munlock_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) TEXT ·libc_munlockall_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) -TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 - JMP libc_ptrace(SB) TEXT ·libc_getattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_getattrlist(SB) TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0 @@ -264,6 +262,8 @@ TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_munmap(SB) +TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 + JMP libc_ptrace(SB) TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0 JMP libc_gettimeofday(SB) TEXT ·libc_fstat64_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index c142e33e..64df03c4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -527,21 +527,6 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_ptrace_trampoline() - -//go:linkname libc_ptrace libc_ptrace -//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_getattrlist_trampoline), uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { @@ -2356,6 +2341,21 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_ptrace_trampoline() + +//go:linkname libc_ptrace libc_ptrace +//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { r0, r1, e1 := syscall_rawSyscall(funcPC(libc_gettimeofday_trampoline), uintptr(unsafe.Pointer(tp)), 0, 0) sec = int64(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index 1a391519..debcb8ed 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -64,8 +64,6 @@ TEXT ·libc_munlock_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) TEXT ·libc_munlockall_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) -TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 - JMP libc_ptrace(SB) TEXT ·libc_getattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_getattrlist(SB) TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0 @@ -266,6 +264,8 @@ TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_munmap(SB) +TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 + JMP libc_ptrace(SB) TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0 JMP libc_gettimeofday(SB) TEXT ·libc_fstat64_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go index 01cffbf4..ed330623 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -527,21 +527,6 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_ptrace_trampoline() - -//go:linkname libc_ptrace libc_ptrace -//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_getattrlist_trampoline), uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s index 994056f3..66af9f48 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s @@ -64,8 +64,6 @@ TEXT ·libc_munlock_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) TEXT ·libc_munlockall_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) -TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 - JMP libc_ptrace(SB) TEXT ·libc_getattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_getattrlist(SB) TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index 8f2691de..5258a732 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -527,21 +527,6 @@ func libc_munlockall_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { - _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_ptrace_trampoline() - -//go:linkname libc_ptrace libc_ptrace -//go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_getattrlist_trampoline), uintptr(unsafe.Pointer(path)), uintptr(list), uintptr(buf), uintptr(size), uintptr(options), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index 61dc0d4c..f57f48f8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -64,8 +64,6 @@ TEXT ·libc_munlock_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) TEXT ·libc_munlockall_trampoline(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) -TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 - JMP libc_ptrace(SB) TEXT ·libc_getattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_getattrlist(SB) TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index ae9f1a21..cdfe9318 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -749,6 +749,23 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index 80903e47..a783306b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -387,6 +387,16 @@ func pipe2(p *[2]_C_int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data int) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { @@ -1019,7 +1029,7 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index cd250ff0..f995520d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -387,6 +387,16 @@ func pipe2(p *[2]_C_int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data int) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { @@ -1019,7 +1029,7 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index 290a9c2c..d681acd4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -387,6 +387,16 @@ func pipe2(p *[2]_C_int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data int) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getcwd(buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { @@ -1019,7 +1029,7 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index c6df9d2e..5049b2ed 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -404,6 +404,16 @@ func Getcwd(buf []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ptrace(request int, pid int, addr uintptr, data int) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -1019,7 +1029,7 @@ func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { +func getdirentries_freebsd12(fd int, buf []byte, basep *uint64) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index 81d90a27..c5e46e4c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 0c184586..da8819e4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 18ef8a62..6ad9be6d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index 2fba25d0..f8833178 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index c330f4ff..8eebc6c7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index 8e9e0098..ecf62a67 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index c22d6260..1ba0f7b6 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index 700a99e9..20012b2f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index cec4c106..2b520dea 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 677ef5a6..d9f044c9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 565034c5..9feed65e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 7feb2c6b..0a651508 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index 07655c45..e27f6693 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -408,6 +408,26 @@ func Adjtimex(buf *Timex) (state int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Capget(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Capset(hdr *CapUserHeader, data *CapUserData) (err error) { + _, _, e1 := Syscall(SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Chdir(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 642db767..7e058266 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -389,7 +389,7 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index 59585fee..d94d076a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -389,7 +389,7 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index 6ec31434..cf5bf3d0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -389,7 +389,7 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 603d1443..243a9317 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -389,7 +389,7 @@ func pipe() (fd1 int, fd2 int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 6a489fac..a9532d07 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -387,7 +387,7 @@ func pipe(p *[2]_C_int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 30cba434..0cb9f017 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -387,7 +387,7 @@ func pipe(p *[2]_C_int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index fa1beda3..6fc99b54 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -387,7 +387,7 @@ func pipe(p *[2]_C_int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index eb589904..27878a72 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -387,7 +387,7 @@ func pipe(p *[2]_C_int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func getdents(fd int, buf []byte) (n int, err error) { +func Getdents(fd int, buf []byte) (n int, err error) { var _p0 unsafe.Pointer if len(buf) > 0 { _p0 = unsafe.Pointer(&buf[0]) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go index 55c3a329..9474974b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,freebsd @@ -118,8 +118,6 @@ const ( SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); } SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); } SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); } - SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, size_t nbyte, int pad, off_t offset); } - SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, const void *buf, size_t nbyte, int pad, off_t offset); } SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } @@ -133,10 +131,6 @@ const ( SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } - SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, size_t len, int prot, int flags, int fd, int pad, off_t pos); } - SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, off_t offset, int whence); } - SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, off_t length); } - SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, off_t length); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -164,6 +158,7 @@ const ( SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } @@ -197,13 +192,10 @@ const ( SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } - SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } - SYS_OAIO_READ = 318 // { int oaio_read(struct oaiocb *aiocbp); } - SYS_OAIO_WRITE = 319 // { int oaio_write(struct oaiocb *aiocbp); } - SYS_OLIO_LISTIO = 320 // { int olio_listio(int mode, struct oaiocb * const *acb_list, int nent, struct osigevent *sig); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } @@ -236,7 +228,7 @@ const ( SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } @@ -258,7 +250,7 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int flags); } + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } @@ -293,8 +285,6 @@ const ( SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } - SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } - SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } @@ -400,4 +390,7 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } + SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } + SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } + SYS_FDATASYNC = 550 // { int fdatasync(int fd); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go index b39be6cb..48a7beae 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,freebsd @@ -118,8 +118,6 @@ const ( SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); } SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); } SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); } - SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, size_t nbyte, int pad, off_t offset); } - SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, const void *buf, size_t nbyte, int pad, off_t offset); } SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } @@ -133,10 +131,6 @@ const ( SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } - SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, size_t len, int prot, int flags, int fd, int pad, off_t pos); } - SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, off_t offset, int whence); } - SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, off_t length); } - SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, off_t length); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -164,6 +158,7 @@ const ( SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } @@ -197,13 +192,10 @@ const ( SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } - SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } - SYS_OAIO_READ = 318 // { int oaio_read(struct oaiocb *aiocbp); } - SYS_OAIO_WRITE = 319 // { int oaio_write(struct oaiocb *aiocbp); } - SYS_OLIO_LISTIO = 320 // { int olio_listio(int mode, struct oaiocb * const *acb_list, int nent, struct osigevent *sig); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } @@ -236,7 +228,7 @@ const ( SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } @@ -258,7 +250,7 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int flags); } + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } @@ -293,8 +285,6 @@ const ( SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } - SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } - SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } @@ -400,4 +390,7 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } + SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } + SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } + SYS_FDATASYNC = 550 // { int fdatasync(int fd); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go index 44ffd4ce..4a6dfd4a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,freebsd @@ -118,8 +118,6 @@ const ( SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); } SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); } SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); } - SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, size_t nbyte, int pad, off_t offset); } - SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, const void *buf, size_t nbyte, int pad, off_t offset); } SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } @@ -133,10 +131,6 @@ const ( SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } - SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, size_t len, int prot, int flags, int fd, int pad, off_t pos); } - SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, off_t offset, int whence); } - SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, off_t length); } - SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, off_t length); } SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } @@ -164,6 +158,7 @@ const ( SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } @@ -197,13 +192,10 @@ const ( SYS_GETSID = 310 // { int getsid(pid_t pid); } SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } - SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } - SYS_OAIO_READ = 318 // { int oaio_read(struct oaiocb *aiocbp); } - SYS_OAIO_WRITE = 319 // { int oaio_write(struct oaiocb *aiocbp); } - SYS_OLIO_LISTIO = 320 // { int olio_listio(int mode, struct oaiocb * const *acb_list, int nent, struct osigevent *sig); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } @@ -236,7 +228,7 @@ const ( SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } - SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } @@ -258,7 +250,7 @@ const ( SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int flags); } + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } @@ -293,8 +285,6 @@ const ( SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } - SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } - SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } @@ -400,4 +390,7 @@ const ( SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } + SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } + SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } + SYS_FDATASYNC = 550 // { int fdatasync(int fd); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go index 9f21e955..3e51af8e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,freebsd @@ -7,13 +7,13 @@ package unix const ( // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int - SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_EXIT = 1 // { void sys_exit(int rval); } exit sys_exit_args void SYS_FORK = 2 // { int fork(void); } - SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ - SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); } SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } SYS_CLOSE = 6 // { int close(int fd); } - SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, struct rusage *rusage); } SYS_LINK = 9 // { int link(char *path, char *link); } SYS_UNLINK = 10 // { int unlink(char *path); } SYS_CHDIR = 12 // { int chdir(char *path); } @@ -21,20 +21,20 @@ const ( SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } SYS_CHMOD = 15 // { int chmod(char *path, int mode); } SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } - SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int SYS_GETPID = 20 // { pid_t getpid(void); } - SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, caddr_t data); } SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } SYS_SETUID = 23 // { int setuid(uid_t uid); } SYS_GETUID = 24 // { uid_t getuid(void); } SYS_GETEUID = 25 // { uid_t geteuid(void); } - SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ - SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ - SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ - SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ - SYS_ACCEPT = 30 // { int accept(int s, \ - SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ - SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, int data); } + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, int flags, struct sockaddr * __restrict from, __socklen_t * __restrict fromlenaddr); } + SYS_ACCEPT = 30 // { int accept(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen); } + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); } + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, struct sockaddr * __restrict asa, __socklen_t * __restrict alen); } SYS_ACCESS = 33 // { int access(char *path, int amode); } SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } @@ -42,56 +42,57 @@ const ( SYS_KILL = 37 // { int kill(int pid, int signum); } SYS_GETPPID = 39 // { pid_t getppid(void); } SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } SYS_GETEGID = 43 // { gid_t getegid(void); } - SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ - SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, size_t offset, u_int scale); } + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, int pid); } SYS_GETGID = 47 // { gid_t getgid(void); } - SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); } SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } SYS_ACCT = 51 // { int acct(char *path); } - SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ - SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); } + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); } SYS_REBOOT = 55 // { int reboot(int opt); } SYS_REVOKE = 56 // { int revoke(char *path); } SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } - SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ - SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ - SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int SYS_CHROOT = 61 // { int chroot(char *path); } - SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } SYS_VFORK = 66 // { int vfork(void); } SYS_SBRK = 69 // { int sbrk(int incr); } SYS_SSTK = 70 // { int sstk(int incr); } - SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise ovadvise_args int SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } - SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ - SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ - SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ - SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ - SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); } SYS_GETPGRP = 81 // { int getpgrp(void); } SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } - SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, struct itimerval *oitv); } SYS_SWAPON = 85 // { int swapon(char *name); } - SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } - SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } SYS_FSYNC = 95 // { int fsync(int fd); } - SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ - SYS_SOCKET = 97 // { int socket(int domain, int type, \ - SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); } + SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); } SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } - SYS_BIND = 104 // { int bind(int s, caddr_t name, \ - SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); } + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, caddr_t val, int valsize); } SYS_LISTEN = 106 // { int listen(int s, int backlog); } - SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ - SYS_GETRUSAGE = 117 // { int getrusage(int who, \ - SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ - SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ - SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ - SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, struct timezone *tzp); } + SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); } + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, caddr_t val, int *avalsize); } + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, struct timezone *tzp); } SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } @@ -99,24 +100,24 @@ const ( SYS_RENAME = 128 // { int rename(char *from, char *to); } SYS_FLOCK = 131 // { int flock(int fd, int how); } SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } - SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, int flags, caddr_t to, int tolen); } SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } - SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, int *rsv); } SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } SYS_RMDIR = 137 // { int rmdir(char *path); } - SYS_UTIMES = 138 // { int utimes(char *path, \ - SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); } + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, struct timeval *olddelta); } SYS_SETSID = 147 // { int setsid(void); } - SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, caddr_t arg); } SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); } SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); } - SYS_LGETFH = 160 // { int lgetfh(char *fname, \ - SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, struct fhandle *fhp); } + SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); } SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } - SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ - SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, \ - SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, \ - SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, \ + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, struct rtprio *rtp); } + SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, int a4, int a5); } + SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, int a4, int a5, int a6); } + SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, int a4); } SYS_SETFIB = 175 // { int setfib(int fibnum); } SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } SYS_SETGID = 181 // { int setgid(gid_t gid); } @@ -127,269 +128,269 @@ const ( SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } - SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ - SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ - SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ - SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, struct rlimit *rlp); } getrlimit __getrlimit_args int + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, struct rlimit *rlp); } setrlimit __setrlimit_args int + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, u_int count, long *basep); } + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } __sysctl sysctl_args int SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } SYS_UNDELETE = 205 // { int undelete(char *path); } SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } SYS_GETPGID = 207 // { int getpgid(pid_t pid); } - SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ - SYS_SEMGET = 221 // { int semget(key_t key, int nsems, \ - SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, size_t nsops); } SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } - SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, \ - SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, \ - SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, \ + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, int shmflg); } SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } - SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, \ - SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ - SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ - SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ - SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 233 // { int clock_settime( clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, struct sigevent *evp, int *timerid); } SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } - SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ - SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct itimerspec *value); } SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } - SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } - SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ - SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ - SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, \ - SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( struct ffclock_estimate *cest); } + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( struct ffclock_estimate *cest); } + SYS_CLOCK_NANOSLEEP = 244 // { int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,int which, clockid_t *clock_id); } SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } - SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } SYS_RFORK = 251 // { int rfork(int flags); } - SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, int timeout); } SYS_ISSETUGID = 253 // { int issetugid(void); } SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } - SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, \ - SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, size_t count); } SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } - SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } - SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ - SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ - SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ - SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, u_int iovcnt, off_t offset); } + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } SYS_MODNEXT = 300 // { int modnext(int modid); } - SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat *stat); } SYS_MODFNEXT = 302 // { int modfnext(int modid); } SYS_MODFIND = 303 // { int modfind(const char *name); } SYS_KLDLOAD = 304 // { int kldload(const char *file); } SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } SYS_KLDFIND = 306 // { int kldfind(const char *file); } SYS_KLDNEXT = 307 // { int kldnext(int fileid); } - SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } SYS_GETSID = 310 // { int getsid(pid_t pid); } - SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ - SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } SYS_AIO_RETURN = 314 // { ssize_t aio_return(struct aiocb *aiocbp); } - SYS_AIO_SUSPEND = 315 // { int aio_suspend( \ - SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, \ + SYS_AIO_SUSPEND = 315 // { int aio_suspend( struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } SYS_YIELD = 321 // { int yield(void); } SYS_MLOCKALL = 324 // { int mlockall(int how); } SYS_MUNLOCKALL = 325 // { int munlockall(void); } SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } - SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ - SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ - SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } SYS_SCHED_YIELD = 331 // { int sched_yield (void); } SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } - SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); } SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } - SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); } SYS_JAIL = 338 // { int jail(struct jail *jail); } - SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, sigset_t *oset); } SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } - SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ - SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ - SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ - SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ - SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ - SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ - SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ - SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ - SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ - SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ - SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ - SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ - SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ - SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ - SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( \ - SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ - SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout); } + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, siginfo_t *info); } + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, acl_type_t type); } + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); } + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_AIO_WAITCOMPLETE = 359 // { ssize_t aio_waitcomplete( struct aiocb **aiocbp, struct timespec *timeout); } + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } SYS_KQUEUE = 362 // { int kqueue(void); } - SYS_KEVENT = 363 // { int kevent(int fd, \ - SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ - SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ - SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS_KEVENT = 363 // { int kevent(int fd, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } SYS___SETUGID = 374 // { int __setugid(int flag); } SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } - SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, unsigned int iovcnt, int flags); } SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } - SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ - SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ - SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ - SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ - SYS_KENV = 390 // { int kenv(int what, const char *name, \ - SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ - SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ - SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ - SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ - SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ - SYS_STATFS = 396 // { int statfs(char *path, \ + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, struct mac *mac_p); } + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, struct mac *mac_p); } + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, struct mac *mac_p); } + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, struct mac *mac_p); } + SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); } + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, u_long flags); } + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags); } + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, int call, void *arg); } + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, long bufsize, int mode); } + SYS_STATFS = 396 // { int statfs(char *path, struct statfs *buf); } SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } - SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); } - SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, \ - SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, \ + SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, unsigned int value); } + SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, unsigned int value); } SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); } SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); } SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); } - SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ - SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ - SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ - SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ - SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ - SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ - SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ - SYS_SIGACTION = 416 // { int sigaction(int sig, \ - SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, struct mac *mac_p); } + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, struct mac *mac_p); } + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, struct mac *mac_p); } + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( const char *path, int attrnamespace, const char *attrname); } + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, char **envv, struct mac *mac_p); } + SYS_SIGACTION = 416 // { int sigaction(int sig, const struct sigaction *act, struct sigaction *oact); } + SYS_SIGRETURN = 417 // { int sigreturn( const struct __ucontext *sigcntxp); } SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } - SYS_SETCONTEXT = 422 // { int setcontext( \ - SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SETCONTEXT = 422 // { int setcontext( const struct __ucontext *ucp); } + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, const struct __ucontext *ucp); } SYS_SWAPOFF = 424 // { int swapoff(const char *name); } - SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ - SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ - SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ - SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ - SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ - SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, acl_type_t type); } + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); } + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, int *sig); } + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, int flags); } SYS_THR_EXIT = 431 // { void thr_exit(long *state); } SYS_THR_SELF = 432 // { int thr_self(long *id); } SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } - SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ - SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ - SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ - SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, \ - SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, const struct timespec *abstime); } + SYS_THR_SUSPEND = 442 // { int thr_suspend( const struct timespec *timeout); } SYS_THR_WAKE = 443 // { int thr_wake(long id); } SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } - SYS_AUDIT = 445 // { int audit(const void *record, \ - SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_AUDIT = 445 // { int audit(const void *record, u_int length); } + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, u_int length); } SYS_GETAUID = 447 // { int getauid(uid_t *auid); } SYS_SETAUID = 448 // { int setauid(uid_t *auid); } SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } - SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ - SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( struct auditinfo_addr *auditinfo_addr, u_int length); } SYS_AUDITCTL = 453 // { int auditctl(char *path); } - SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ - SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, u_long val, void *uaddr1, void *uaddr2); } + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, int param_size); } SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } - SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, \ - SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, \ - SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, \ - SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, \ - SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, \ + SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, mode_t mode, const struct mq_attr *attr); } + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, const struct mq_attr *attr, struct mq_attr *oattr); } + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, const char *msg_ptr, size_t msg_len,unsigned msg_prio, const struct timespec *abs_timeout);} + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, const struct sigevent *sigev); } SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); } - SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, lwpid_t lwpid, struct rtprio *rtp); } SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } - SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ - SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ - SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ - SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ - SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ - SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ - SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } + SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, caddr_t to, __socklen_t tolen, struct sctp_sndrcvinfo *sinfo, int flags); } + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, struct sockaddr * from, __socklen_t *fromlenaddr, struct sctp_sndrcvinfo *sinfo, int *msg_flags); } + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset); } + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset); } + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fd, off_t pos); } + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, int whence); } SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } - SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, mode_t mode); } SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } - SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ - SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ - SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ - SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ - SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ - SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ - SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ - SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ - SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ - SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ - SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, cpusetid_t setid); } + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, cpuwhich_t which, id_t id, cpusetid_t *setid); } + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, cpuset_t *mask); } + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t cpusetsize, const cpuset_t *mask); } + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, int flag); } + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, gid_t gid, int flag); } + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, char **envv); } + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, struct stat *buf, int flag); } + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, struct timeval *times); } + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, char *path2, int flag); } SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } - SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ - SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ - SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ - SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ - SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, dev_t dev); } + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, mode_t mode); } + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, size_t bufsize); } + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, char *new); } + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, char *path2); } SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); } - SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ - SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, unsigned int iovcnt, int flags); } + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, unsigned int iovcnt, int flags); } SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } - SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, \ - SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, \ - SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, \ + SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, int cmd, union semun *arg); } + SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, struct shmid_ds *buf); } SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } - SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, int fd, cap_rights_t *rightsp); } SYS_CAP_ENTER = 516 // { int cap_enter(void); } SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } - SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ - SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *sm); } + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, size_t namelen); } SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } - SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ - SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ - SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ - SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ - SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ - SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ - SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ - SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ - SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ - SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ - SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ - SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ - SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ - SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ - SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ - SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ - SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, size_t inbuflen, void *outbufp, size_t outbuflen); } + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, off_t offset, off_t len); } + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, off_t len, int advice); } + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, int *status, int options, struct __wrusage *wrusage, siginfo_t *info); } + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, cap_rights_t *rightsp); } + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, const u_long *cmds, size_t ncmds); } + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, u_long *cmds, size_t maxcmds); } + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, uint32_t fcntlrights); } + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, uint32_t *fcntlrightsp); } + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, int namelen); } + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, int namelen); } + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, u_long flags, int atflag); } + SYS_ACCEPT4 = 541 // { int accept4(int s, struct sockaddr * __restrict name, __socklen_t * __restrict anamelen, int flags); } SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); } - SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ - SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ - SYS_FUTIMENS = 546 // { int futimens(int fd, \ - SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ - SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, \ - SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, \ + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, int com, void *data); } + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *set); } + SYS_FUTIMENS = 546 // { int futimens(int fd, struct timespec *times); } + SYS_UTIMENSAT = 547 // { int utimensat(int fd, char *path, struct timespec *times, int flag); } + SYS_NUMA_GETAFFINITY = 548 // { int numa_getaffinity(cpuwhich_t which, id_t id, struct vm_domain_policy_entry *policy); } + SYS_NUMA_SETAFFINITY = 549 // { int numa_setaffinity(cpuwhich_t which, id_t id, const struct vm_domain_policy_entry *policy); } SYS_FDATASYNC = 550 // { int fdatasync(int fd); } ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index 33b6e4d1..e869c060 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -423,4 +423,10 @@ const ( SYS_IO_URING_SETUP = 425 SYS_IO_URING_ENTER = 426 SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 9ba20784..4917b8ab 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -345,4 +345,10 @@ const ( SYS_IO_URING_SETUP = 425 SYS_IO_URING_ENTER = 426 SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index 94f68f10..f85fcb4f 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -387,4 +387,10 @@ const ( SYS_IO_URING_SETUP = 425 SYS_IO_URING_ENTER = 426 SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 15c41351..678a119b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -290,4 +290,10 @@ const ( SYS_IO_URING_SETUP = 425 SYS_IO_URING_ENTER = 426 SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 638465b1..222c9f9a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -408,4 +408,10 @@ const ( SYS_IO_URING_SETUP = 4425 SYS_IO_URING_ENTER = 4426 SYS_IO_URING_REGISTER = 4427 + SYS_OPEN_TREE = 4428 + SYS_MOVE_MOUNT = 4429 + SYS_FSOPEN = 4430 + SYS_FSCONFIG = 4431 + SYS_FSMOUNT = 4432 + SYS_FSPICK = 4433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 57ec82aa..28e6d0e9 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -338,4 +338,10 @@ const ( SYS_IO_URING_SETUP = 5425 SYS_IO_URING_ENTER = 5426 SYS_IO_URING_REGISTER = 5427 + SYS_OPEN_TREE = 5428 + SYS_MOVE_MOUNT = 5429 + SYS_FSOPEN = 5430 + SYS_FSCONFIG = 5431 + SYS_FSMOUNT = 5432 + SYS_FSPICK = 5433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index 825a3e3b..e643c6f6 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -338,4 +338,10 @@ const ( SYS_IO_URING_SETUP = 5425 SYS_IO_URING_ENTER = 5426 SYS_IO_URING_REGISTER = 5427 + SYS_OPEN_TREE = 5428 + SYS_MOVE_MOUNT = 5429 + SYS_FSOPEN = 5430 + SYS_FSCONFIG = 5431 + SYS_FSMOUNT = 5432 + SYS_FSPICK = 5433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index f152dfdd..01d93c42 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -408,4 +408,10 @@ const ( SYS_IO_URING_SETUP = 4425 SYS_IO_URING_ENTER = 4426 SYS_IO_URING_REGISTER = 4427 + SYS_OPEN_TREE = 4428 + SYS_MOVE_MOUNT = 4429 + SYS_FSOPEN = 4430 + SYS_FSCONFIG = 4431 + SYS_FSMOUNT = 4432 + SYS_FSPICK = 4433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index 7cbe78b1..5744149e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -387,4 +387,10 @@ const ( SYS_IO_URING_SETUP = 425 SYS_IO_URING_ENTER = 426 SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 51a2f123..21c83204 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -387,4 +387,10 @@ const ( SYS_IO_URING_SETUP = 425 SYS_IO_URING_ENTER = 426 SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 323432ae..c1bb6d8f 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -289,4 +289,10 @@ const ( SYS_IO_URING_SETUP = 425 SYS_IO_URING_ENTER = 426 SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 9dca9748..bc3cc6b5 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -352,4 +352,10 @@ const ( SYS_IO_URING_SETUP = 425 SYS_IO_URING_ENTER = 426 SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index d3da46f0..0a2841ba 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -367,4 +367,10 @@ const ( SYS_IO_URING_SETUP = 425 SYS_IO_URING_ENTER = 426 SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 0edc5409..7312e95f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -324,11 +324,108 @@ const ( ) const ( - PTRACE_TRACEME = 0x0 - PTRACE_CONT = 0x7 - PTRACE_KILL = 0x8 + PTRACE_ATTACH = 0xa + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0xb + PTRACE_GETFPREGS = 0x23 + PTRACE_GETFSBASE = 0x47 + PTRACE_GETLWPLIST = 0xf + PTRACE_GETNUMLWPS = 0xe + PTRACE_GETREGS = 0x21 + PTRACE_GETXSTATE = 0x45 + PTRACE_IO = 0xc + PTRACE_KILL = 0x8 + PTRACE_LWPEVENTS = 0x18 + PTRACE_LWPINFO = 0xd + PTRACE_SETFPREGS = 0x24 + PTRACE_SETREGS = 0x22 + PTRACE_SINGLESTEP = 0x9 + PTRACE_TRACEME = 0x0 ) +const ( + PIOD_READ_D = 0x1 + PIOD_WRITE_D = 0x2 + PIOD_READ_I = 0x3 + PIOD_WRITE_I = 0x4 +) + +const ( + PL_FLAG_BORN = 0x100 + PL_FLAG_EXITED = 0x200 + PL_FLAG_SI = 0x20 +) + +const ( + TRAP_BRKPT = 0x1 + TRAP_TRACE = 0x2 +) + +type PtraceLwpInfoStruct struct { + Lwpid int32 + Event int32 + Flags int32 + Sigmask Sigset_t + Siglist Sigset_t + Siginfo __Siginfo + Tdname [20]int8 + Child_pid int32 + Syscall_code uint32 + Syscall_narg uint32 +} + +type __Siginfo struct { + Signo int32 + Errno int32 + Code int32 + Pid int32 + Uid uint32 + Status int32 + Addr *byte + Value [4]byte + X_reason [32]byte +} + +type Sigset_t struct { + Val [4]uint32 +} + +type Reg struct { + Fs uint32 + Es uint32 + Ds uint32 + Edi uint32 + Esi uint32 + Ebp uint32 + Isp uint32 + Ebx uint32 + Edx uint32 + Ecx uint32 + Eax uint32 + Trapno uint32 + Err uint32 + Eip uint32 + Cs uint32 + Eflags uint32 + Esp uint32 + Ss uint32 + Gs uint32 +} + +type FpReg struct { + Env [7]uint32 + Acc [8][10]uint8 + Ex_sw uint32 + Pad [64]uint8 +} + +type PtraceIoDesc struct { + Op int32 + Offs *byte + Addr *byte + Len uint +} + type Kevent_t struct { Ident uint32 Filter int16 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index 8881ce84..29ba2f5b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -322,11 +322,115 @@ const ( ) const ( - PTRACE_TRACEME = 0x0 - PTRACE_CONT = 0x7 - PTRACE_KILL = 0x8 + PTRACE_ATTACH = 0xa + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0xb + PTRACE_GETFPREGS = 0x23 + PTRACE_GETFSBASE = 0x47 + PTRACE_GETLWPLIST = 0xf + PTRACE_GETNUMLWPS = 0xe + PTRACE_GETREGS = 0x21 + PTRACE_GETXSTATE = 0x45 + PTRACE_IO = 0xc + PTRACE_KILL = 0x8 + PTRACE_LWPEVENTS = 0x18 + PTRACE_LWPINFO = 0xd + PTRACE_SETFPREGS = 0x24 + PTRACE_SETREGS = 0x22 + PTRACE_SINGLESTEP = 0x9 + PTRACE_TRACEME = 0x0 ) +const ( + PIOD_READ_D = 0x1 + PIOD_WRITE_D = 0x2 + PIOD_READ_I = 0x3 + PIOD_WRITE_I = 0x4 +) + +const ( + PL_FLAG_BORN = 0x100 + PL_FLAG_EXITED = 0x200 + PL_FLAG_SI = 0x20 +) + +const ( + TRAP_BRKPT = 0x1 + TRAP_TRACE = 0x2 +) + +type PtraceLwpInfoStruct struct { + Lwpid int32 + Event int32 + Flags int32 + Sigmask Sigset_t + Siglist Sigset_t + Siginfo __Siginfo + Tdname [20]int8 + Child_pid int32 + Syscall_code uint32 + Syscall_narg uint32 +} + +type __Siginfo struct { + Signo int32 + Errno int32 + Code int32 + Pid int32 + Uid uint32 + Status int32 + Addr *byte + Value [8]byte + _ [40]byte +} + +type Sigset_t struct { + Val [4]uint32 +} + +type Reg struct { + R15 int64 + R14 int64 + R13 int64 + R12 int64 + R11 int64 + R10 int64 + R9 int64 + R8 int64 + Rdi int64 + Rsi int64 + Rbp int64 + Rbx int64 + Rdx int64 + Rcx int64 + Rax int64 + Trapno uint32 + Fs uint16 + Gs uint16 + Err uint32 + Es uint16 + Ds uint16 + Rip int64 + Cs int64 + Rflags int64 + Rsp int64 + Ss int64 +} + +type FpReg struct { + Env [4]uint64 + Acc [8][16]uint8 + Xacc [16][16]uint8 + Spare [12]uint64 +} + +type PtraceIoDesc struct { + Op int32 + Offs *byte + Addr *byte + Len uint +} + type Kevent_t struct { Ident uint64 Filter int16 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index fc713999..b4090ef3 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -322,11 +322,92 @@ const ( ) const ( - PTRACE_TRACEME = 0x0 - PTRACE_CONT = 0x7 - PTRACE_KILL = 0x8 + PTRACE_ATTACH = 0xa + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0xb + PTRACE_GETFPREGS = 0x23 + PTRACE_GETFSBASE = 0x47 + PTRACE_GETLWPLIST = 0xf + PTRACE_GETNUMLWPS = 0xe + PTRACE_GETREGS = 0x21 + PTRACE_GETXSTATE = 0x45 + PTRACE_IO = 0xc + PTRACE_KILL = 0x8 + PTRACE_LWPEVENTS = 0x18 + PTRACE_LWPINFO = 0xd + PTRACE_SETFPREGS = 0x24 + PTRACE_SETREGS = 0x22 + PTRACE_SINGLESTEP = 0x9 + PTRACE_TRACEME = 0x0 ) +const ( + PIOD_READ_D = 0x1 + PIOD_WRITE_D = 0x2 + PIOD_READ_I = 0x3 + PIOD_WRITE_I = 0x4 +) + +const ( + PL_FLAG_BORN = 0x100 + PL_FLAG_EXITED = 0x200 + PL_FLAG_SI = 0x20 +) + +const ( + TRAP_BRKPT = 0x1 + TRAP_TRACE = 0x2 +) + +type PtraceLwpInfoStruct struct { + Lwpid int32 + Event int32 + Flags int32 + Sigmask Sigset_t + Siglist Sigset_t + Siginfo __Siginfo + Tdname [20]int8 + Child_pid int32 + Syscall_code uint32 + Syscall_narg uint32 +} + +type __Siginfo struct { + Signo int32 + Errno int32 + Code int32 + Pid int32 + Uid uint32 + Status int32 + Addr *byte + Value [4]byte + X_reason [32]byte +} + +type Sigset_t struct { + Val [4]uint32 +} + +type Reg struct { + R [13]uint32 + R_sp uint32 + R_lr uint32 + R_pc uint32 + R_cpsr uint32 +} + +type FpReg struct { + Fpr_fpsr uint32 + Fpr [8][3]uint32 +} + +type PtraceIoDesc struct { + Op int32 + Offs *byte + Addr *byte + Len uint +} + type Kevent_t struct { Ident uint32 Filter int16 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index 5a0753ee..1542a877 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -322,11 +322,93 @@ const ( ) const ( - PTRACE_TRACEME = 0x0 - PTRACE_CONT = 0x7 - PTRACE_KILL = 0x8 + PTRACE_ATTACH = 0xa + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0xb + PTRACE_GETFPREGS = 0x23 + PTRACE_GETFSBASE = 0x47 + PTRACE_GETLWPLIST = 0xf + PTRACE_GETNUMLWPS = 0xe + PTRACE_GETREGS = 0x21 + PTRACE_GETXSTATE = 0x45 + PTRACE_IO = 0xc + PTRACE_KILL = 0x8 + PTRACE_LWPEVENTS = 0x18 + PTRACE_LWPINFO = 0xd + PTRACE_SETFPREGS = 0x24 + PTRACE_SETREGS = 0x22 + PTRACE_SINGLESTEP = 0x9 + PTRACE_TRACEME = 0x0 ) +const ( + PIOD_READ_D = 0x1 + PIOD_WRITE_D = 0x2 + PIOD_READ_I = 0x3 + PIOD_WRITE_I = 0x4 +) + +const ( + PL_FLAG_BORN = 0x100 + PL_FLAG_EXITED = 0x200 + PL_FLAG_SI = 0x20 +) + +const ( + TRAP_BRKPT = 0x1 + TRAP_TRACE = 0x2 +) + +type PtraceLwpInfoStruct struct { + Lwpid int32 + Event int32 + Flags int32 + Sigmask Sigset_t + Siglist Sigset_t + Siginfo __Siginfo + Tdname [20]int8 + Child_pid int32 + Syscall_code uint32 + Syscall_narg uint32 +} + +type __Siginfo struct { + Signo int32 + Errno int32 + Code int32 + Pid int32 + Uid uint32 + Status int32 + Addr *byte + Value [8]byte + X_reason [40]byte +} + +type Sigset_t struct { + Val [4]uint32 +} + +type Reg struct { + X [30]uint64 + Lr uint64 + Sp uint64 + Elr uint64 + Spsr uint32 +} + +type FpReg struct { + Fp_q [32]uint128 + Fp_sr uint32 + Fp_cr uint32 +} + +type PtraceIoDesc struct { + Op int32 + Offs *byte + Addr *byte + Len uint +} + type Kevent_t struct { Ident uint64 Filter int16 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 06e3a3f4..50bc4128 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -2467,3 +2467,57 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint16 + Inode uint32 + Rdevice uint16 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint32 + Reserved [4]int8 +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index cef25e73..055eaa76 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -2480,3 +2480,58 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint64 + Inode uint64 + Rdevice uint64 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index c4369361..66019c9c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -2458,3 +2458,57 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint16 + Inode uint32 + Rdevice uint16 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint32 + Reserved [4]uint8 +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 76c55e05..3104798c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -2459,3 +2459,58 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 4302d574..46c86021 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -2464,3 +2464,57 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint32 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint32 + Reserved [4]int8 +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 7ea742be..c2fe1a62 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -2461,3 +2461,58 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 8f2b8ad4..f1eb0d39 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -2461,3 +2461,58 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 865bf57d..8759bc36 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -2464,3 +2464,57 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint32 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint32 + Reserved [4]int8 +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 2b68027d..a8120054 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -2469,3 +2469,58 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint64 + Inode uint64 + Rdevice uint64 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]uint8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 76cd7e64..74b7a919 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -2469,3 +2469,58 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint64 + Inode uint64 + Rdevice uint64 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]uint8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index f99f0615..ccea3e63 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -808,6 +808,7 @@ type Ustat_t struct { type EpollEvent struct { Events uint32 + _ int32 Fd int32 Pad int32 } @@ -2486,3 +2487,58 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]uint8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index d9d03ae4..d8fc0bc1 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -2483,3 +2483,58 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint16 + Inode uint64 + Rdevice uint16 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index b247fe94..5e0ab932 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -2464,3 +2464,58 @@ const ( BPF_FD_TYPE_UPROBE = 0x4 BPF_FD_TYPE_URETPROBE = 0x5 ) + +type CapUserHeader struct { + Version uint32 + Pid int32 +} + +type CapUserData struct { + Effective uint32 + Permitted uint32 + Inheritable uint32 +} + +const ( + LINUX_CAPABILITY_VERSION_1 = 0x19980330 + LINUX_CAPABILITY_VERSION_2 = 0x20071026 + LINUX_CAPABILITY_VERSION_3 = 0x20080522 +) + +const ( + LO_FLAGS_READ_ONLY = 0x1 + LO_FLAGS_AUTOCLEAR = 0x4 + LO_FLAGS_PARTSCAN = 0x8 + LO_FLAGS_DIRECT_IO = 0x10 +) + +type LoopInfo struct { + Number int32 + Device uint32 + Inode uint64 + Rdevice uint32 + Offset int32 + Encrypt_type int32 + Encrypt_key_size int32 + Flags int32 + Name [64]int8 + Encrypt_key [32]uint8 + Init [2]uint64 + Reserved [4]int8 + _ [4]byte +} +type LoopInfo64 struct { + Device uint64 + Inode uint64 + Rdevice uint64 + Offset uint64 + Sizelimit uint64 + Number uint32 + Encrypt_type uint32 + Encrypt_key_size uint32 + Flags uint32 + File_name [64]uint8 + Crypt_name [64]uint8 + Encrypt_key [32]uint8 + Init [2]uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go index a2268b4f..86736ab6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -411,6 +411,7 @@ type Ptmget struct { const ( AT_FDCWD = -0x64 + AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x200 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go index 59e1da0a..3427811f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -418,6 +418,7 @@ type Ptmget struct { const ( AT_FDCWD = -0x64 + AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x200 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go index 1f1f0f38..399f37a4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -416,6 +416,7 @@ type Ptmget struct { const ( AT_FDCWD = -0x64 + AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x200 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go index 8dca204a..32f0c15d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go @@ -418,6 +418,7 @@ type Ptmget struct { const ( AT_FDCWD = -0x64 + AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x200 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go index 900fb446..61ea0019 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -436,6 +436,7 @@ type Winsize struct { const ( AT_FDCWD = -0x64 + AT_SYMLINK_FOLLOW = 0x4 AT_SYMLINK_NOFOLLOW = 0x2 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go index 028fa78d..87a493f6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -436,6 +436,7 @@ type Winsize struct { const ( AT_FDCWD = -0x64 + AT_SYMLINK_FOLLOW = 0x4 AT_SYMLINK_NOFOLLOW = 0x2 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go index b45d5eed..d80836ef 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -437,6 +437,7 @@ type Winsize struct { const ( AT_FDCWD = -0x64 + AT_SYMLINK_FOLLOW = 0x4 AT_SYMLINK_NOFOLLOW = 0x2 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go index fa369a32..4e158746 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go @@ -430,6 +430,7 @@ type Winsize struct { const ( AT_FDCWD = -0x64 + AT_SYMLINK_FOLLOW = 0x4 AT_SYMLINK_NOFOLLOW = 0x2 ) diff --git a/vendor/golang.org/x/sys/windows/mkerrors.bash b/vendor/golang.org/x/sys/windows/mkerrors.bash index a70b24f3..2163843a 100644 --- a/vendor/golang.org/x/sys/windows/mkerrors.bash +++ b/vendor/golang.org/x/sys/windows/mkerrors.bash @@ -7,14 +7,13 @@ set -e shopt -s nullglob -[[ $# -eq 1 ]] || { echo "Usage: $0 OUTPUT_FILE.go" >&2; exit 1; } winerror="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/shared/winerror.h | sort -Vr | head -n 1)" [[ -n $winerror ]] || { echo "Unable to find winerror.h" >&2; exit 1; } declare -A errors { - echo "// Code generated by 'go generate'; DO NOT EDIT." + echo "// Code generated by 'mkerrors.bash'; DO NOT EDIT." echo echo "package windows" echo "import \"syscall\"" @@ -61,4 +60,4 @@ declare -A errors done < "$winerror" echo ")" -} | gofmt > "$1" +} | gofmt > "zerrors_windows.go" diff --git a/vendor/golang.org/x/sys/windows/mkerrors.go b/vendor/golang.org/x/sys/windows/mkerrors.go deleted file mode 100644 index a204e6ca..00000000 --- a/vendor/golang.org/x/sys/windows/mkerrors.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build generate - -package windows - -//go:generate ./mkerrors.bash zerrors_windows.go diff --git a/vendor/golang.org/x/sys/windows/mkknownfolderids.bash b/vendor/golang.org/x/sys/windows/mkknownfolderids.bash new file mode 100644 index 00000000..ab8924e9 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/mkknownfolderids.bash @@ -0,0 +1,27 @@ +#!/bin/bash + +# Copyright 2019 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +set -e +shopt -s nullglob + +knownfolders="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/um/KnownFolders.h | sort -Vr | head -n 1)" +[[ -n $knownfolders ]] || { echo "Unable to find KnownFolders.h" >&2; exit 1; } + +{ + echo "// Code generated by 'mkknownfolderids.bash'; DO NOT EDIT." + echo + echo "package windows" + echo "type KNOWNFOLDERID GUID" + echo "var (" + while read -r line; do + [[ $line =~ DEFINE_KNOWN_FOLDER\((FOLDERID_[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+)\) ]] || continue + printf "%s = &KNOWNFOLDERID{0x%08x, 0x%04x, 0x%04x, [8]byte{0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x}}\n" \ + "${BASH_REMATCH[1]}" $(( "${BASH_REMATCH[2]}" )) $(( "${BASH_REMATCH[3]}" )) $(( "${BASH_REMATCH[4]}" )) \ + $(( "${BASH_REMATCH[5]}" )) $(( "${BASH_REMATCH[6]}" )) $(( "${BASH_REMATCH[7]}" )) $(( "${BASH_REMATCH[8]}" )) \ + $(( "${BASH_REMATCH[9]}" )) $(( "${BASH_REMATCH[10]}" )) $(( "${BASH_REMATCH[11]}" )) $(( "${BASH_REMATCH[12]}" )) + done < "$knownfolders" + echo ")" +} | gofmt > "zknownfolderids_windows.go" diff --git a/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/golang.org/x/sys/windows/security_windows.go index b84840fe..7b2cfb9e 100644 --- a/vendor/golang.org/x/sys/windows/security_windows.go +++ b/vendor/golang.org/x/sys/windows/security_windows.go @@ -603,12 +603,22 @@ type Tokenprimarygroup struct { type Tokengroups struct { GroupCount uint32 - Groups [1]SIDAndAttributes + Groups [1]SIDAndAttributes // Use AllGroups() for iterating. +} + +// AllGroups returns a slice that can be used to iterate over the groups in g. +func (g *Tokengroups) AllGroups() []SIDAndAttributes { + return (*[(1 << 28) - 1]SIDAndAttributes)(unsafe.Pointer(&g.Groups[0]))[:g.GroupCount:g.GroupCount] } type Tokenprivileges struct { PrivilegeCount uint32 - Privileges [1]LUIDAndAttributes + Privileges [1]LUIDAndAttributes // Use AllPrivileges() for iterating. +} + +// AllPrivileges returns a slice that can be used to iterate over the privileges in p. +func (p *Tokenprivileges) AllPrivileges() []LUIDAndAttributes { + return (*[(1 << 27) - 1]LUIDAndAttributes)(unsafe.Pointer(&p.Privileges[0]))[:p.PrivilegeCount:p.PrivilegeCount] } type Tokenmandatorylabel struct { @@ -634,6 +644,8 @@ func (tml *Tokenmandatorylabel) Size() uint32 { //sys DuplicateTokenEx(existingToken Token, desiredAccess uint32, tokenAttributes *SecurityAttributes, impersonationLevel uint32, tokenType uint32, newToken *Token) (err error) = advapi32.DuplicateTokenEx //sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW //sys getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemDirectoryW +//sys getWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetWindowsDirectoryW +//sys getSystemWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemWindowsDirectoryW // An access token contains the security information for a logon session. // The system creates an access token when a user logs on, and every @@ -654,7 +666,7 @@ func OpenCurrentProcessToken() (Token, error) { return 0, e } var t Token - e = OpenProcessToken(p, TOKEN_QUERY, &t) + e = OpenProcessToken(p, TOKEN_QUERY|TOKEN_DUPLICATE, &t) if e != nil { return 0, e } @@ -775,8 +787,8 @@ func (token Token) GetLinkedToken() (Token, error) { return linkedToken, nil } -// GetSystemDirectory retrieves path to current location of the system -// directory, which is typically, though not always, C:\Windows\System32. +// GetSystemDirectory retrieves the path to current location of the system +// directory, which is typically, though not always, `C:\Windows\System32`. func GetSystemDirectory() (string, error) { n := uint32(MAX_PATH) for { @@ -792,6 +804,42 @@ func GetSystemDirectory() (string, error) { } } +// GetWindowsDirectory retrieves the path to current location of the Windows +// directory, which is typically, though not always, `C:\Windows`. This may +// be a private user directory in the case that the application is running +// under a terminal server. +func GetWindowsDirectory() (string, error) { + n := uint32(MAX_PATH) + for { + b := make([]uint16, n) + l, e := getWindowsDirectory(&b[0], n) + if e != nil { + return "", e + } + if l <= n { + return UTF16ToString(b[:l]), nil + } + n = l + } +} + +// GetSystemWindowsDirectory retrieves the path to current location of the +// Windows directory, which is typically, though not always, `C:\Windows`. +func GetSystemWindowsDirectory() (string, error) { + n := uint32(MAX_PATH) + for { + b := make([]uint16, n) + l, e := getSystemWindowsDirectory(&b[0], n) + if e != nil { + return "", e + } + if l <= n { + return UTF16ToString(b[:l]), nil + } + n = l + } +} + // IsMember reports whether the access token t is a member of the provided SID. func (t Token) IsMember(sid *SID) (bool, error) { var b int32 diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go index 9a59b42f..847e00bc 100644 --- a/vendor/golang.org/x/sys/windows/service.go +++ b/vendor/golang.org/x/sys/windows/service.go @@ -159,6 +159,10 @@ type SERVICE_DESCRIPTION struct { Description *uint16 } +type SERVICE_DELAYED_AUTO_START_INFO struct { + IsDelayedAutoStartUp uint32 +} + type SERVICE_STATUS_PROCESS struct { ServiceType uint32 CurrentState uint32 @@ -200,12 +204,19 @@ type SC_ACTION struct { Delay uint32 } +type QUERY_SERVICE_LOCK_STATUS struct { + IsLocked uint32 + LockOwner *uint16 + LockDuration uint32 +} + //sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle //sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW //sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW //sys DeleteService(service Handle) (err error) = advapi32.DeleteService //sys StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW //sys QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus +//sys QueryServiceLockStatus(mgr Handle, lockStatus *QUERY_SERVICE_LOCK_STATUS, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceLockStatusW //sys ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService //sys StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW //sys SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index b98b9454..abdefc33 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -10,6 +10,7 @@ import ( errorspkg "errors" "sync" "syscall" + "time" "unicode/utf16" "unsafe" ) @@ -171,8 +172,9 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CancelIo(s Handle) (err error) //sys CancelIoEx(s Handle, o *Overlapped) (err error) //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW -//sys OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) +//sys OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) //sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) = shell32.ShellExecuteW +//sys shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath //sys TerminateProcess(handle Handle, exitcode uint32) (err error) //sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) //sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW @@ -194,6 +196,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW //sys CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock //sys DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock +//sys getTickCount64() (ms uint64) = kernel32.GetTickCount64 //sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) //sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW //sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW @@ -232,7 +235,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW //sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW //sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW -//sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId +//sys GetCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId //sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode //sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode //sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo @@ -241,6 +244,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot //sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW //sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW +//sys Thread32First(snapshot Handle, threadEntry *ThreadEntry32) (err error) +//sys Thread32Next(snapshot Handle, threadEntry *ThreadEntry32) (err error) //sys DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) // This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. //sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW @@ -252,6 +257,10 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetEvent(event Handle) (err error) = kernel32.SetEvent //sys ResetEvent(event Handle) (err error) = kernel32.ResetEvent //sys PulseEvent(event Handle) (err error) = kernel32.PulseEvent +//sys CreateMutex(mutexAttrs *SecurityAttributes, initialOwner bool, name *uint16) (handle Handle, err error) = kernel32.CreateMutexW +//sys CreateMutexEx(mutexAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) = kernel32.CreateMutexExW +//sys OpenMutex(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenMutexW +//sys ReleaseMutex(mutex Handle) (err error) = kernel32.ReleaseMutex //sys SleepEx(milliseconds uint32, alertable bool) (ret uint32) = kernel32.SleepEx //sys CreateJobObject(jobAttr *SecurityAttributes, name *uint16) (handle Handle, err error) = kernel32.CreateJobObjectW //sys AssignProcessToJobObject(job Handle, process Handle) (err error) = kernel32.AssignProcessToJobObject @@ -261,6 +270,10 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetPriorityClass(process Handle, priorityClass uint32) (err error) = kernel32.SetPriorityClass //sys GetPriorityClass(process Handle) (ret uint32, err error) = kernel32.GetPriorityClass //sys SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobObjectInformation uintptr, JobObjectInformationLength uint32) (ret int, err error) +//sys GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error) +//sys GetProcessId(process Handle) (id uint32, err error) +//sys OpenThread(desiredAccess uint32, inheritHandle bool, threadId uint32) (handle Handle, err error) +//sys SetProcessPriorityBoost(process Handle, disable bool) (err error) = kernel32.SetProcessPriorityBoost // Volume Management Functions //sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW @@ -283,6 +296,12 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW //sys SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW //sys MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW +//sys clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) = ole32.CLSIDFromString +//sys stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) = ole32.StringFromGUID2 +//sys coCreateGuid(pguid *GUID) (ret error) = ole32.CoCreateGuid +//sys CoTaskMemFree(address unsafe.Pointer) = ole32.CoTaskMemFree +//sys rtlGetVersion(info *OsVersionInfoEx) (ret error) = ntdll.RtlGetVersion +//sys rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32) = ntdll.RtlGetNtVersionNumbers // syscall interface implementation for other packages @@ -497,6 +516,10 @@ func ComputerName() (name string, err error) { return string(utf16.Decode(b[0:n])), nil } +func DurationSinceBoot() time.Duration { + return time.Duration(getTickCount64()) * time.Millisecond +} + func Ftruncate(fd Handle, length int64) (err error) { curoffset, e := Seek(fd, 0, 1) if e != nil { @@ -1106,7 +1129,7 @@ func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) { return syscall.EWINDOWS } -func Getpid() (pid int) { return int(getCurrentProcessId()) } +func Getpid() (pid int) { return int(GetCurrentProcessId()) } func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) { // NOTE(rsc): The Win32finddata struct is wrong for the system call: @@ -1234,3 +1257,78 @@ func Readlink(path string, buf []byte) (n int, err error) { return n, nil } + +// GUIDFromString parses a string in the form of +// "{XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" into a GUID. +func GUIDFromString(str string) (GUID, error) { + guid := GUID{} + str16, err := syscall.UTF16PtrFromString(str) + if err != nil { + return guid, err + } + err = clsidFromString(str16, &guid) + if err != nil { + return guid, err + } + return guid, nil +} + +// GenerateGUID creates a new random GUID. +func GenerateGUID() (GUID, error) { + guid := GUID{} + err := coCreateGuid(&guid) + if err != nil { + return guid, err + } + return guid, nil +} + +// String returns the canonical string form of the GUID, +// in the form of "{XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}". +func (guid GUID) String() string { + var str [100]uint16 + chars := stringFromGUID2(&guid, &str[0], int32(len(str))) + if chars <= 1 { + return "" + } + return string(utf16.Decode(str[:chars-1])) +} + +// KnownFolderPath returns a well-known folder path for the current user, specified by one of +// the FOLDERID_ constants, and chosen and optionally created based on a KF_ flag. +func KnownFolderPath(folderID *KNOWNFOLDERID, flags uint32) (string, error) { + return Token(0).KnownFolderPath(folderID, flags) +} + +// KnownFolderPath returns a well-known folder path for the user token, specified by one of +// the FOLDERID_ constants, and chosen and optionally created based on a KF_ flag. +func (t Token) KnownFolderPath(folderID *KNOWNFOLDERID, flags uint32) (string, error) { + var p *uint16 + err := shGetKnownFolderPath(folderID, flags, t, &p) + if err != nil { + return "", err + } + defer CoTaskMemFree(unsafe.Pointer(p)) + return UTF16ToString((*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:]), nil +} + +// RtlGetVersion returns the version of the underlying operating system, ignoring +// manifest semantics but is affected by the application compatibility layer. +func RtlGetVersion() *OsVersionInfoEx { + info := &OsVersionInfoEx{} + info.osVersionInfoSize = uint32(unsafe.Sizeof(*info)) + // According to documentation, this function always succeeds. + // The function doesn't even check the validity of the + // osVersionInfoSize member. Disassembling ntdll.dll indicates + // that the documentation is indeed correct about that. + _ = rtlGetVersion(info) + return info +} + +// RtlGetNtVersionNumbers returns the version of the underlying operating system, +// ignoring manifest semantics and the application compatibility layer. +func RtlGetNtVersionNumbers() (majorVersion, minorVersion, buildNumber uint32) { + rtlGetNtVersionNumbers(&majorVersion, &minorVersion, &buildNumber) + buildNumber &= 0xffff + return +} diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 99b85f6d..1ef80cd7 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -158,17 +158,50 @@ const ( WAIT_OBJECT_0 = 0x00000000 WAIT_FAILED = 0xFFFFFFFF - PROCESS_TERMINATE = 1 - PROCESS_QUERY_INFORMATION = 0x00000400 - SYNCHRONIZE = 0x00100000 + // Standard access rights. + DELETE = 0x00010000 + READ_CONTROL = 0x00020000 + SYNCHRONIZE = 0x00100000 + WRITE_DAC = 0x00040000 + WRITE_OWNER = 0x00080000 + + // Access rights for process. + PROCESS_CREATE_PROCESS = 0x0080 + PROCESS_CREATE_THREAD = 0x0002 + PROCESS_DUP_HANDLE = 0x0040 + PROCESS_QUERY_INFORMATION = 0x0400 + PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 + PROCESS_SET_INFORMATION = 0x0200 + PROCESS_SET_QUOTA = 0x0100 + PROCESS_SUSPEND_RESUME = 0x0800 + PROCESS_TERMINATE = 0x0001 + PROCESS_VM_OPERATION = 0x0008 + PROCESS_VM_READ = 0x0010 + PROCESS_VM_WRITE = 0x0020 + + // Access rights for thread. + THREAD_DIRECT_IMPERSONATION = 0x0200 + THREAD_GET_CONTEXT = 0x0008 + THREAD_IMPERSONATE = 0x0100 + THREAD_QUERY_INFORMATION = 0x0040 + THREAD_QUERY_LIMITED_INFORMATION = 0x0800 + THREAD_SET_CONTEXT = 0x0010 + THREAD_SET_INFORMATION = 0x0020 + THREAD_SET_LIMITED_INFORMATION = 0x0400 + THREAD_SET_THREAD_TOKEN = 0x0080 + THREAD_SUSPEND_RESUME = 0x0002 + THREAD_TERMINATE = 0x0001 FILE_MAP_COPY = 0x01 FILE_MAP_WRITE = 0x02 FILE_MAP_READ = 0x04 FILE_MAP_EXECUTE = 0x20 - CTRL_C_EVENT = 0 - CTRL_BREAK_EVENT = 1 + CTRL_C_EVENT = 0 + CTRL_BREAK_EVENT = 1 + CTRL_CLOSE_EVENT = 2 + CTRL_LOGOFF_EVENT = 5 + CTRL_SHUTDOWN_EVENT = 6 // Windows reserves errors >= 1<<29 for application use. APPLICATION_ERROR = 1 << 29 @@ -629,6 +662,16 @@ type ProcessEntry32 struct { ExeFile [MAX_PATH]uint16 } +type ThreadEntry32 struct { + Size uint32 + Usage uint32 + ThreadID uint32 + OwnerProcessID uint32 + BasePri int32 + DeltaPri int32 + Flags uint32 +} + type Systemtime struct { Year uint16 Month uint16 @@ -1147,6 +1190,28 @@ const ( REG_QWORD = REG_QWORD_LITTLE_ENDIAN ) +const ( + EVENT_MODIFY_STATE = 0x0002 + EVENT_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3 + + MUTANT_QUERY_STATE = 0x0001 + MUTANT_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | MUTANT_QUERY_STATE + + SEMAPHORE_MODIFY_STATE = 0x0002 + SEMAPHORE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3 + + TIMER_QUERY_STATE = 0x0001 + TIMER_MODIFY_STATE = 0x0002 + TIMER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | TIMER_QUERY_STATE | TIMER_MODIFY_STATE + + MUTEX_MODIFY_STATE = MUTANT_QUERY_STATE + MUTEX_ALL_ACCESS = MUTANT_ALL_ACCESS + + CREATE_EVENT_MANUAL_RESET = 0x1 + CREATE_EVENT_INITIAL_SET = 0x2 + CREATE_MUTEX_INITIAL_OWNER = 0x1 +) + type AddrinfoW struct { Flags int32 Family int32 @@ -1590,3 +1655,36 @@ const ( JobObjectNotificationLimitInformation2 = 34 JobObjectSecurityLimitInformation = 5 ) + +const ( + KF_FLAG_DEFAULT = 0x00000000 + KF_FLAG_FORCE_APP_DATA_REDIRECTION = 0x00080000 + KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET = 0x00040000 + KF_FLAG_FORCE_PACKAGE_REDIRECTION = 0x00020000 + KF_FLAG_NO_PACKAGE_REDIRECTION = 0x00010000 + KF_FLAG_FORCE_APPCONTAINER_REDIRECTION = 0x00020000 + KF_FLAG_NO_APPCONTAINER_REDIRECTION = 0x00010000 + KF_FLAG_CREATE = 0x00008000 + KF_FLAG_DONT_VERIFY = 0x00004000 + KF_FLAG_DONT_UNEXPAND = 0x00002000 + KF_FLAG_NO_ALIAS = 0x00001000 + KF_FLAG_INIT = 0x00000800 + KF_FLAG_DEFAULT_PATH = 0x00000400 + KF_FLAG_NOT_PARENT_RELATIVE = 0x00000200 + KF_FLAG_SIMPLE_IDLIST = 0x00000100 + KF_FLAG_ALIAS_ONLY = 0x80000000 +) + +type OsVersionInfoEx struct { + osVersionInfoSize uint32 + MajorVersion uint32 + MinorVersion uint32 + BuildNumber uint32 + PlatformId uint32 + CsdVersion [128]uint16 + ServicePackMajor uint16 + ServicePackMinor uint16 + SuiteMask uint16 + ProductType byte + _ byte +} diff --git a/vendor/golang.org/x/sys/windows/zerrors_windows.go b/vendor/golang.org/x/sys/windows/zerrors_windows.go index 2b4cea5b..f0212003 100644 --- a/vendor/golang.org/x/sys/windows/zerrors_windows.go +++ b/vendor/golang.org/x/sys/windows/zerrors_windows.go @@ -1,4 +1,4 @@ -// Code generated by 'go generate'; DO NOT EDIT. +// Code generated by 'mkerrors.bash'; DO NOT EDIT. package windows diff --git a/vendor/golang.org/x/sys/windows/zknownfolderids_windows.go b/vendor/golang.org/x/sys/windows/zknownfolderids_windows.go new file mode 100644 index 00000000..6048ac67 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/zknownfolderids_windows.go @@ -0,0 +1,149 @@ +// Code generated by 'mkknownfolderids.bash'; DO NOT EDIT. + +package windows + +type KNOWNFOLDERID GUID + +var ( + FOLDERID_NetworkFolder = &KNOWNFOLDERID{0xd20beec4, 0x5ca8, 0x4905, [8]byte{0xae, 0x3b, 0xbf, 0x25, 0x1e, 0xa0, 0x9b, 0x53}} + FOLDERID_ComputerFolder = &KNOWNFOLDERID{0x0ac0837c, 0xbbf8, 0x452a, [8]byte{0x85, 0x0d, 0x79, 0xd0, 0x8e, 0x66, 0x7c, 0xa7}} + FOLDERID_InternetFolder = &KNOWNFOLDERID{0x4d9f7874, 0x4e0c, 0x4904, [8]byte{0x96, 0x7b, 0x40, 0xb0, 0xd2, 0x0c, 0x3e, 0x4b}} + FOLDERID_ControlPanelFolder = &KNOWNFOLDERID{0x82a74aeb, 0xaeb4, 0x465c, [8]byte{0xa0, 0x14, 0xd0, 0x97, 0xee, 0x34, 0x6d, 0x63}} + FOLDERID_PrintersFolder = &KNOWNFOLDERID{0x76fc4e2d, 0xd6ad, 0x4519, [8]byte{0xa6, 0x63, 0x37, 0xbd, 0x56, 0x06, 0x81, 0x85}} + FOLDERID_SyncManagerFolder = &KNOWNFOLDERID{0x43668bf8, 0xc14e, 0x49b2, [8]byte{0x97, 0xc9, 0x74, 0x77, 0x84, 0xd7, 0x84, 0xb7}} + FOLDERID_SyncSetupFolder = &KNOWNFOLDERID{0x0f214138, 0xb1d3, 0x4a90, [8]byte{0xbb, 0xa9, 0x27, 0xcb, 0xc0, 0xc5, 0x38, 0x9a}} + FOLDERID_ConflictFolder = &KNOWNFOLDERID{0x4bfefb45, 0x347d, 0x4006, [8]byte{0xa5, 0xbe, 0xac, 0x0c, 0xb0, 0x56, 0x71, 0x92}} + FOLDERID_SyncResultsFolder = &KNOWNFOLDERID{0x289a9a43, 0xbe44, 0x4057, [8]byte{0xa4, 0x1b, 0x58, 0x7a, 0x76, 0xd7, 0xe7, 0xf9}} + FOLDERID_RecycleBinFolder = &KNOWNFOLDERID{0xb7534046, 0x3ecb, 0x4c18, [8]byte{0xbe, 0x4e, 0x64, 0xcd, 0x4c, 0xb7, 0xd6, 0xac}} + FOLDERID_ConnectionsFolder = &KNOWNFOLDERID{0x6f0cd92b, 0x2e97, 0x45d1, [8]byte{0x88, 0xff, 0xb0, 0xd1, 0x86, 0xb8, 0xde, 0xdd}} + FOLDERID_Fonts = &KNOWNFOLDERID{0xfd228cb7, 0xae11, 0x4ae3, [8]byte{0x86, 0x4c, 0x16, 0xf3, 0x91, 0x0a, 0xb8, 0xfe}} + FOLDERID_Desktop = &KNOWNFOLDERID{0xb4bfcc3a, 0xdb2c, 0x424c, [8]byte{0xb0, 0x29, 0x7f, 0xe9, 0x9a, 0x87, 0xc6, 0x41}} + FOLDERID_Startup = &KNOWNFOLDERID{0xb97d20bb, 0xf46a, 0x4c97, [8]byte{0xba, 0x10, 0x5e, 0x36, 0x08, 0x43, 0x08, 0x54}} + FOLDERID_Programs = &KNOWNFOLDERID{0xa77f5d77, 0x2e2b, 0x44c3, [8]byte{0xa6, 0xa2, 0xab, 0xa6, 0x01, 0x05, 0x4a, 0x51}} + FOLDERID_StartMenu = &KNOWNFOLDERID{0x625b53c3, 0xab48, 0x4ec1, [8]byte{0xba, 0x1f, 0xa1, 0xef, 0x41, 0x46, 0xfc, 0x19}} + FOLDERID_Recent = &KNOWNFOLDERID{0xae50c081, 0xebd2, 0x438a, [8]byte{0x86, 0x55, 0x8a, 0x09, 0x2e, 0x34, 0x98, 0x7a}} + FOLDERID_SendTo = &KNOWNFOLDERID{0x8983036c, 0x27c0, 0x404b, [8]byte{0x8f, 0x08, 0x10, 0x2d, 0x10, 0xdc, 0xfd, 0x74}} + FOLDERID_Documents = &KNOWNFOLDERID{0xfdd39ad0, 0x238f, 0x46af, [8]byte{0xad, 0xb4, 0x6c, 0x85, 0x48, 0x03, 0x69, 0xc7}} + FOLDERID_Favorites = &KNOWNFOLDERID{0x1777f761, 0x68ad, 0x4d8a, [8]byte{0x87, 0xbd, 0x30, 0xb7, 0x59, 0xfa, 0x33, 0xdd}} + FOLDERID_NetHood = &KNOWNFOLDERID{0xc5abbf53, 0xe17f, 0x4121, [8]byte{0x89, 0x00, 0x86, 0x62, 0x6f, 0xc2, 0xc9, 0x73}} + FOLDERID_PrintHood = &KNOWNFOLDERID{0x9274bd8d, 0xcfd1, 0x41c3, [8]byte{0xb3, 0x5e, 0xb1, 0x3f, 0x55, 0xa7, 0x58, 0xf4}} + FOLDERID_Templates = &KNOWNFOLDERID{0xa63293e8, 0x664e, 0x48db, [8]byte{0xa0, 0x79, 0xdf, 0x75, 0x9e, 0x05, 0x09, 0xf7}} + FOLDERID_CommonStartup = &KNOWNFOLDERID{0x82a5ea35, 0xd9cd, 0x47c5, [8]byte{0x96, 0x29, 0xe1, 0x5d, 0x2f, 0x71, 0x4e, 0x6e}} + FOLDERID_CommonPrograms = &KNOWNFOLDERID{0x0139d44e, 0x6afe, 0x49f2, [8]byte{0x86, 0x90, 0x3d, 0xaf, 0xca, 0xe6, 0xff, 0xb8}} + FOLDERID_CommonStartMenu = &KNOWNFOLDERID{0xa4115719, 0xd62e, 0x491d, [8]byte{0xaa, 0x7c, 0xe7, 0x4b, 0x8b, 0xe3, 0xb0, 0x67}} + FOLDERID_PublicDesktop = &KNOWNFOLDERID{0xc4aa340d, 0xf20f, 0x4863, [8]byte{0xaf, 0xef, 0xf8, 0x7e, 0xf2, 0xe6, 0xba, 0x25}} + FOLDERID_ProgramData = &KNOWNFOLDERID{0x62ab5d82, 0xfdc1, 0x4dc3, [8]byte{0xa9, 0xdd, 0x07, 0x0d, 0x1d, 0x49, 0x5d, 0x97}} + FOLDERID_CommonTemplates = &KNOWNFOLDERID{0xb94237e7, 0x57ac, 0x4347, [8]byte{0x91, 0x51, 0xb0, 0x8c, 0x6c, 0x32, 0xd1, 0xf7}} + FOLDERID_PublicDocuments = &KNOWNFOLDERID{0xed4824af, 0xdce4, 0x45a8, [8]byte{0x81, 0xe2, 0xfc, 0x79, 0x65, 0x08, 0x36, 0x34}} + FOLDERID_RoamingAppData = &KNOWNFOLDERID{0x3eb685db, 0x65f9, 0x4cf6, [8]byte{0xa0, 0x3a, 0xe3, 0xef, 0x65, 0x72, 0x9f, 0x3d}} + FOLDERID_LocalAppData = &KNOWNFOLDERID{0xf1b32785, 0x6fba, 0x4fcf, [8]byte{0x9d, 0x55, 0x7b, 0x8e, 0x7f, 0x15, 0x70, 0x91}} + FOLDERID_LocalAppDataLow = &KNOWNFOLDERID{0xa520a1a4, 0x1780, 0x4ff6, [8]byte{0xbd, 0x18, 0x16, 0x73, 0x43, 0xc5, 0xaf, 0x16}} + FOLDERID_InternetCache = &KNOWNFOLDERID{0x352481e8, 0x33be, 0x4251, [8]byte{0xba, 0x85, 0x60, 0x07, 0xca, 0xed, 0xcf, 0x9d}} + FOLDERID_Cookies = &KNOWNFOLDERID{0x2b0f765d, 0xc0e9, 0x4171, [8]byte{0x90, 0x8e, 0x08, 0xa6, 0x11, 0xb8, 0x4f, 0xf6}} + FOLDERID_History = &KNOWNFOLDERID{0xd9dc8a3b, 0xb784, 0x432e, [8]byte{0xa7, 0x81, 0x5a, 0x11, 0x30, 0xa7, 0x59, 0x63}} + FOLDERID_System = &KNOWNFOLDERID{0x1ac14e77, 0x02e7, 0x4e5d, [8]byte{0xb7, 0x44, 0x2e, 0xb1, 0xae, 0x51, 0x98, 0xb7}} + FOLDERID_SystemX86 = &KNOWNFOLDERID{0xd65231b0, 0xb2f1, 0x4857, [8]byte{0xa4, 0xce, 0xa8, 0xe7, 0xc6, 0xea, 0x7d, 0x27}} + FOLDERID_Windows = &KNOWNFOLDERID{0xf38bf404, 0x1d43, 0x42f2, [8]byte{0x93, 0x05, 0x67, 0xde, 0x0b, 0x28, 0xfc, 0x23}} + FOLDERID_Profile = &KNOWNFOLDERID{0x5e6c858f, 0x0e22, 0x4760, [8]byte{0x9a, 0xfe, 0xea, 0x33, 0x17, 0xb6, 0x71, 0x73}} + FOLDERID_Pictures = &KNOWNFOLDERID{0x33e28130, 0x4e1e, 0x4676, [8]byte{0x83, 0x5a, 0x98, 0x39, 0x5c, 0x3b, 0xc3, 0xbb}} + FOLDERID_ProgramFilesX86 = &KNOWNFOLDERID{0x7c5a40ef, 0xa0fb, 0x4bfc, [8]byte{0x87, 0x4a, 0xc0, 0xf2, 0xe0, 0xb9, 0xfa, 0x8e}} + FOLDERID_ProgramFilesCommonX86 = &KNOWNFOLDERID{0xde974d24, 0xd9c6, 0x4d3e, [8]byte{0xbf, 0x91, 0xf4, 0x45, 0x51, 0x20, 0xb9, 0x17}} + FOLDERID_ProgramFilesX64 = &KNOWNFOLDERID{0x6d809377, 0x6af0, 0x444b, [8]byte{0x89, 0x57, 0xa3, 0x77, 0x3f, 0x02, 0x20, 0x0e}} + FOLDERID_ProgramFilesCommonX64 = &KNOWNFOLDERID{0x6365d5a7, 0x0f0d, 0x45e5, [8]byte{0x87, 0xf6, 0x0d, 0xa5, 0x6b, 0x6a, 0x4f, 0x7d}} + FOLDERID_ProgramFiles = &KNOWNFOLDERID{0x905e63b6, 0xc1bf, 0x494e, [8]byte{0xb2, 0x9c, 0x65, 0xb7, 0x32, 0xd3, 0xd2, 0x1a}} + FOLDERID_ProgramFilesCommon = &KNOWNFOLDERID{0xf7f1ed05, 0x9f6d, 0x47a2, [8]byte{0xaa, 0xae, 0x29, 0xd3, 0x17, 0xc6, 0xf0, 0x66}} + FOLDERID_UserProgramFiles = &KNOWNFOLDERID{0x5cd7aee2, 0x2219, 0x4a67, [8]byte{0xb8, 0x5d, 0x6c, 0x9c, 0xe1, 0x56, 0x60, 0xcb}} + FOLDERID_UserProgramFilesCommon = &KNOWNFOLDERID{0xbcbd3057, 0xca5c, 0x4622, [8]byte{0xb4, 0x2d, 0xbc, 0x56, 0xdb, 0x0a, 0xe5, 0x16}} + FOLDERID_AdminTools = &KNOWNFOLDERID{0x724ef170, 0xa42d, 0x4fef, [8]byte{0x9f, 0x26, 0xb6, 0x0e, 0x84, 0x6f, 0xba, 0x4f}} + FOLDERID_CommonAdminTools = &KNOWNFOLDERID{0xd0384e7d, 0xbac3, 0x4797, [8]byte{0x8f, 0x14, 0xcb, 0xa2, 0x29, 0xb3, 0x92, 0xb5}} + FOLDERID_Music = &KNOWNFOLDERID{0x4bd8d571, 0x6d19, 0x48d3, [8]byte{0xbe, 0x97, 0x42, 0x22, 0x20, 0x08, 0x0e, 0x43}} + FOLDERID_Videos = &KNOWNFOLDERID{0x18989b1d, 0x99b5, 0x455b, [8]byte{0x84, 0x1c, 0xab, 0x7c, 0x74, 0xe4, 0xdd, 0xfc}} + FOLDERID_Ringtones = &KNOWNFOLDERID{0xc870044b, 0xf49e, 0x4126, [8]byte{0xa9, 0xc3, 0xb5, 0x2a, 0x1f, 0xf4, 0x11, 0xe8}} + FOLDERID_PublicPictures = &KNOWNFOLDERID{0xb6ebfb86, 0x6907, 0x413c, [8]byte{0x9a, 0xf7, 0x4f, 0xc2, 0xab, 0xf0, 0x7c, 0xc5}} + FOLDERID_PublicMusic = &KNOWNFOLDERID{0x3214fab5, 0x9757, 0x4298, [8]byte{0xbb, 0x61, 0x92, 0xa9, 0xde, 0xaa, 0x44, 0xff}} + FOLDERID_PublicVideos = &KNOWNFOLDERID{0x2400183a, 0x6185, 0x49fb, [8]byte{0xa2, 0xd8, 0x4a, 0x39, 0x2a, 0x60, 0x2b, 0xa3}} + FOLDERID_PublicRingtones = &KNOWNFOLDERID{0xe555ab60, 0x153b, 0x4d17, [8]byte{0x9f, 0x04, 0xa5, 0xfe, 0x99, 0xfc, 0x15, 0xec}} + FOLDERID_ResourceDir = &KNOWNFOLDERID{0x8ad10c31, 0x2adb, 0x4296, [8]byte{0xa8, 0xf7, 0xe4, 0x70, 0x12, 0x32, 0xc9, 0x72}} + FOLDERID_LocalizedResourcesDir = &KNOWNFOLDERID{0x2a00375e, 0x224c, 0x49de, [8]byte{0xb8, 0xd1, 0x44, 0x0d, 0xf7, 0xef, 0x3d, 0xdc}} + FOLDERID_CommonOEMLinks = &KNOWNFOLDERID{0xc1bae2d0, 0x10df, 0x4334, [8]byte{0xbe, 0xdd, 0x7a, 0xa2, 0x0b, 0x22, 0x7a, 0x9d}} + FOLDERID_CDBurning = &KNOWNFOLDERID{0x9e52ab10, 0xf80d, 0x49df, [8]byte{0xac, 0xb8, 0x43, 0x30, 0xf5, 0x68, 0x78, 0x55}} + FOLDERID_UserProfiles = &KNOWNFOLDERID{0x0762d272, 0xc50a, 0x4bb0, [8]byte{0xa3, 0x82, 0x69, 0x7d, 0xcd, 0x72, 0x9b, 0x80}} + FOLDERID_Playlists = &KNOWNFOLDERID{0xde92c1c7, 0x837f, 0x4f69, [8]byte{0xa3, 0xbb, 0x86, 0xe6, 0x31, 0x20, 0x4a, 0x23}} + FOLDERID_SamplePlaylists = &KNOWNFOLDERID{0x15ca69b3, 0x30ee, 0x49c1, [8]byte{0xac, 0xe1, 0x6b, 0x5e, 0xc3, 0x72, 0xaf, 0xb5}} + FOLDERID_SampleMusic = &KNOWNFOLDERID{0xb250c668, 0xf57d, 0x4ee1, [8]byte{0xa6, 0x3c, 0x29, 0x0e, 0xe7, 0xd1, 0xaa, 0x1f}} + FOLDERID_SamplePictures = &KNOWNFOLDERID{0xc4900540, 0x2379, 0x4c75, [8]byte{0x84, 0x4b, 0x64, 0xe6, 0xfa, 0xf8, 0x71, 0x6b}} + FOLDERID_SampleVideos = &KNOWNFOLDERID{0x859ead94, 0x2e85, 0x48ad, [8]byte{0xa7, 0x1a, 0x09, 0x69, 0xcb, 0x56, 0xa6, 0xcd}} + FOLDERID_PhotoAlbums = &KNOWNFOLDERID{0x69d2cf90, 0xfc33, 0x4fb7, [8]byte{0x9a, 0x0c, 0xeb, 0xb0, 0xf0, 0xfc, 0xb4, 0x3c}} + FOLDERID_Public = &KNOWNFOLDERID{0xdfdf76a2, 0xc82a, 0x4d63, [8]byte{0x90, 0x6a, 0x56, 0x44, 0xac, 0x45, 0x73, 0x85}} + FOLDERID_ChangeRemovePrograms = &KNOWNFOLDERID{0xdf7266ac, 0x9274, 0x4867, [8]byte{0x8d, 0x55, 0x3b, 0xd6, 0x61, 0xde, 0x87, 0x2d}} + FOLDERID_AppUpdates = &KNOWNFOLDERID{0xa305ce99, 0xf527, 0x492b, [8]byte{0x8b, 0x1a, 0x7e, 0x76, 0xfa, 0x98, 0xd6, 0xe4}} + FOLDERID_AddNewPrograms = &KNOWNFOLDERID{0xde61d971, 0x5ebc, 0x4f02, [8]byte{0xa3, 0xa9, 0x6c, 0x82, 0x89, 0x5e, 0x5c, 0x04}} + FOLDERID_Downloads = &KNOWNFOLDERID{0x374de290, 0x123f, 0x4565, [8]byte{0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b}} + FOLDERID_PublicDownloads = &KNOWNFOLDERID{0x3d644c9b, 0x1fb8, 0x4f30, [8]byte{0x9b, 0x45, 0xf6, 0x70, 0x23, 0x5f, 0x79, 0xc0}} + FOLDERID_SavedSearches = &KNOWNFOLDERID{0x7d1d3a04, 0xdebb, 0x4115, [8]byte{0x95, 0xcf, 0x2f, 0x29, 0xda, 0x29, 0x20, 0xda}} + FOLDERID_QuickLaunch = &KNOWNFOLDERID{0x52a4f021, 0x7b75, 0x48a9, [8]byte{0x9f, 0x6b, 0x4b, 0x87, 0xa2, 0x10, 0xbc, 0x8f}} + FOLDERID_Contacts = &KNOWNFOLDERID{0x56784854, 0xc6cb, 0x462b, [8]byte{0x81, 0x69, 0x88, 0xe3, 0x50, 0xac, 0xb8, 0x82}} + FOLDERID_SidebarParts = &KNOWNFOLDERID{0xa75d362e, 0x50fc, 0x4fb7, [8]byte{0xac, 0x2c, 0xa8, 0xbe, 0xaa, 0x31, 0x44, 0x93}} + FOLDERID_SidebarDefaultParts = &KNOWNFOLDERID{0x7b396e54, 0x9ec5, 0x4300, [8]byte{0xbe, 0x0a, 0x24, 0x82, 0xeb, 0xae, 0x1a, 0x26}} + FOLDERID_PublicGameTasks = &KNOWNFOLDERID{0xdebf2536, 0xe1a8, 0x4c59, [8]byte{0xb6, 0xa2, 0x41, 0x45, 0x86, 0x47, 0x6a, 0xea}} + FOLDERID_GameTasks = &KNOWNFOLDERID{0x054fae61, 0x4dd8, 0x4787, [8]byte{0x80, 0xb6, 0x09, 0x02, 0x20, 0xc4, 0xb7, 0x00}} + FOLDERID_SavedGames = &KNOWNFOLDERID{0x4c5c32ff, 0xbb9d, 0x43b0, [8]byte{0xb5, 0xb4, 0x2d, 0x72, 0xe5, 0x4e, 0xaa, 0xa4}} + FOLDERID_Games = &KNOWNFOLDERID{0xcac52c1a, 0xb53d, 0x4edc, [8]byte{0x92, 0xd7, 0x6b, 0x2e, 0x8a, 0xc1, 0x94, 0x34}} + FOLDERID_SEARCH_MAPI = &KNOWNFOLDERID{0x98ec0e18, 0x2098, 0x4d44, [8]byte{0x86, 0x44, 0x66, 0x97, 0x93, 0x15, 0xa2, 0x81}} + FOLDERID_SEARCH_CSC = &KNOWNFOLDERID{0xee32e446, 0x31ca, 0x4aba, [8]byte{0x81, 0x4f, 0xa5, 0xeb, 0xd2, 0xfd, 0x6d, 0x5e}} + FOLDERID_Links = &KNOWNFOLDERID{0xbfb9d5e0, 0xc6a9, 0x404c, [8]byte{0xb2, 0xb2, 0xae, 0x6d, 0xb6, 0xaf, 0x49, 0x68}} + FOLDERID_UsersFiles = &KNOWNFOLDERID{0xf3ce0f7c, 0x4901, 0x4acc, [8]byte{0x86, 0x48, 0xd5, 0xd4, 0x4b, 0x04, 0xef, 0x8f}} + FOLDERID_UsersLibraries = &KNOWNFOLDERID{0xa302545d, 0xdeff, 0x464b, [8]byte{0xab, 0xe8, 0x61, 0xc8, 0x64, 0x8d, 0x93, 0x9b}} + FOLDERID_SearchHome = &KNOWNFOLDERID{0x190337d1, 0xb8ca, 0x4121, [8]byte{0xa6, 0x39, 0x6d, 0x47, 0x2d, 0x16, 0x97, 0x2a}} + FOLDERID_OriginalImages = &KNOWNFOLDERID{0x2c36c0aa, 0x5812, 0x4b87, [8]byte{0xbf, 0xd0, 0x4c, 0xd0, 0xdf, 0xb1, 0x9b, 0x39}} + FOLDERID_DocumentsLibrary = &KNOWNFOLDERID{0x7b0db17d, 0x9cd2, 0x4a93, [8]byte{0x97, 0x33, 0x46, 0xcc, 0x89, 0x02, 0x2e, 0x7c}} + FOLDERID_MusicLibrary = &KNOWNFOLDERID{0x2112ab0a, 0xc86a, 0x4ffe, [8]byte{0xa3, 0x68, 0x0d, 0xe9, 0x6e, 0x47, 0x01, 0x2e}} + FOLDERID_PicturesLibrary = &KNOWNFOLDERID{0xa990ae9f, 0xa03b, 0x4e80, [8]byte{0x94, 0xbc, 0x99, 0x12, 0xd7, 0x50, 0x41, 0x04}} + FOLDERID_VideosLibrary = &KNOWNFOLDERID{0x491e922f, 0x5643, 0x4af4, [8]byte{0xa7, 0xeb, 0x4e, 0x7a, 0x13, 0x8d, 0x81, 0x74}} + FOLDERID_RecordedTVLibrary = &KNOWNFOLDERID{0x1a6fdba2, 0xf42d, 0x4358, [8]byte{0xa7, 0x98, 0xb7, 0x4d, 0x74, 0x59, 0x26, 0xc5}} + FOLDERID_HomeGroup = &KNOWNFOLDERID{0x52528a6b, 0xb9e3, 0x4add, [8]byte{0xb6, 0x0d, 0x58, 0x8c, 0x2d, 0xba, 0x84, 0x2d}} + FOLDERID_HomeGroupCurrentUser = &KNOWNFOLDERID{0x9b74b6a3, 0x0dfd, 0x4f11, [8]byte{0x9e, 0x78, 0x5f, 0x78, 0x00, 0xf2, 0xe7, 0x72}} + FOLDERID_DeviceMetadataStore = &KNOWNFOLDERID{0x5ce4a5e9, 0xe4eb, 0x479d, [8]byte{0xb8, 0x9f, 0x13, 0x0c, 0x02, 0x88, 0x61, 0x55}} + FOLDERID_Libraries = &KNOWNFOLDERID{0x1b3ea5dc, 0xb587, 0x4786, [8]byte{0xb4, 0xef, 0xbd, 0x1d, 0xc3, 0x32, 0xae, 0xae}} + FOLDERID_PublicLibraries = &KNOWNFOLDERID{0x48daf80b, 0xe6cf, 0x4f4e, [8]byte{0xb8, 0x00, 0x0e, 0x69, 0xd8, 0x4e, 0xe3, 0x84}} + FOLDERID_UserPinned = &KNOWNFOLDERID{0x9e3995ab, 0x1f9c, 0x4f13, [8]byte{0xb8, 0x27, 0x48, 0xb2, 0x4b, 0x6c, 0x71, 0x74}} + FOLDERID_ImplicitAppShortcuts = &KNOWNFOLDERID{0xbcb5256f, 0x79f6, 0x4cee, [8]byte{0xb7, 0x25, 0xdc, 0x34, 0xe4, 0x02, 0xfd, 0x46}} + FOLDERID_AccountPictures = &KNOWNFOLDERID{0x008ca0b1, 0x55b4, 0x4c56, [8]byte{0xb8, 0xa8, 0x4d, 0xe4, 0xb2, 0x99, 0xd3, 0xbe}} + FOLDERID_PublicUserTiles = &KNOWNFOLDERID{0x0482af6c, 0x08f1, 0x4c34, [8]byte{0x8c, 0x90, 0xe1, 0x7e, 0xc9, 0x8b, 0x1e, 0x17}} + FOLDERID_AppsFolder = &KNOWNFOLDERID{0x1e87508d, 0x89c2, 0x42f0, [8]byte{0x8a, 0x7e, 0x64, 0x5a, 0x0f, 0x50, 0xca, 0x58}} + FOLDERID_StartMenuAllPrograms = &KNOWNFOLDERID{0xf26305ef, 0x6948, 0x40b9, [8]byte{0xb2, 0x55, 0x81, 0x45, 0x3d, 0x09, 0xc7, 0x85}} + FOLDERID_CommonStartMenuPlaces = &KNOWNFOLDERID{0xa440879f, 0x87a0, 0x4f7d, [8]byte{0xb7, 0x00, 0x02, 0x07, 0xb9, 0x66, 0x19, 0x4a}} + FOLDERID_ApplicationShortcuts = &KNOWNFOLDERID{0xa3918781, 0xe5f2, 0x4890, [8]byte{0xb3, 0xd9, 0xa7, 0xe5, 0x43, 0x32, 0x32, 0x8c}} + FOLDERID_RoamingTiles = &KNOWNFOLDERID{0x00bcfc5a, 0xed94, 0x4e48, [8]byte{0x96, 0xa1, 0x3f, 0x62, 0x17, 0xf2, 0x19, 0x90}} + FOLDERID_RoamedTileImages = &KNOWNFOLDERID{0xaaa8d5a5, 0xf1d6, 0x4259, [8]byte{0xba, 0xa8, 0x78, 0xe7, 0xef, 0x60, 0x83, 0x5e}} + FOLDERID_Screenshots = &KNOWNFOLDERID{0xb7bede81, 0xdf94, 0x4682, [8]byte{0xa7, 0xd8, 0x57, 0xa5, 0x26, 0x20, 0xb8, 0x6f}} + FOLDERID_CameraRoll = &KNOWNFOLDERID{0xab5fb87b, 0x7ce2, 0x4f83, [8]byte{0x91, 0x5d, 0x55, 0x08, 0x46, 0xc9, 0x53, 0x7b}} + FOLDERID_SkyDrive = &KNOWNFOLDERID{0xa52bba46, 0xe9e1, 0x435f, [8]byte{0xb3, 0xd9, 0x28, 0xda, 0xa6, 0x48, 0xc0, 0xf6}} + FOLDERID_OneDrive = &KNOWNFOLDERID{0xa52bba46, 0xe9e1, 0x435f, [8]byte{0xb3, 0xd9, 0x28, 0xda, 0xa6, 0x48, 0xc0, 0xf6}} + FOLDERID_SkyDriveDocuments = &KNOWNFOLDERID{0x24d89e24, 0x2f19, 0x4534, [8]byte{0x9d, 0xde, 0x6a, 0x66, 0x71, 0xfb, 0xb8, 0xfe}} + FOLDERID_SkyDrivePictures = &KNOWNFOLDERID{0x339719b5, 0x8c47, 0x4894, [8]byte{0x94, 0xc2, 0xd8, 0xf7, 0x7a, 0xdd, 0x44, 0xa6}} + FOLDERID_SkyDriveMusic = &KNOWNFOLDERID{0xc3f2459e, 0x80d6, 0x45dc, [8]byte{0xbf, 0xef, 0x1f, 0x76, 0x9f, 0x2b, 0xe7, 0x30}} + FOLDERID_SkyDriveCameraRoll = &KNOWNFOLDERID{0x767e6811, 0x49cb, 0x4273, [8]byte{0x87, 0xc2, 0x20, 0xf3, 0x55, 0xe1, 0x08, 0x5b}} + FOLDERID_SearchHistory = &KNOWNFOLDERID{0x0d4c3db6, 0x03a3, 0x462f, [8]byte{0xa0, 0xe6, 0x08, 0x92, 0x4c, 0x41, 0xb5, 0xd4}} + FOLDERID_SearchTemplates = &KNOWNFOLDERID{0x7e636bfe, 0xdfa9, 0x4d5e, [8]byte{0xb4, 0x56, 0xd7, 0xb3, 0x98, 0x51, 0xd8, 0xa9}} + FOLDERID_CameraRollLibrary = &KNOWNFOLDERID{0x2b20df75, 0x1eda, 0x4039, [8]byte{0x80, 0x97, 0x38, 0x79, 0x82, 0x27, 0xd5, 0xb7}} + FOLDERID_SavedPictures = &KNOWNFOLDERID{0x3b193882, 0xd3ad, 0x4eab, [8]byte{0x96, 0x5a, 0x69, 0x82, 0x9d, 0x1f, 0xb5, 0x9f}} + FOLDERID_SavedPicturesLibrary = &KNOWNFOLDERID{0xe25b5812, 0xbe88, 0x4bd9, [8]byte{0x94, 0xb0, 0x29, 0x23, 0x34, 0x77, 0xb6, 0xc3}} + FOLDERID_RetailDemo = &KNOWNFOLDERID{0x12d4c69e, 0x24ad, 0x4923, [8]byte{0xbe, 0x19, 0x31, 0x32, 0x1c, 0x43, 0xa7, 0x67}} + FOLDERID_Device = &KNOWNFOLDERID{0x1c2ac1dc, 0x4358, 0x4b6c, [8]byte{0x97, 0x33, 0xaf, 0x21, 0x15, 0x65, 0x76, 0xf0}} + FOLDERID_DevelopmentFiles = &KNOWNFOLDERID{0xdbe8e08e, 0x3053, 0x4bbc, [8]byte{0xb1, 0x83, 0x2a, 0x7b, 0x2b, 0x19, 0x1e, 0x59}} + FOLDERID_Objects3D = &KNOWNFOLDERID{0x31c0dd25, 0x9439, 0x4f12, [8]byte{0xbf, 0x41, 0x7f, 0xf4, 0xed, 0xa3, 0x87, 0x22}} + FOLDERID_AppCaptures = &KNOWNFOLDERID{0xedc0fe71, 0x98d8, 0x4f4a, [8]byte{0xb9, 0x20, 0xc8, 0xdc, 0x13, 0x3c, 0xb1, 0x65}} + FOLDERID_LocalDocuments = &KNOWNFOLDERID{0xf42ee2d3, 0x909f, 0x4907, [8]byte{0x88, 0x71, 0x4c, 0x22, 0xfc, 0x0b, 0xf7, 0x56}} + FOLDERID_LocalPictures = &KNOWNFOLDERID{0x0ddd015d, 0xb06c, 0x45d5, [8]byte{0x8c, 0x4c, 0xf5, 0x97, 0x13, 0x85, 0x46, 0x39}} + FOLDERID_LocalVideos = &KNOWNFOLDERID{0x35286a68, 0x3c57, 0x41a1, [8]byte{0xbb, 0xb1, 0x0e, 0xae, 0x73, 0xd7, 0x6c, 0x95}} + FOLDERID_LocalMusic = &KNOWNFOLDERID{0xa0c69a99, 0x21c8, 0x4671, [8]byte{0x87, 0x03, 0x79, 0x34, 0x16, 0x2f, 0xcf, 0x1d}} + FOLDERID_LocalDownloads = &KNOWNFOLDERID{0x7d83ee9b, 0x2244, 0x4e70, [8]byte{0xb1, 0xf5, 0x53, 0x93, 0x04, 0x2a, 0xf1, 0xe4}} + FOLDERID_RecordedCalls = &KNOWNFOLDERID{0x2f8b40c2, 0x83ed, 0x48ee, [8]byte{0xb3, 0x83, 0xa1, 0xf1, 0x57, 0xec, 0x6f, 0x9a}} + FOLDERID_AllAppMods = &KNOWNFOLDERID{0x7ad67899, 0x66af, 0x43ba, [8]byte{0x91, 0x56, 0x6a, 0xad, 0x42, 0xe6, 0xc5, 0x96}} + FOLDERID_CurrentAppMods = &KNOWNFOLDERID{0x3db40b20, 0x2a30, 0x4dbe, [8]byte{0x91, 0x7e, 0x77, 0x1d, 0xd2, 0x1d, 0xd0, 0x99}} + FOLDERID_AppDataDesktop = &KNOWNFOLDERID{0xb2c5e279, 0x7add, 0x439f, [8]byte{0xb2, 0x8c, 0xc4, 0x1f, 0xe1, 0xbb, 0xf6, 0x72}} + FOLDERID_AppDataDocuments = &KNOWNFOLDERID{0x7be16610, 0x1f7f, 0x44ac, [8]byte{0xbf, 0xf0, 0x83, 0xe1, 0x5f, 0x2f, 0xfc, 0xa1}} + FOLDERID_AppDataFavorites = &KNOWNFOLDERID{0x7cfbefbc, 0xde1f, 0x45aa, [8]byte{0xb8, 0x43, 0xa5, 0x42, 0xac, 0x53, 0x6c, 0xc9}} + FOLDERID_AppDataProgramData = &KNOWNFOLDERID{0x559d40a3, 0xa036, 0x40fa, [8]byte{0xaf, 0x61, 0x84, 0xcb, 0x43, 0x0a, 0x4d, 0x34}} +) diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 96377a8e..9c448be3 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -42,6 +42,8 @@ var ( modmswsock = NewLazySystemDLL("mswsock.dll") modcrypt32 = NewLazySystemDLL("crypt32.dll") moduser32 = NewLazySystemDLL("user32.dll") + modole32 = NewLazySystemDLL("ole32.dll") + modntdll = NewLazySystemDLL("ntdll.dll") modws2_32 = NewLazySystemDLL("ws2_32.dll") moddnsapi = NewLazySystemDLL("dnsapi.dll") modiphlpapi = NewLazySystemDLL("iphlpapi.dll") @@ -59,6 +61,7 @@ var ( procDeleteService = modadvapi32.NewProc("DeleteService") procStartServiceW = modadvapi32.NewProc("StartServiceW") procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus") + procQueryServiceLockStatusW = modadvapi32.NewProc("QueryServiceLockStatusW") procControlService = modadvapi32.NewProc("ControlService") procStartServiceCtrlDispatcherW = modadvapi32.NewProc("StartServiceCtrlDispatcherW") procSetServiceStatus = modadvapi32.NewProc("SetServiceStatus") @@ -112,6 +115,7 @@ var ( procCreateProcessW = modkernel32.NewProc("CreateProcessW") procOpenProcess = modkernel32.NewProc("OpenProcess") procShellExecuteW = modshell32.NewProc("ShellExecuteW") + procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath") procTerminateProcess = modkernel32.NewProc("TerminateProcess") procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess") procGetStartupInfoW = modkernel32.NewProc("GetStartupInfoW") @@ -133,6 +137,7 @@ var ( procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock") procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock") + procGetTickCount64 = modkernel32.NewProc("GetTickCount64") procSetFileTime = modkernel32.NewProc("SetFileTime") procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") procSetFileAttributesW = modkernel32.NewProc("SetFileAttributesW") @@ -180,6 +185,8 @@ var ( procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") procProcess32FirstW = modkernel32.NewProc("Process32FirstW") procProcess32NextW = modkernel32.NewProc("Process32NextW") + procThread32First = modkernel32.NewProc("Thread32First") + procThread32Next = modkernel32.NewProc("Thread32Next") procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW") @@ -190,6 +197,10 @@ var ( procSetEvent = modkernel32.NewProc("SetEvent") procResetEvent = modkernel32.NewProc("ResetEvent") procPulseEvent = modkernel32.NewProc("PulseEvent") + procCreateMutexW = modkernel32.NewProc("CreateMutexW") + procCreateMutexExW = modkernel32.NewProc("CreateMutexExW") + procOpenMutexW = modkernel32.NewProc("OpenMutexW") + procReleaseMutex = modkernel32.NewProc("ReleaseMutex") procSleepEx = modkernel32.NewProc("SleepEx") procCreateJobObjectW = modkernel32.NewProc("CreateJobObjectW") procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject") @@ -199,6 +210,10 @@ var ( procSetPriorityClass = modkernel32.NewProc("SetPriorityClass") procGetPriorityClass = modkernel32.NewProc("GetPriorityClass") procSetInformationJobObject = modkernel32.NewProc("SetInformationJobObject") + procGenerateConsoleCtrlEvent = modkernel32.NewProc("GenerateConsoleCtrlEvent") + procGetProcessId = modkernel32.NewProc("GetProcessId") + procOpenThread = modkernel32.NewProc("OpenThread") + procSetProcessPriorityBoost = modkernel32.NewProc("SetProcessPriorityBoost") procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW") procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW") procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW") @@ -219,6 +234,12 @@ var ( procSetVolumeLabelW = modkernel32.NewProc("SetVolumeLabelW") procSetVolumeMountPointW = modkernel32.NewProc("SetVolumeMountPointW") procMessageBoxW = moduser32.NewProc("MessageBoxW") + procCLSIDFromString = modole32.NewProc("CLSIDFromString") + procStringFromGUID2 = modole32.NewProc("StringFromGUID2") + procCoCreateGuid = modole32.NewProc("CoCreateGuid") + procCoTaskMemFree = modole32.NewProc("CoTaskMemFree") + procRtlGetVersion = modntdll.NewProc("RtlGetVersion") + procRtlGetNtVersionNumbers = modntdll.NewProc("RtlGetNtVersionNumbers") procWSAStartup = modws2_32.NewProc("WSAStartup") procWSACleanup = modws2_32.NewProc("WSACleanup") procWSAIoctl = modws2_32.NewProc("WSAIoctl") @@ -288,6 +309,8 @@ var ( procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx") procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") procGetSystemDirectoryW = modkernel32.NewProc("GetSystemDirectoryW") + procGetWindowsDirectoryW = modkernel32.NewProc("GetWindowsDirectoryW") + procGetSystemWindowsDirectoryW = modkernel32.NewProc("GetSystemWindowsDirectoryW") procWTSQueryUserToken = modwtsapi32.NewProc("WTSQueryUserToken") procWTSEnumerateSessionsW = modwtsapi32.NewProc("WTSEnumerateSessionsW") procWTSFreeMemory = modwtsapi32.NewProc("WTSFreeMemory") @@ -417,6 +440,18 @@ func QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) { return } +func QueryServiceLockStatus(mgr Handle, lockStatus *QUERY_SERVICE_LOCK_STATUS, bufSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceLockStatusW.Addr(), 4, uintptr(mgr), uintptr(unsafe.Pointer(lockStatus)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) { r1, _, e1 := syscall.Syscall(procControlService.Addr(), 3, uintptr(service), uintptr(control), uintptr(unsafe.Pointer(status))) if r1 == 0 { @@ -1063,14 +1098,14 @@ func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityA return } -func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) { +func OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) { var _p0 uint32 if inheritHandle { _p0 = 1 } else { _p0 = 0 } - r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(da), uintptr(_p0), uintptr(pid)) + r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(processId)) handle = Handle(r0) if handle == 0 { if e1 != 0 { @@ -1094,6 +1129,14 @@ func ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *ui return } +func shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) { + r0, _, _ := syscall.Syscall6(procSHGetKnownFolderPath.Addr(), 4, uintptr(unsafe.Pointer(id)), uintptr(flags), uintptr(token), uintptr(unsafe.Pointer(path)), 0, 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + func TerminateProcess(handle Handle, exitcode uint32) (err error) { r1, _, e1 := syscall.Syscall(procTerminateProcess.Addr(), 2, uintptr(handle), uintptr(exitcode), 0) if r1 == 0 { @@ -1372,6 +1415,12 @@ func DestroyEnvironmentBlock(block *uint16) (err error) { return } +func getTickCount64() (ms uint64) { + r0, _, _ := syscall.Syscall(procGetTickCount64.Addr(), 0, 0, 0, 0) + ms = uint64(r0) + return +} + func SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) { r1, _, e1 := syscall.Syscall6(procSetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0) if r1 == 0 { @@ -1814,7 +1863,7 @@ func RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32 return } -func getCurrentProcessId() (pid uint32) { +func GetCurrentProcessId() (pid uint32) { r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0) pid = uint32(r0) return @@ -1917,6 +1966,30 @@ func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) { return } +func Thread32First(snapshot Handle, threadEntry *ThreadEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procThread32First.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(threadEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Thread32Next(snapshot Handle, threadEntry *ThreadEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procThread32Next.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(threadEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) { r1, _, e1 := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), uintptr(ioControlCode), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferSize), uintptr(unsafe.Pointer(outBuffer)), uintptr(outBufferSize), uintptr(unsafe.Pointer(bytesReturned)), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { @@ -2040,6 +2113,69 @@ func PulseEvent(event Handle) (err error) { return } +func CreateMutex(mutexAttrs *SecurityAttributes, initialOwner bool, name *uint16) (handle Handle, err error) { + var _p0 uint32 + if initialOwner { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procCreateMutexW.Addr(), 3, uintptr(unsafe.Pointer(mutexAttrs)), uintptr(_p0), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateMutexEx(mutexAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateMutexExW.Addr(), 4, uintptr(unsafe.Pointer(mutexAttrs)), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(desiredAccess), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenMutex(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenMutexW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReleaseMutex(mutex Handle) (err error) { + r1, _, e1 := syscall.Syscall(procReleaseMutex.Addr(), 1, uintptr(mutex), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func SleepEx(milliseconds uint32, alertable bool) (ret uint32) { var _p0 uint32 if alertable { @@ -2146,6 +2282,68 @@ func SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobOb return } +func GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGenerateConsoleCtrlEvent.Addr(), 2, uintptr(ctrlEvent), uintptr(processGroupID), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcessId(process Handle) (id uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetProcessId.Addr(), 1, uintptr(process), 0, 0) + id = uint32(r0) + if id == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenThread(desiredAccess uint32, inheritHandle bool, threadId uint32) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenThread.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(threadId)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetProcessPriorityBoost(process Handle, disable bool) (err error) { + var _p0 uint32 + if disable { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall(procSetProcessPriorityBoost.Addr(), 2, uintptr(process), uintptr(_p0), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) { r1, _, e1 := syscall.Syscall(procDefineDosDeviceW.Addr(), 3, uintptr(flags), uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath))) if r1 == 0 { @@ -2386,6 +2584,46 @@ func MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret return } +func clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) { + r0, _, _ := syscall.Syscall(procCLSIDFromString.Addr(), 2, uintptr(unsafe.Pointer(lpsz)), uintptr(unsafe.Pointer(pclsid)), 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) { + r0, _, _ := syscall.Syscall(procStringFromGUID2.Addr(), 3, uintptr(unsafe.Pointer(rguid)), uintptr(unsafe.Pointer(lpsz)), uintptr(cchMax)) + chars = int32(r0) + return +} + +func coCreateGuid(pguid *GUID) (ret error) { + r0, _, _ := syscall.Syscall(procCoCreateGuid.Addr(), 1, uintptr(unsafe.Pointer(pguid)), 0, 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func CoTaskMemFree(address unsafe.Pointer) { + syscall.Syscall(procCoTaskMemFree.Addr(), 1, uintptr(address), 0, 0) + return +} + +func rtlGetVersion(info *OsVersionInfoEx) (ret error) { + r0, _, _ := syscall.Syscall(procRtlGetVersion.Addr(), 1, uintptr(unsafe.Pointer(info)), 0, 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32) { + syscall.Syscall(procRtlGetNtVersionNumbers.Addr(), 3, uintptr(unsafe.Pointer(majorVersion)), uintptr(unsafe.Pointer(minorVersion)), uintptr(unsafe.Pointer(buildNumber))) + return +} + func WSAStartup(verreq uint32, data *WSAData) (sockerr error) { r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0) if r0 != 0 { @@ -3163,6 +3401,32 @@ func getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) { return } +func getWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetWindowsDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(dir)), uintptr(dirLen), 0) + len = uint32(r0) + if len == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getSystemWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetSystemWindowsDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(dir)), uintptr(dirLen), 0) + len = uint32(r0) + if len == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func WTSQueryUserToken(session uint32, token *Token) (err error) { r1, _, e1 := syscall.Syscall(procWTSQueryUserToken.Addr(), 2, uintptr(session), uintptr(unsafe.Pointer(token)), 0) if r1 == 0 { diff --git a/vendor/golang.org/x/text/encoding/charmap/maketables.go b/vendor/golang.org/x/text/encoding/charmap/maketables.go deleted file mode 100644 index f7941701..00000000 --- a/vendor/golang.org/x/text/encoding/charmap/maketables.go +++ /dev/null @@ -1,556 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "bufio" - "fmt" - "log" - "net/http" - "sort" - "strings" - "unicode/utf8" - - "golang.org/x/text/encoding" - "golang.org/x/text/internal/gen" -) - -const ascii = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + - "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + - ` !"#$%&'()*+,-./0123456789:;<=>?` + - `@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` + - "`abcdefghijklmnopqrstuvwxyz{|}~\u007f" - -var encodings = []struct { - name string - mib string - comment string - varName string - replacement byte - mapping string -}{ - { - "IBM Code Page 037", - "IBM037", - "", - "CodePage037", - 0x3f, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM037-2.1.2.ucm", - }, - { - "IBM Code Page 437", - "PC8CodePage437", - "", - "CodePage437", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM437-2.1.2.ucm", - }, - { - "IBM Code Page 850", - "PC850Multilingual", - "", - "CodePage850", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM850-2.1.2.ucm", - }, - { - "IBM Code Page 852", - "PCp852", - "", - "CodePage852", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM852-2.1.2.ucm", - }, - { - "IBM Code Page 855", - "IBM855", - "", - "CodePage855", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM855-2.1.2.ucm", - }, - { - "Windows Code Page 858", // PC latin1 with Euro - "IBM00858", - "", - "CodePage858", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/windows-858-2000.ucm", - }, - { - "IBM Code Page 860", - "IBM860", - "", - "CodePage860", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM860-2.1.2.ucm", - }, - { - "IBM Code Page 862", - "PC862LatinHebrew", - "", - "CodePage862", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM862-2.1.2.ucm", - }, - { - "IBM Code Page 863", - "IBM863", - "", - "CodePage863", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM863-2.1.2.ucm", - }, - { - "IBM Code Page 865", - "IBM865", - "", - "CodePage865", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM865-2.1.2.ucm", - }, - { - "IBM Code Page 866", - "IBM866", - "", - "CodePage866", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-ibm866.txt", - }, - { - "IBM Code Page 1047", - "IBM1047", - "", - "CodePage1047", - 0x3f, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM1047-2.1.2.ucm", - }, - { - "IBM Code Page 1140", - "IBM01140", - "", - "CodePage1140", - 0x3f, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/ibm-1140_P100-1997.ucm", - }, - { - "ISO 8859-1", - "ISOLatin1", - "", - "ISO8859_1", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_1-1998.ucm", - }, - { - "ISO 8859-2", - "ISOLatin2", - "", - "ISO8859_2", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-2.txt", - }, - { - "ISO 8859-3", - "ISOLatin3", - "", - "ISO8859_3", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-3.txt", - }, - { - "ISO 8859-4", - "ISOLatin4", - "", - "ISO8859_4", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-4.txt", - }, - { - "ISO 8859-5", - "ISOLatinCyrillic", - "", - "ISO8859_5", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-5.txt", - }, - { - "ISO 8859-6", - "ISOLatinArabic", - "", - "ISO8859_6,ISO8859_6E,ISO8859_6I", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-6.txt", - }, - { - "ISO 8859-7", - "ISOLatinGreek", - "", - "ISO8859_7", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-7.txt", - }, - { - "ISO 8859-8", - "ISOLatinHebrew", - "", - "ISO8859_8,ISO8859_8E,ISO8859_8I", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-8.txt", - }, - { - "ISO 8859-9", - "ISOLatin5", - "", - "ISO8859_9", - encoding.ASCIISub, - "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_9-1999.ucm", - }, - { - "ISO 8859-10", - "ISOLatin6", - "", - "ISO8859_10", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-10.txt", - }, - { - "ISO 8859-13", - "ISO885913", - "", - "ISO8859_13", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-13.txt", - }, - { - "ISO 8859-14", - "ISO885914", - "", - "ISO8859_14", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-14.txt", - }, - { - "ISO 8859-15", - "ISO885915", - "", - "ISO8859_15", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-15.txt", - }, - { - "ISO 8859-16", - "ISO885916", - "", - "ISO8859_16", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-iso-8859-16.txt", - }, - { - "KOI8-R", - "KOI8R", - "", - "KOI8R", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-koi8-r.txt", - }, - { - "KOI8-U", - "KOI8U", - "", - "KOI8U", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-koi8-u.txt", - }, - { - "Macintosh", - "Macintosh", - "", - "Macintosh", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-macintosh.txt", - }, - { - "Macintosh Cyrillic", - "MacintoshCyrillic", - "", - "MacintoshCyrillic", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-x-mac-cyrillic.txt", - }, - { - "Windows 874", - "Windows874", - "", - "Windows874", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-windows-874.txt", - }, - { - "Windows 1250", - "Windows1250", - "", - "Windows1250", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-windows-1250.txt", - }, - { - "Windows 1251", - "Windows1251", - "", - "Windows1251", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-windows-1251.txt", - }, - { - "Windows 1252", - "Windows1252", - "", - "Windows1252", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-windows-1252.txt", - }, - { - "Windows 1253", - "Windows1253", - "", - "Windows1253", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-windows-1253.txt", - }, - { - "Windows 1254", - "Windows1254", - "", - "Windows1254", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-windows-1254.txt", - }, - { - "Windows 1255", - "Windows1255", - "", - "Windows1255", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-windows-1255.txt", - }, - { - "Windows 1256", - "Windows1256", - "", - "Windows1256", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-windows-1256.txt", - }, - { - "Windows 1257", - "Windows1257", - "", - "Windows1257", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-windows-1257.txt", - }, - { - "Windows 1258", - "Windows1258", - "", - "Windows1258", - encoding.ASCIISub, - "http://encoding.spec.whatwg.org/index-windows-1258.txt", - }, - { - "X-User-Defined", - "XUserDefined", - "It is defined at http://encoding.spec.whatwg.org/#x-user-defined", - "XUserDefined", - encoding.ASCIISub, - ascii + - "\uf780\uf781\uf782\uf783\uf784\uf785\uf786\uf787" + - "\uf788\uf789\uf78a\uf78b\uf78c\uf78d\uf78e\uf78f" + - "\uf790\uf791\uf792\uf793\uf794\uf795\uf796\uf797" + - "\uf798\uf799\uf79a\uf79b\uf79c\uf79d\uf79e\uf79f" + - "\uf7a0\uf7a1\uf7a2\uf7a3\uf7a4\uf7a5\uf7a6\uf7a7" + - "\uf7a8\uf7a9\uf7aa\uf7ab\uf7ac\uf7ad\uf7ae\uf7af" + - "\uf7b0\uf7b1\uf7b2\uf7b3\uf7b4\uf7b5\uf7b6\uf7b7" + - "\uf7b8\uf7b9\uf7ba\uf7bb\uf7bc\uf7bd\uf7be\uf7bf" + - "\uf7c0\uf7c1\uf7c2\uf7c3\uf7c4\uf7c5\uf7c6\uf7c7" + - "\uf7c8\uf7c9\uf7ca\uf7cb\uf7cc\uf7cd\uf7ce\uf7cf" + - "\uf7d0\uf7d1\uf7d2\uf7d3\uf7d4\uf7d5\uf7d6\uf7d7" + - "\uf7d8\uf7d9\uf7da\uf7db\uf7dc\uf7dd\uf7de\uf7df" + - "\uf7e0\uf7e1\uf7e2\uf7e3\uf7e4\uf7e5\uf7e6\uf7e7" + - "\uf7e8\uf7e9\uf7ea\uf7eb\uf7ec\uf7ed\uf7ee\uf7ef" + - "\uf7f0\uf7f1\uf7f2\uf7f3\uf7f4\uf7f5\uf7f6\uf7f7" + - "\uf7f8\uf7f9\uf7fa\uf7fb\uf7fc\uf7fd\uf7fe\uf7ff", - }, -} - -func getWHATWG(url string) string { - res, err := http.Get(url) - if err != nil { - log.Fatalf("%q: Get: %v", url, err) - } - defer res.Body.Close() - - mapping := make([]rune, 128) - for i := range mapping { - mapping[i] = '\ufffd' - } - - scanner := bufio.NewScanner(res.Body) - for scanner.Scan() { - s := strings.TrimSpace(scanner.Text()) - if s == "" || s[0] == '#' { - continue - } - x, y := 0, 0 - if _, err := fmt.Sscanf(s, "%d\t0x%x", &x, &y); err != nil { - log.Fatalf("could not parse %q", s) - } - if x < 0 || 128 <= x { - log.Fatalf("code %d is out of range", x) - } - if 0x80 <= y && y < 0xa0 { - // We diverge from the WHATWG spec by mapping control characters - // in the range [0x80, 0xa0) to U+FFFD. - continue - } - mapping[x] = rune(y) - } - return ascii + string(mapping) -} - -func getUCM(url string) string { - res, err := http.Get(url) - if err != nil { - log.Fatalf("%q: Get: %v", url, err) - } - defer res.Body.Close() - - mapping := make([]rune, 256) - for i := range mapping { - mapping[i] = '\ufffd' - } - - charsFound := 0 - scanner := bufio.NewScanner(res.Body) - for scanner.Scan() { - s := strings.TrimSpace(scanner.Text()) - if s == "" || s[0] == '#' { - continue - } - var c byte - var r rune - if _, err := fmt.Sscanf(s, ` \x%x |0`, &r, &c); err != nil { - continue - } - mapping[c] = r - charsFound++ - } - - if charsFound < 200 { - log.Fatalf("%q: only %d characters found (wrong page format?)", url, charsFound) - } - - return string(mapping) -} - -func main() { - mibs := map[string]bool{} - all := []string{} - - w := gen.NewCodeWriter() - defer w.WriteGoFile("tables.go", "charmap") - - printf := func(s string, a ...interface{}) { fmt.Fprintf(w, s, a...) } - - printf("import (\n") - printf("\t\"golang.org/x/text/encoding\"\n") - printf("\t\"golang.org/x/text/encoding/internal/identifier\"\n") - printf(")\n\n") - for _, e := range encodings { - varNames := strings.Split(e.varName, ",") - all = append(all, varNames...) - varName := varNames[0] - switch { - case strings.HasPrefix(e.mapping, "http://encoding.spec.whatwg.org/"): - e.mapping = getWHATWG(e.mapping) - case strings.HasPrefix(e.mapping, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/"): - e.mapping = getUCM(e.mapping) - } - - asciiSuperset, low := strings.HasPrefix(e.mapping, ascii), 0x00 - if asciiSuperset { - low = 0x80 - } - lvn := 1 - if strings.HasPrefix(varName, "ISO") || strings.HasPrefix(varName, "KOI") { - lvn = 3 - } - lowerVarName := strings.ToLower(varName[:lvn]) + varName[lvn:] - printf("// %s is the %s encoding.\n", varName, e.name) - if e.comment != "" { - printf("//\n// %s\n", e.comment) - } - printf("var %s *Charmap = &%s\n\nvar %s = Charmap{\nname: %q,\n", - varName, lowerVarName, lowerVarName, e.name) - if mibs[e.mib] { - log.Fatalf("MIB type %q declared multiple times.", e.mib) - } - printf("mib: identifier.%s,\n", e.mib) - printf("asciiSuperset: %t,\n", asciiSuperset) - printf("low: 0x%02x,\n", low) - printf("replacement: 0x%02x,\n", e.replacement) - - printf("decode: [256]utf8Enc{\n") - i, backMapping := 0, map[rune]byte{} - for _, c := range e.mapping { - if _, ok := backMapping[c]; !ok && c != utf8.RuneError { - backMapping[c] = byte(i) - } - var buf [8]byte - n := utf8.EncodeRune(buf[:], c) - if n > 3 { - panic(fmt.Sprintf("rune %q (%U) is too long", c, c)) - } - printf("{%d,[3]byte{0x%02x,0x%02x,0x%02x}},", n, buf[0], buf[1], buf[2]) - if i%2 == 1 { - printf("\n") - } - i++ - } - printf("},\n") - - printf("encode: [256]uint32{\n") - encode := make([]uint32, 0, 256) - for c, i := range backMapping { - encode = append(encode, uint32(i)<<24|uint32(c)) - } - sort.Sort(byRune(encode)) - for len(encode) < cap(encode) { - encode = append(encode, encode[len(encode)-1]) - } - for i, enc := range encode { - printf("0x%08x,", enc) - if i%8 == 7 { - printf("\n") - } - } - printf("},\n}\n") - - // Add an estimate of the size of a single Charmap{} struct value, which - // includes two 256 elem arrays of 4 bytes and some extra fields, which - // align to 3 uint64s on 64-bit architectures. - w.Size += 2*4*256 + 3*8 - } - // TODO: add proper line breaking. - printf("var listAll = []encoding.Encoding{\n%s,\n}\n\n", strings.Join(all, ",\n")) -} - -type byRune []uint32 - -func (b byRune) Len() int { return len(b) } -func (b byRune) Less(i, j int) bool { return b[i]&0xffffff < b[j]&0xffffff } -func (b byRune) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/htmlindex/gen.go b/vendor/golang.org/x/text/encoding/htmlindex/gen.go deleted file mode 100644 index ac6b4a77..00000000 --- a/vendor/golang.org/x/text/encoding/htmlindex/gen.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "log" - "strings" - - "golang.org/x/text/internal/gen" -) - -type group struct { - Encodings []struct { - Labels []string - Name string - } -} - -func main() { - gen.Init() - - r := gen.Open("https://encoding.spec.whatwg.org", "whatwg", "encodings.json") - var groups []group - if err := json.NewDecoder(r).Decode(&groups); err != nil { - log.Fatalf("Error reading encodings.json: %v", err) - } - - w := &bytes.Buffer{} - fmt.Fprintln(w, "type htmlEncoding byte") - fmt.Fprintln(w, "const (") - for i, g := range groups { - for _, e := range g.Encodings { - key := strings.ToLower(e.Name) - name := consts[key] - if name == "" { - log.Fatalf("No const defined for %s.", key) - } - if i == 0 { - fmt.Fprintf(w, "%s htmlEncoding = iota\n", name) - } else { - fmt.Fprintf(w, "%s\n", name) - } - } - } - fmt.Fprintln(w, "numEncodings") - fmt.Fprint(w, ")\n\n") - - fmt.Fprintln(w, "var canonical = [numEncodings]string{") - for _, g := range groups { - for _, e := range g.Encodings { - fmt.Fprintf(w, "%q,\n", strings.ToLower(e.Name)) - } - } - fmt.Fprint(w, "}\n\n") - - fmt.Fprintln(w, "var nameMap = map[string]htmlEncoding{") - for _, g := range groups { - for _, e := range g.Encodings { - for _, l := range e.Labels { - key := strings.ToLower(e.Name) - name := consts[key] - fmt.Fprintf(w, "%q: %s,\n", l, name) - } - } - } - fmt.Fprint(w, "}\n\n") - - var tags []string - fmt.Fprintln(w, "var localeMap = []htmlEncoding{") - for _, loc := range locales { - tags = append(tags, loc.tag) - fmt.Fprintf(w, "%s, // %s \n", consts[loc.name], loc.tag) - } - fmt.Fprint(w, "}\n\n") - - fmt.Fprintf(w, "const locales = %q\n", strings.Join(tags, " ")) - - gen.WriteGoFile("tables.go", "htmlindex", w.Bytes()) -} - -// consts maps canonical encoding name to internal constant. -var consts = map[string]string{ - "utf-8": "utf8", - "ibm866": "ibm866", - "iso-8859-2": "iso8859_2", - "iso-8859-3": "iso8859_3", - "iso-8859-4": "iso8859_4", - "iso-8859-5": "iso8859_5", - "iso-8859-6": "iso8859_6", - "iso-8859-7": "iso8859_7", - "iso-8859-8": "iso8859_8", - "iso-8859-8-i": "iso8859_8I", - "iso-8859-10": "iso8859_10", - "iso-8859-13": "iso8859_13", - "iso-8859-14": "iso8859_14", - "iso-8859-15": "iso8859_15", - "iso-8859-16": "iso8859_16", - "koi8-r": "koi8r", - "koi8-u": "koi8u", - "macintosh": "macintosh", - "windows-874": "windows874", - "windows-1250": "windows1250", - "windows-1251": "windows1251", - "windows-1252": "windows1252", - "windows-1253": "windows1253", - "windows-1254": "windows1254", - "windows-1255": "windows1255", - "windows-1256": "windows1256", - "windows-1257": "windows1257", - "windows-1258": "windows1258", - "x-mac-cyrillic": "macintoshCyrillic", - "gbk": "gbk", - "gb18030": "gb18030", - // "hz-gb-2312": "hzgb2312", // Was removed from WhatWG - "big5": "big5", - "euc-jp": "eucjp", - "iso-2022-jp": "iso2022jp", - "shift_jis": "shiftJIS", - "euc-kr": "euckr", - "replacement": "replacement", - "utf-16be": "utf16be", - "utf-16le": "utf16le", - "x-user-defined": "xUserDefined", -} - -// locales is taken from -// https://html.spec.whatwg.org/multipage/syntax.html#encoding-sniffing-algorithm. -var locales = []struct{ tag, name string }{ - // The default value. Explicitly state latin to benefit from the exact - // script option, while still making 1252 the default encoding for languages - // written in Latin script. - {"und_Latn", "windows-1252"}, - {"ar", "windows-1256"}, - {"ba", "windows-1251"}, - {"be", "windows-1251"}, - {"bg", "windows-1251"}, - {"cs", "windows-1250"}, - {"el", "iso-8859-7"}, - {"et", "windows-1257"}, - {"fa", "windows-1256"}, - {"he", "windows-1255"}, - {"hr", "windows-1250"}, - {"hu", "iso-8859-2"}, - {"ja", "shift_jis"}, - {"kk", "windows-1251"}, - {"ko", "euc-kr"}, - {"ku", "windows-1254"}, - {"ky", "windows-1251"}, - {"lt", "windows-1257"}, - {"lv", "windows-1257"}, - {"mk", "windows-1251"}, - {"pl", "iso-8859-2"}, - {"ru", "windows-1251"}, - {"sah", "windows-1251"}, - {"sk", "windows-1250"}, - {"sl", "iso-8859-2"}, - {"sr", "windows-1251"}, - {"tg", "windows-1251"}, - {"th", "windows-874"}, - {"tr", "windows-1254"}, - {"tt", "windows-1251"}, - {"uk", "windows-1251"}, - {"vi", "windows-1258"}, - {"zh-hans", "gb18030"}, - {"zh-hant", "big5"}, -} diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/gen.go b/vendor/golang.org/x/text/encoding/internal/identifier/gen.go deleted file mode 100644 index 26cfef9c..00000000 --- a/vendor/golang.org/x/text/encoding/internal/identifier/gen.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "bytes" - "encoding/xml" - "fmt" - "io" - "log" - "strings" - - "golang.org/x/text/internal/gen" -) - -type registry struct { - XMLName xml.Name `xml:"registry"` - Updated string `xml:"updated"` - Registry []struct { - ID string `xml:"id,attr"` - Record []struct { - Name string `xml:"name"` - Xref []struct { - Type string `xml:"type,attr"` - Data string `xml:"data,attr"` - } `xml:"xref"` - Desc struct { - Data string `xml:",innerxml"` - // Any []struct { - // Data string `xml:",chardata"` - // } `xml:",any"` - // Data string `xml:",chardata"` - } `xml:"description,"` - MIB string `xml:"value"` - Alias []string `xml:"alias"` - MIME string `xml:"preferred_alias"` - } `xml:"record"` - } `xml:"registry"` -} - -func main() { - r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml") - reg := ®istry{} - if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF { - log.Fatalf("Error decoding charset registry: %v", err) - } - if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" { - log.Fatalf("Unexpected ID %s", reg.Registry[0].ID) - } - - w := &bytes.Buffer{} - fmt.Fprintf(w, "const (\n") - for _, rec := range reg.Registry[0].Record { - constName := "" - for _, a := range rec.Alias { - if strings.HasPrefix(a, "cs") && strings.IndexByte(a, '-') == -1 { - // Some of the constant definitions have comments in them. Strip those. - constName = strings.Title(strings.SplitN(a[2:], "\n", 2)[0]) - } - } - if constName == "" { - switch rec.MIB { - case "2085": - constName = "HZGB2312" // Not listed as alias for some reason. - default: - log.Fatalf("No cs alias defined for %s.", rec.MIB) - } - } - if rec.MIME != "" { - rec.MIME = fmt.Sprintf(" (MIME: %s)", rec.MIME) - } - fmt.Fprintf(w, "// %s is the MIB identifier with IANA name %s%s.\n//\n", constName, rec.Name, rec.MIME) - if len(rec.Desc.Data) > 0 { - fmt.Fprint(w, "// ") - d := xml.NewDecoder(strings.NewReader(rec.Desc.Data)) - inElem := true - attr := "" - for { - t, err := d.Token() - if err != nil { - if err != io.EOF { - log.Fatal(err) - } - break - } - switch x := t.(type) { - case xml.CharData: - attr = "" // Don't need attribute info. - a := bytes.Split([]byte(x), []byte("\n")) - for i, b := range a { - if b = bytes.TrimSpace(b); len(b) != 0 { - if !inElem && i > 0 { - fmt.Fprint(w, "\n// ") - } - inElem = false - fmt.Fprintf(w, "%s ", string(b)) - } - } - case xml.StartElement: - if x.Name.Local == "xref" { - inElem = true - use := false - for _, a := range x.Attr { - if a.Name.Local == "type" { - use = use || a.Value != "person" - } - if a.Name.Local == "data" && use { - // Patch up URLs to use https. From some links, the - // https version is different from the http one. - s := a.Value - s = strings.Replace(s, "http://", "https://", -1) - s = strings.Replace(s, "/unicode/", "/", -1) - attr = s + " " - } - } - } - case xml.EndElement: - inElem = false - fmt.Fprint(w, attr) - } - } - fmt.Fprint(w, "\n") - } - for _, x := range rec.Xref { - switch x.Type { - case "rfc": - fmt.Fprintf(w, "// Reference: %s\n", strings.ToUpper(x.Data)) - case "uri": - fmt.Fprintf(w, "// Reference: %s\n", x.Data) - } - } - fmt.Fprintf(w, "%s MIB = %s\n", constName, rec.MIB) - fmt.Fprintln(w) - } - fmt.Fprintln(w, ")") - - gen.WriteGoFile("mib.go", "identifier", w.Bytes()) -} diff --git a/vendor/golang.org/x/text/encoding/japanese/maketables.go b/vendor/golang.org/x/text/encoding/japanese/maketables.go deleted file mode 100644 index 023957a6..00000000 --- a/vendor/golang.org/x/text/encoding/japanese/maketables.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This program generates tables.go: -// go run maketables.go | gofmt > tables.go - -// TODO: Emoji extensions? -// https://www.unicode.org/faq/emoji_dingbats.html -// https://www.unicode.org/Public/UNIDATA/EmojiSources.txt - -import ( - "bufio" - "fmt" - "log" - "net/http" - "sort" - "strings" -) - -type entry struct { - jisCode, table int -} - -func main() { - fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") - fmt.Printf("// Package japanese provides Japanese encodings such as EUC-JP and Shift JIS.\n") - fmt.Printf(`package japanese // import "golang.org/x/text/encoding/japanese"` + "\n\n") - - reverse := [65536]entry{} - for i := range reverse { - reverse[i].table = -1 - } - - tables := []struct { - url string - name string - }{ - {"http://encoding.spec.whatwg.org/index-jis0208.txt", "0208"}, - {"http://encoding.spec.whatwg.org/index-jis0212.txt", "0212"}, - } - for i, table := range tables { - res, err := http.Get(table.url) - if err != nil { - log.Fatalf("%q: Get: %v", table.url, err) - } - defer res.Body.Close() - - mapping := [65536]uint16{} - - scanner := bufio.NewScanner(res.Body) - for scanner.Scan() { - s := strings.TrimSpace(scanner.Text()) - if s == "" || s[0] == '#' { - continue - } - x, y := 0, uint16(0) - if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { - log.Fatalf("%q: could not parse %q", table.url, s) - } - if x < 0 || 120*94 <= x { - log.Fatalf("%q: JIS code %d is out of range", table.url, x) - } - mapping[x] = y - if reverse[y].table == -1 { - reverse[y] = entry{jisCode: x, table: i} - } - } - if err := scanner.Err(); err != nil { - log.Fatalf("%q: scanner error: %v", table.url, err) - } - - fmt.Printf("// jis%sDecode is the decoding table from JIS %s code to Unicode.\n// It is defined at %s\n", - table.name, table.name, table.url) - fmt.Printf("var jis%sDecode = [...]uint16{\n", table.name) - for i, m := range mapping { - if m != 0 { - fmt.Printf("\t%d: 0x%04X,\n", i, m) - } - } - fmt.Printf("}\n\n") - } - - // Any run of at least separation continuous zero entries in the reverse map will - // be a separate encode table. - const separation = 1024 - - intervals := []interval(nil) - low, high := -1, -1 - for i, v := range reverse { - if v.table == -1 { - continue - } - if low < 0 { - low = i - } else if i-high >= separation { - if high >= 0 { - intervals = append(intervals, interval{low, high}) - } - low = i - } - high = i + 1 - } - if high >= 0 { - intervals = append(intervals, interval{low, high}) - } - sort.Sort(byDecreasingLength(intervals)) - - fmt.Printf("const (\n") - fmt.Printf("\tjis0208 = 1\n") - fmt.Printf("\tjis0212 = 2\n") - fmt.Printf("\tcodeMask = 0x7f\n") - fmt.Printf("\tcodeShift = 7\n") - fmt.Printf("\ttableShift = 14\n") - fmt.Printf(")\n\n") - - fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) - fmt.Printf("// encodeX are the encoding tables from Unicode to JIS code,\n") - fmt.Printf("// sorted by decreasing length.\n") - for i, v := range intervals { - fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) - } - fmt.Printf("//\n") - fmt.Printf("// The high two bits of the value record whether the JIS code comes from the\n") - fmt.Printf("// JIS0208 table (high bits == 1) or the JIS0212 table (high bits == 2).\n") - fmt.Printf("// The low 14 bits are two 7-bit unsigned integers j1 and j2 that form the\n") - fmt.Printf("// JIS code (94*j1 + j2) within that table.\n") - fmt.Printf("\n") - - for i, v := range intervals { - fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) - fmt.Printf("var encode%d = [...]uint16{\n", i) - for j := v.low; j < v.high; j++ { - x := reverse[j] - if x.table == -1 { - continue - } - fmt.Printf("\t%d - %d: jis%s<<14 | 0x%02X<<7 | 0x%02X,\n", - j, v.low, tables[x.table].name, x.jisCode/94, x.jisCode%94) - } - fmt.Printf("}\n\n") - } -} - -// interval is a half-open interval [low, high). -type interval struct { - low, high int -} - -func (i interval) len() int { return i.high - i.low } - -// byDecreasingLength sorts intervals by decreasing length. -type byDecreasingLength []interval - -func (b byDecreasingLength) Len() int { return len(b) } -func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } -func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/korean/maketables.go b/vendor/golang.org/x/text/encoding/korean/maketables.go deleted file mode 100644 index c84034fb..00000000 --- a/vendor/golang.org/x/text/encoding/korean/maketables.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This program generates tables.go: -// go run maketables.go | gofmt > tables.go - -import ( - "bufio" - "fmt" - "log" - "net/http" - "sort" - "strings" -) - -func main() { - fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") - fmt.Printf("// Package korean provides Korean encodings such as EUC-KR.\n") - fmt.Printf(`package korean // import "golang.org/x/text/encoding/korean"` + "\n\n") - - res, err := http.Get("http://encoding.spec.whatwg.org/index-euc-kr.txt") - if err != nil { - log.Fatalf("Get: %v", err) - } - defer res.Body.Close() - - mapping := [65536]uint16{} - reverse := [65536]uint16{} - - scanner := bufio.NewScanner(res.Body) - for scanner.Scan() { - s := strings.TrimSpace(scanner.Text()) - if s == "" || s[0] == '#' { - continue - } - x, y := uint16(0), uint16(0) - if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { - log.Fatalf("could not parse %q", s) - } - if x < 0 || 178*(0xc7-0x81)+(0xfe-0xc7)*94+(0xff-0xa1) <= x { - log.Fatalf("EUC-KR code %d is out of range", x) - } - mapping[x] = y - if reverse[y] == 0 { - c0, c1 := uint16(0), uint16(0) - if x < 178*(0xc7-0x81) { - c0 = uint16(x/178) + 0x81 - c1 = uint16(x % 178) - switch { - case c1 < 1*26: - c1 += 0x41 - case c1 < 2*26: - c1 += 0x47 - default: - c1 += 0x4d - } - } else { - x -= 178 * (0xc7 - 0x81) - c0 = uint16(x/94) + 0xc7 - c1 = uint16(x%94) + 0xa1 - } - reverse[y] = c0<<8 | c1 - } - } - if err := scanner.Err(); err != nil { - log.Fatalf("scanner error: %v", err) - } - - fmt.Printf("// decode is the decoding table from EUC-KR code to Unicode.\n") - fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-euc-kr.txt\n") - fmt.Printf("var decode = [...]uint16{\n") - for i, v := range mapping { - if v != 0 { - fmt.Printf("\t%d: 0x%04X,\n", i, v) - } - } - fmt.Printf("}\n\n") - - // Any run of at least separation continuous zero entries in the reverse map will - // be a separate encode table. - const separation = 1024 - - intervals := []interval(nil) - low, high := -1, -1 - for i, v := range reverse { - if v == 0 { - continue - } - if low < 0 { - low = i - } else if i-high >= separation { - if high >= 0 { - intervals = append(intervals, interval{low, high}) - } - low = i - } - high = i + 1 - } - if high >= 0 { - intervals = append(intervals, interval{low, high}) - } - sort.Sort(byDecreasingLength(intervals)) - - fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) - fmt.Printf("// encodeX are the encoding tables from Unicode to EUC-KR code,\n") - fmt.Printf("// sorted by decreasing length.\n") - for i, v := range intervals { - fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) - } - fmt.Printf("\n") - - for i, v := range intervals { - fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) - fmt.Printf("var encode%d = [...]uint16{\n", i) - for j := v.low; j < v.high; j++ { - x := reverse[j] - if x == 0 { - continue - } - fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) - } - fmt.Printf("}\n\n") - } -} - -// interval is a half-open interval [low, high). -type interval struct { - low, high int -} - -func (i interval) len() int { return i.high - i.low } - -// byDecreasingLength sorts intervals by decreasing length. -type byDecreasingLength []interval - -func (b byDecreasingLength) Len() int { return len(b) } -func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } -func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go deleted file mode 100644 index 55016c78..00000000 --- a/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This program generates tables.go: -// go run maketables.go | gofmt > tables.go - -import ( - "bufio" - "fmt" - "log" - "net/http" - "sort" - "strings" -) - -func main() { - fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") - fmt.Printf("// Package simplifiedchinese provides Simplified Chinese encodings such as GBK.\n") - fmt.Printf(`package simplifiedchinese // import "golang.org/x/text/encoding/simplifiedchinese"` + "\n\n") - - printGB18030() - printGBK() -} - -func printGB18030() { - res, err := http.Get("http://encoding.spec.whatwg.org/index-gb18030.txt") - if err != nil { - log.Fatalf("Get: %v", err) - } - defer res.Body.Close() - - fmt.Printf("// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt\n") - fmt.Printf("var gb18030 = [...][2]uint16{\n") - scanner := bufio.NewScanner(res.Body) - for scanner.Scan() { - s := strings.TrimSpace(scanner.Text()) - if s == "" || s[0] == '#' { - continue - } - x, y := uint32(0), uint32(0) - if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { - log.Fatalf("could not parse %q", s) - } - if x < 0x10000 && y < 0x10000 { - fmt.Printf("\t{0x%04x, 0x%04x},\n", x, y) - } - } - fmt.Printf("}\n\n") -} - -func printGBK() { - res, err := http.Get("http://encoding.spec.whatwg.org/index-gbk.txt") - if err != nil { - log.Fatalf("Get: %v", err) - } - defer res.Body.Close() - - mapping := [65536]uint16{} - reverse := [65536]uint16{} - - scanner := bufio.NewScanner(res.Body) - for scanner.Scan() { - s := strings.TrimSpace(scanner.Text()) - if s == "" || s[0] == '#' { - continue - } - x, y := uint16(0), uint16(0) - if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { - log.Fatalf("could not parse %q", s) - } - if x < 0 || 126*190 <= x { - log.Fatalf("GBK code %d is out of range", x) - } - mapping[x] = y - if reverse[y] == 0 { - c0, c1 := x/190, x%190 - if c1 >= 0x3f { - c1++ - } - reverse[y] = (0x81+c0)<<8 | (0x40 + c1) - } - } - if err := scanner.Err(); err != nil { - log.Fatalf("scanner error: %v", err) - } - - fmt.Printf("// decode is the decoding table from GBK code to Unicode.\n") - fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt\n") - fmt.Printf("var decode = [...]uint16{\n") - for i, v := range mapping { - if v != 0 { - fmt.Printf("\t%d: 0x%04X,\n", i, v) - } - } - fmt.Printf("}\n\n") - - // Any run of at least separation continuous zero entries in the reverse map will - // be a separate encode table. - const separation = 1024 - - intervals := []interval(nil) - low, high := -1, -1 - for i, v := range reverse { - if v == 0 { - continue - } - if low < 0 { - low = i - } else if i-high >= separation { - if high >= 0 { - intervals = append(intervals, interval{low, high}) - } - low = i - } - high = i + 1 - } - if high >= 0 { - intervals = append(intervals, interval{low, high}) - } - sort.Sort(byDecreasingLength(intervals)) - - fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) - fmt.Printf("// encodeX are the encoding tables from Unicode to GBK code,\n") - fmt.Printf("// sorted by decreasing length.\n") - for i, v := range intervals { - fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) - } - fmt.Printf("\n") - - for i, v := range intervals { - fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) - fmt.Printf("var encode%d = [...]uint16{\n", i) - for j := v.low; j < v.high; j++ { - x := reverse[j] - if x == 0 { - continue - } - fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) - } - fmt.Printf("}\n\n") - } -} - -// interval is a half-open interval [low, high). -type interval struct { - low, high int -} - -func (i interval) len() int { return i.high - i.low } - -// byDecreasingLength sorts intervals by decreasing length. -type byDecreasingLength []interval - -func (b byDecreasingLength) Len() int { return len(b) } -func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } -func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go b/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go deleted file mode 100644 index cf7fdb31..00000000 --- a/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This program generates tables.go: -// go run maketables.go | gofmt > tables.go - -import ( - "bufio" - "fmt" - "log" - "net/http" - "sort" - "strings" -) - -func main() { - fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") - fmt.Printf("// Package traditionalchinese provides Traditional Chinese encodings such as Big5.\n") - fmt.Printf(`package traditionalchinese // import "golang.org/x/text/encoding/traditionalchinese"` + "\n\n") - - res, err := http.Get("http://encoding.spec.whatwg.org/index-big5.txt") - if err != nil { - log.Fatalf("Get: %v", err) - } - defer res.Body.Close() - - mapping := [65536]uint32{} - reverse := [65536 * 4]uint16{} - - scanner := bufio.NewScanner(res.Body) - for scanner.Scan() { - s := strings.TrimSpace(scanner.Text()) - if s == "" || s[0] == '#' { - continue - } - x, y := uint16(0), uint32(0) - if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { - log.Fatalf("could not parse %q", s) - } - if x < 0 || 126*157 <= x { - log.Fatalf("Big5 code %d is out of range", x) - } - mapping[x] = y - - // The WHATWG spec http://encoding.spec.whatwg.org/#indexes says that - // "The index pointer for code point in index is the first pointer - // corresponding to code point in index", which would normally mean - // that the code below should be guarded by "if reverse[y] == 0", but - // last instead of first seems to match the behavior of - // "iconv -f UTF-8 -t BIG5". For example, U+8005 者 occurs twice in - // http://encoding.spec.whatwg.org/index-big5.txt, as index 2148 - // (encoded as "\x8e\xcd") and index 6543 (encoded as "\xaa\xcc") - // and "echo 者 | iconv -f UTF-8 -t BIG5 | xxd" gives "\xaa\xcc". - c0, c1 := x/157, x%157 - if c1 < 0x3f { - c1 += 0x40 - } else { - c1 += 0x62 - } - reverse[y] = (0x81+c0)<<8 | c1 - } - if err := scanner.Err(); err != nil { - log.Fatalf("scanner error: %v", err) - } - - fmt.Printf("// decode is the decoding table from Big5 code to Unicode.\n") - fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-big5.txt\n") - fmt.Printf("var decode = [...]uint32{\n") - for i, v := range mapping { - if v != 0 { - fmt.Printf("\t%d: 0x%08X,\n", i, v) - } - } - fmt.Printf("}\n\n") - - // Any run of at least separation continuous zero entries in the reverse map will - // be a separate encode table. - const separation = 1024 - - intervals := []interval(nil) - low, high := -1, -1 - for i, v := range reverse { - if v == 0 { - continue - } - if low < 0 { - low = i - } else if i-high >= separation { - if high >= 0 { - intervals = append(intervals, interval{low, high}) - } - low = i - } - high = i + 1 - } - if high >= 0 { - intervals = append(intervals, interval{low, high}) - } - sort.Sort(byDecreasingLength(intervals)) - - fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) - fmt.Printf("// encodeX are the encoding tables from Unicode to Big5 code,\n") - fmt.Printf("// sorted by decreasing length.\n") - for i, v := range intervals { - fmt.Printf("// encode%d: %5d entries for runes in [%6d, %6d).\n", i, v.len(), v.low, v.high) - } - fmt.Printf("\n") - - for i, v := range intervals { - fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) - fmt.Printf("var encode%d = [...]uint16{\n", i) - for j := v.low; j < v.high; j++ { - x := reverse[j] - if x == 0 { - continue - } - fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) - } - fmt.Printf("}\n\n") - } -} - -// interval is a half-open interval [low, high). -type interval struct { - low, high int -} - -func (i interval) len() int { return i.high - i.low } - -// byDecreasingLength sorts intervals by decreasing length. -type byDecreasingLength []interval - -func (b byDecreasingLength) Len() int { return len(b) } -func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } -func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/internal/language/compact/gen.go b/vendor/golang.org/x/text/internal/language/compact/gen.go deleted file mode 100644 index 0c36a052..00000000 --- a/vendor/golang.org/x/text/internal/language/compact/gen.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Language tag table generator. -// Data read from the web. - -package main - -import ( - "flag" - "fmt" - "log" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/unicode/cldr" -) - -var ( - test = flag.Bool("test", - false, - "test existing tables; can be used to compare web data with package data.") - outputFile = flag.String("output", - "tables.go", - "output file for generated tables") -) - -func main() { - gen.Init() - - w := gen.NewCodeWriter() - defer w.WriteGoFile("tables.go", "compact") - - fmt.Fprintln(w, `import "golang.org/x/text/internal/language"`) - - b := newBuilder(w) - gen.WriteCLDRVersion(w) - - b.writeCompactIndex() -} - -type builder struct { - w *gen.CodeWriter - data *cldr.CLDR - supp *cldr.SupplementalData -} - -func newBuilder(w *gen.CodeWriter) *builder { - r := gen.OpenCLDRCoreZip() - defer r.Close() - d := &cldr.Decoder{} - data, err := d.DecodeZip(r) - if err != nil { - log.Fatal(err) - } - b := builder{ - w: w, - data: data, - supp: data.Supplemental(), - } - return &b -} diff --git a/vendor/golang.org/x/text/internal/language/compact/gen_index.go b/vendor/golang.org/x/text/internal/language/compact/gen_index.go deleted file mode 100644 index 136cefaf..00000000 --- a/vendor/golang.org/x/text/internal/language/compact/gen_index.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This file generates derivative tables based on the language package itself. - -import ( - "fmt" - "log" - "sort" - "strings" - - "golang.org/x/text/internal/language" -) - -// Compact indices: -// Note -va-X variants only apply to localization variants. -// BCP variants only ever apply to language. -// The only ambiguity between tags is with regions. - -func (b *builder) writeCompactIndex() { - // Collect all language tags for which we have any data in CLDR. - m := map[language.Tag]bool{} - for _, lang := range b.data.Locales() { - // We include all locales unconditionally to be consistent with en_US. - // We want en_US, even though it has no data associated with it. - - // TODO: put any of the languages for which no data exists at the end - // of the index. This allows all components based on ICU to use that - // as the cutoff point. - // if x := data.RawLDML(lang); false || - // x.LocaleDisplayNames != nil || - // x.Characters != nil || - // x.Delimiters != nil || - // x.Measurement != nil || - // x.Dates != nil || - // x.Numbers != nil || - // x.Units != nil || - // x.ListPatterns != nil || - // x.Collations != nil || - // x.Segmentations != nil || - // x.Rbnf != nil || - // x.Annotations != nil || - // x.Metadata != nil { - - // TODO: support POSIX natively, albeit non-standard. - tag := language.Make(strings.Replace(lang, "_POSIX", "-u-va-posix", 1)) - m[tag] = true - // } - } - - // TODO: plural rules are also defined for the deprecated tags: - // iw mo sh tl - // Consider removing these as compact tags. - - // Include locales for plural rules, which uses a different structure. - for _, plurals := range b.supp.Plurals { - for _, rules := range plurals.PluralRules { - for _, lang := range strings.Split(rules.Locales, " ") { - m[language.Make(lang)] = true - } - } - } - - var coreTags []language.CompactCoreInfo - var special []string - - for t := range m { - if x := t.Extensions(); len(x) != 0 && fmt.Sprint(x) != "[u-va-posix]" { - log.Fatalf("Unexpected extension %v in %v", x, t) - } - if len(t.Variants()) == 0 && len(t.Extensions()) == 0 { - cci, ok := language.GetCompactCore(t) - if !ok { - log.Fatalf("Locale for non-basic language %q", t) - } - coreTags = append(coreTags, cci) - } else { - special = append(special, t.String()) - } - } - - w := b.w - - sort.Slice(coreTags, func(i, j int) bool { return coreTags[i] < coreTags[j] }) - sort.Strings(special) - - w.WriteComment(` - NumCompactTags is the number of common tags. The maximum tag is - NumCompactTags-1.`) - w.WriteConst("NumCompactTags", len(m)) - - fmt.Fprintln(w, "const (") - for i, t := range coreTags { - fmt.Fprintf(w, "%s ID = %d\n", ident(t.Tag().String()), i) - } - for i, t := range special { - fmt.Fprintf(w, "%s ID = %d\n", ident(t), i+len(coreTags)) - } - fmt.Fprintln(w, ")") - - w.WriteVar("coreTags", coreTags) - - w.WriteConst("specialTagsStr", strings.Join(special, " ")) -} - -func ident(s string) string { - return strings.Replace(s, "-", "", -1) + "Index" -} diff --git a/vendor/golang.org/x/text/internal/language/compact/gen_parents.go b/vendor/golang.org/x/text/internal/language/compact/gen_parents.go deleted file mode 100644 index 9543d583..00000000 --- a/vendor/golang.org/x/text/internal/language/compact/gen_parents.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "log" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/language" - "golang.org/x/text/internal/language/compact" - "golang.org/x/text/unicode/cldr" -) - -func main() { - r := gen.OpenCLDRCoreZip() - defer r.Close() - - d := &cldr.Decoder{} - data, err := d.DecodeZip(r) - if err != nil { - log.Fatalf("DecodeZip: %v", err) - } - - w := gen.NewCodeWriter() - defer w.WriteGoFile("parents.go", "compact") - - // Create parents table. - type ID uint16 - parents := make([]ID, compact.NumCompactTags) - for _, loc := range data.Locales() { - tag := language.MustParse(loc) - index, ok := compact.FromTag(tag) - if !ok { - continue - } - parentIndex := compact.ID(0) // und - for p := tag.Parent(); p != language.Und; p = p.Parent() { - if x, ok := compact.FromTag(p); ok { - parentIndex = x - break - } - } - parents[index] = ID(parentIndex) - } - - w.WriteComment(` - parents maps a compact index of a tag to the compact index of the parent of - this tag.`) - w.WriteVar("parents", parents) -} diff --git a/vendor/golang.org/x/text/internal/language/gen.go b/vendor/golang.org/x/text/internal/language/gen.go deleted file mode 100644 index cdcc7feb..00000000 --- a/vendor/golang.org/x/text/internal/language/gen.go +++ /dev/null @@ -1,1520 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Language tag table generator. -// Data read from the web. - -package main - -import ( - "bufio" - "flag" - "fmt" - "io" - "io/ioutil" - "log" - "math" - "reflect" - "regexp" - "sort" - "strconv" - "strings" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/tag" - "golang.org/x/text/unicode/cldr" -) - -var ( - test = flag.Bool("test", - false, - "test existing tables; can be used to compare web data with package data.") - outputFile = flag.String("output", - "tables.go", - "output file for generated tables") -) - -var comment = []string{ - ` -lang holds an alphabetically sorted list of ISO-639 language identifiers. -All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag. -For 2-byte language identifiers, the two successive bytes have the following meaning: - - if the first letter of the 2- and 3-letter ISO codes are the same: - the second and third letter of the 3-letter ISO code. - - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3. -For 3-byte language identifiers the 4th byte is 0.`, - ` -langNoIndex is a bit vector of all 3-letter language codes that are not used as an index -in lookup tables. The language ids for these language codes are derived directly -from the letters and are not consecutive.`, - ` -altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives -to 2-letter language codes that cannot be derived using the method described above. -Each 3-letter code is followed by its 1-byte langID.`, - ` -altLangIndex is used to convert indexes in altLangISO3 to langIDs.`, - ` -AliasMap maps langIDs to their suggested replacements.`, - ` -script is an alphabetically sorted list of ISO 15924 codes. The index -of the script in the string, divided by 4, is the internal scriptID.`, - ` -isoRegionOffset needs to be added to the index of regionISO to obtain the regionID -for 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for -the UN.M49 codes used for groups.)`, - ` -regionISO holds a list of alphabetically sorted 2-letter ISO region codes. -Each 2-letter codes is followed by two bytes with the following meaning: - - [A-Z}{2}: the first letter of the 2-letter code plus these two - letters form the 3-letter ISO code. - - 0, n: index into altRegionISO3.`, - ` -regionTypes defines the status of a region for various standards.`, - ` -m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are -codes indicating collections of regions.`, - ` -m49Index gives indexes into fromM49 based on the three most significant bits -of a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in - fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]] -for an entry where the first 7 bits match the 7 lsb of the UN.M49 code. -The region code is stored in the 9 lsb of the indexed value.`, - ` -fromM49 contains entries to map UN.M49 codes to regions. See m49Index for details.`, - ` -altRegionISO3 holds a list of 3-letter region codes that cannot be -mapped to 2-letter codes using the default algorithm. This is a short list.`, - ` -altRegionIDs holds a list of regionIDs the positions of which match those -of the 3-letter ISO codes in altRegionISO3.`, - ` -variantNumSpecialized is the number of specialized variants in variants.`, - ` -suppressScript is an index from langID to the dominant script for that language, -if it exists. If a script is given, it should be suppressed from the language tag.`, - ` -likelyLang is a lookup table, indexed by langID, for the most likely -scripts and regions given incomplete information. If more entries exist for a -given language, region and script are the index and size respectively -of the list in likelyLangList.`, - ` -likelyLangList holds lists info associated with likelyLang.`, - ` -likelyRegion is a lookup table, indexed by regionID, for the most likely -languages and scripts given incomplete information. If more entries exist -for a given regionID, lang and script are the index and size respectively -of the list in likelyRegionList. -TODO: exclude containers and user-definable regions from the list.`, - ` -likelyRegionList holds lists info associated with likelyRegion.`, - ` -likelyScript is a lookup table, indexed by scriptID, for the most likely -languages and regions given a script.`, - ` -nRegionGroups is the number of region groups.`, - ` -regionInclusion maps region identifiers to sets of regions in regionInclusionBits, -where each set holds all groupings that are directly connected in a region -containment graph.`, - ` -regionInclusionBits is an array of bit vectors where every vector represents -a set of region groupings. These sets are used to compute the distance -between two regions for the purpose of language matching.`, - ` -regionInclusionNext marks, for each entry in regionInclusionBits, the set of -all groups that are reachable from the groups set in the respective entry.`, -} - -// TODO: consider changing some of these structures to tries. This can reduce -// memory, but may increase the need for memory allocations. This could be -// mitigated if we can piggyback on language tags for common cases. - -func failOnError(e error) { - if e != nil { - log.Panic(e) - } -} - -type setType int - -const ( - Indexed setType = 1 + iota // all elements must be of same size - Linear -) - -type stringSet struct { - s []string - sorted, frozen bool - - // We often need to update values after the creation of an index is completed. - // We include a convenience map for keeping track of this. - update map[string]string - typ setType // used for checking. -} - -func (ss *stringSet) clone() stringSet { - c := *ss - c.s = append([]string(nil), c.s...) - return c -} - -func (ss *stringSet) setType(t setType) { - if ss.typ != t && ss.typ != 0 { - log.Panicf("type %d cannot be assigned as it was already %d", t, ss.typ) - } -} - -// parse parses a whitespace-separated string and initializes ss with its -// components. -func (ss *stringSet) parse(s string) { - scan := bufio.NewScanner(strings.NewReader(s)) - scan.Split(bufio.ScanWords) - for scan.Scan() { - ss.add(scan.Text()) - } -} - -func (ss *stringSet) assertChangeable() { - if ss.frozen { - log.Panic("attempt to modify a frozen stringSet") - } -} - -func (ss *stringSet) add(s string) { - ss.assertChangeable() - ss.s = append(ss.s, s) - ss.sorted = ss.frozen -} - -func (ss *stringSet) freeze() { - ss.compact() - ss.frozen = true -} - -func (ss *stringSet) compact() { - if ss.sorted { - return - } - a := ss.s - sort.Strings(a) - k := 0 - for i := 1; i < len(a); i++ { - if a[k] != a[i] { - a[k+1] = a[i] - k++ - } - } - ss.s = a[:k+1] - ss.sorted = ss.frozen -} - -type funcSorter struct { - fn func(a, b string) bool - sort.StringSlice -} - -func (s funcSorter) Less(i, j int) bool { - return s.fn(s.StringSlice[i], s.StringSlice[j]) -} - -func (ss *stringSet) sortFunc(f func(a, b string) bool) { - ss.compact() - sort.Sort(funcSorter{f, sort.StringSlice(ss.s)}) -} - -func (ss *stringSet) remove(s string) { - ss.assertChangeable() - if i, ok := ss.find(s); ok { - copy(ss.s[i:], ss.s[i+1:]) - ss.s = ss.s[:len(ss.s)-1] - } -} - -func (ss *stringSet) replace(ol, nu string) { - ss.s[ss.index(ol)] = nu - ss.sorted = ss.frozen -} - -func (ss *stringSet) index(s string) int { - ss.setType(Indexed) - i, ok := ss.find(s) - if !ok { - if i < len(ss.s) { - log.Panicf("find: item %q is not in list. Closest match is %q.", s, ss.s[i]) - } - log.Panicf("find: item %q is not in list", s) - - } - return i -} - -func (ss *stringSet) find(s string) (int, bool) { - ss.compact() - i := sort.SearchStrings(ss.s, s) - return i, i != len(ss.s) && ss.s[i] == s -} - -func (ss *stringSet) slice() []string { - ss.compact() - return ss.s -} - -func (ss *stringSet) updateLater(v, key string) { - if ss.update == nil { - ss.update = map[string]string{} - } - ss.update[v] = key -} - -// join joins the string and ensures that all entries are of the same length. -func (ss *stringSet) join() string { - ss.setType(Indexed) - n := len(ss.s[0]) - for _, s := range ss.s { - if len(s) != n { - log.Panicf("join: not all entries are of the same length: %q", s) - } - } - ss.s = append(ss.s, strings.Repeat("\xff", n)) - return strings.Join(ss.s, "") -} - -// ianaEntry holds information for an entry in the IANA Language Subtag Repository. -// All types use the same entry. -// See http://tools.ietf.org/html/bcp47#section-5.1 for a description of the various -// fields. -type ianaEntry struct { - typ string - description []string - scope string - added string - preferred string - deprecated string - suppressScript string - macro string - prefix []string -} - -type builder struct { - w *gen.CodeWriter - hw io.Writer // MultiWriter for w and w.Hash - data *cldr.CLDR - supp *cldr.SupplementalData - - // indices - locale stringSet // common locales - lang stringSet // canonical language ids (2 or 3 letter ISO codes) with data - langNoIndex stringSet // 3-letter ISO codes with no associated data - script stringSet // 4-letter ISO codes - region stringSet // 2-letter ISO or 3-digit UN M49 codes - variant stringSet // 4-8-alphanumeric variant code. - - // Region codes that are groups with their corresponding group IDs. - groups map[int]index - - // langInfo - registry map[string]*ianaEntry -} - -type index uint - -func newBuilder(w *gen.CodeWriter) *builder { - r := gen.OpenCLDRCoreZip() - defer r.Close() - d := &cldr.Decoder{} - data, err := d.DecodeZip(r) - failOnError(err) - b := builder{ - w: w, - hw: io.MultiWriter(w, w.Hash), - data: data, - supp: data.Supplemental(), - } - b.parseRegistry() - return &b -} - -func (b *builder) parseRegistry() { - r := gen.OpenIANAFile("assignments/language-subtag-registry") - defer r.Close() - b.registry = make(map[string]*ianaEntry) - - scan := bufio.NewScanner(r) - scan.Split(bufio.ScanWords) - var record *ianaEntry - for more := scan.Scan(); more; { - key := scan.Text() - more = scan.Scan() - value := scan.Text() - switch key { - case "Type:": - record = &ianaEntry{typ: value} - case "Subtag:", "Tag:": - if s := strings.SplitN(value, "..", 2); len(s) > 1 { - for a := s[0]; a <= s[1]; a = inc(a) { - b.addToRegistry(a, record) - } - } else { - b.addToRegistry(value, record) - } - case "Suppress-Script:": - record.suppressScript = value - case "Added:": - record.added = value - case "Deprecated:": - record.deprecated = value - case "Macrolanguage:": - record.macro = value - case "Preferred-Value:": - record.preferred = value - case "Prefix:": - record.prefix = append(record.prefix, value) - case "Scope:": - record.scope = value - case "Description:": - buf := []byte(value) - for more = scan.Scan(); more; more = scan.Scan() { - b := scan.Bytes() - if b[0] == '%' || b[len(b)-1] == ':' { - break - } - buf = append(buf, ' ') - buf = append(buf, b...) - } - record.description = append(record.description, string(buf)) - continue - default: - continue - } - more = scan.Scan() - } - if scan.Err() != nil { - log.Panic(scan.Err()) - } -} - -func (b *builder) addToRegistry(key string, entry *ianaEntry) { - if info, ok := b.registry[key]; ok { - if info.typ != "language" || entry.typ != "extlang" { - log.Fatalf("parseRegistry: tag %q already exists", key) - } - } else { - b.registry[key] = entry - } -} - -var commentIndex = make(map[string]string) - -func init() { - for _, s := range comment { - key := strings.TrimSpace(strings.SplitN(s, " ", 2)[0]) - commentIndex[key] = s - } -} - -func (b *builder) comment(name string) { - if s := commentIndex[name]; len(s) > 0 { - b.w.WriteComment(s) - } else { - fmt.Fprintln(b.w) - } -} - -func (b *builder) pf(f string, x ...interface{}) { - fmt.Fprintf(b.hw, f, x...) - fmt.Fprint(b.hw, "\n") -} - -func (b *builder) p(x ...interface{}) { - fmt.Fprintln(b.hw, x...) -} - -func (b *builder) addSize(s int) { - b.w.Size += s - b.pf("// Size: %d bytes", s) -} - -func (b *builder) writeConst(name string, x interface{}) { - b.comment(name) - b.w.WriteConst(name, x) -} - -// writeConsts computes f(v) for all v in values and writes the results -// as constants named _v to a single constant block. -func (b *builder) writeConsts(f func(string) int, values ...string) { - b.pf("const (") - for _, v := range values { - b.pf("\t_%s = %v", v, f(v)) - } - b.pf(")") -} - -// writeType writes the type of the given value, which must be a struct. -func (b *builder) writeType(value interface{}) { - b.comment(reflect.TypeOf(value).Name()) - b.w.WriteType(value) -} - -func (b *builder) writeSlice(name string, ss interface{}) { - b.writeSliceAddSize(name, 0, ss) -} - -func (b *builder) writeSliceAddSize(name string, extraSize int, ss interface{}) { - b.comment(name) - b.w.Size += extraSize - v := reflect.ValueOf(ss) - t := v.Type().Elem() - b.pf("// Size: %d bytes, %d elements", v.Len()*int(t.Size())+extraSize, v.Len()) - - fmt.Fprintf(b.w, "var %s = ", name) - b.w.WriteArray(ss) - b.p() -} - -type FromTo struct { - From, To uint16 -} - -func (b *builder) writeSortedMap(name string, ss *stringSet, index func(s string) uint16) { - ss.sortFunc(func(a, b string) bool { - return index(a) < index(b) - }) - m := []FromTo{} - for _, s := range ss.s { - m = append(m, FromTo{index(s), index(ss.update[s])}) - } - b.writeSlice(name, m) -} - -const base = 'z' - 'a' + 1 - -func strToInt(s string) uint { - v := uint(0) - for i := 0; i < len(s); i++ { - v *= base - v += uint(s[i] - 'a') - } - return v -} - -// converts the given integer to the original ASCII string passed to strToInt. -// len(s) must match the number of characters obtained. -func intToStr(v uint, s []byte) { - for i := len(s) - 1; i >= 0; i-- { - s[i] = byte(v%base) + 'a' - v /= base - } -} - -func (b *builder) writeBitVector(name string, ss []string) { - vec := make([]uint8, int(math.Ceil(math.Pow(base, float64(len(ss[0])))/8))) - for _, s := range ss { - v := strToInt(s) - vec[v/8] |= 1 << (v % 8) - } - b.writeSlice(name, vec) -} - -// TODO: convert this type into a list or two-stage trie. -func (b *builder) writeMapFunc(name string, m map[string]string, f func(string) uint16) { - b.comment(name) - v := reflect.ValueOf(m) - sz := v.Len() * (2 + int(v.Type().Key().Size())) - for _, k := range m { - sz += len(k) - } - b.addSize(sz) - keys := []string{} - b.pf(`var %s = map[string]uint16{`, name) - for k := range m { - keys = append(keys, k) - } - sort.Strings(keys) - for _, k := range keys { - b.pf("\t%q: %v,", k, f(m[k])) - } - b.p("}") -} - -func (b *builder) writeMap(name string, m interface{}) { - b.comment(name) - v := reflect.ValueOf(m) - sz := v.Len() * (2 + int(v.Type().Key().Size()) + int(v.Type().Elem().Size())) - b.addSize(sz) - f := strings.FieldsFunc(fmt.Sprintf("%#v", m), func(r rune) bool { - return strings.IndexRune("{}, ", r) != -1 - }) - sort.Strings(f[1:]) - b.pf(`var %s = %s{`, name, f[0]) - for _, kv := range f[1:] { - b.pf("\t%s,", kv) - } - b.p("}") -} - -func (b *builder) langIndex(s string) uint16 { - if s == "und" { - return 0 - } - if i, ok := b.lang.find(s); ok { - return uint16(i) - } - return uint16(strToInt(s)) + uint16(len(b.lang.s)) -} - -// inc advances the string to its lexicographical successor. -func inc(s string) string { - const maxTagLength = 4 - var buf [maxTagLength]byte - intToStr(strToInt(strings.ToLower(s))+1, buf[:len(s)]) - for i := 0; i < len(s); i++ { - if s[i] <= 'Z' { - buf[i] -= 'a' - 'A' - } - } - return string(buf[:len(s)]) -} - -func (b *builder) parseIndices() { - meta := b.supp.Metadata - - for k, v := range b.registry { - var ss *stringSet - switch v.typ { - case "language": - if len(k) == 2 || v.suppressScript != "" || v.scope == "special" { - b.lang.add(k) - continue - } else { - ss = &b.langNoIndex - } - case "region": - ss = &b.region - case "script": - ss = &b.script - case "variant": - ss = &b.variant - default: - continue - } - ss.add(k) - } - // Include any language for which there is data. - for _, lang := range b.data.Locales() { - if x := b.data.RawLDML(lang); false || - x.LocaleDisplayNames != nil || - x.Characters != nil || - x.Delimiters != nil || - x.Measurement != nil || - x.Dates != nil || - x.Numbers != nil || - x.Units != nil || - x.ListPatterns != nil || - x.Collations != nil || - x.Segmentations != nil || - x.Rbnf != nil || - x.Annotations != nil || - x.Metadata != nil { - - from := strings.Split(lang, "_") - if lang := from[0]; lang != "root" { - b.lang.add(lang) - } - } - } - // Include locales for plural rules, which uses a different structure. - for _, plurals := range b.data.Supplemental().Plurals { - for _, rules := range plurals.PluralRules { - for _, lang := range strings.Split(rules.Locales, " ") { - if lang = strings.Split(lang, "_")[0]; lang != "root" { - b.lang.add(lang) - } - } - } - } - // Include languages in likely subtags. - for _, m := range b.supp.LikelySubtags.LikelySubtag { - from := strings.Split(m.From, "_") - b.lang.add(from[0]) - } - // Include ISO-639 alpha-3 bibliographic entries. - for _, a := range meta.Alias.LanguageAlias { - if a.Reason == "bibliographic" { - b.langNoIndex.add(a.Type) - } - } - // Include regions in territoryAlias (not all are in the IANA registry!) - for _, reg := range b.supp.Metadata.Alias.TerritoryAlias { - if len(reg.Type) == 2 { - b.region.add(reg.Type) - } - } - - for _, s := range b.lang.s { - if len(s) == 3 { - b.langNoIndex.remove(s) - } - } - b.writeConst("NumLanguages", len(b.lang.slice())+len(b.langNoIndex.slice())) - b.writeConst("NumScripts", len(b.script.slice())) - b.writeConst("NumRegions", len(b.region.slice())) - - // Add dummy codes at the start of each list to represent "unspecified". - b.lang.add("---") - b.script.add("----") - b.region.add("---") - - // common locales - b.locale.parse(meta.DefaultContent.Locales) -} - -// TODO: region inclusion data will probably not be use used in future matchers. - -func (b *builder) computeRegionGroups() { - b.groups = make(map[int]index) - - // Create group indices. - for i := 1; b.region.s[i][0] < 'A'; i++ { // Base M49 indices on regionID. - b.groups[i] = index(len(b.groups)) - } - for _, g := range b.supp.TerritoryContainment.Group { - // Skip UN and EURO zone as they are flattening the containment - // relationship. - if g.Type == "EZ" || g.Type == "UN" { - continue - } - group := b.region.index(g.Type) - if _, ok := b.groups[group]; !ok { - b.groups[group] = index(len(b.groups)) - } - } - if len(b.groups) > 64 { - log.Fatalf("only 64 groups supported, found %d", len(b.groups)) - } - b.writeConst("nRegionGroups", len(b.groups)) -} - -var langConsts = []string{ - "af", "am", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", - "et", "fa", "fi", "fil", "fr", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", - "it", "ja", "ka", "kk", "km", "kn", "ko", "ky", "lo", "lt", "lv", "mk", "ml", - "mn", "mo", "mr", "ms", "mul", "my", "nb", "ne", "nl", "no", "pa", "pl", "pt", - "ro", "ru", "sh", "si", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th", - "tl", "tn", "tr", "uk", "ur", "uz", "vi", "zh", "zu", - - // constants for grandfathered tags (if not already defined) - "jbo", "ami", "bnn", "hak", "tlh", "lb", "nv", "pwn", "tao", "tay", "tsu", - "nn", "sfb", "vgt", "sgg", "cmn", "nan", "hsn", -} - -// writeLanguage generates all tables needed for language canonicalization. -func (b *builder) writeLanguage() { - meta := b.supp.Metadata - - b.writeConst("nonCanonicalUnd", b.lang.index("und")) - b.writeConsts(func(s string) int { return int(b.langIndex(s)) }, langConsts...) - b.writeConst("langPrivateStart", b.langIndex("qaa")) - b.writeConst("langPrivateEnd", b.langIndex("qtz")) - - // Get language codes that need to be mapped (overlong 3-letter codes, - // deprecated 2-letter codes, legacy and grandfathered tags.) - langAliasMap := stringSet{} - aliasTypeMap := map[string]AliasType{} - - // altLangISO3 get the alternative ISO3 names that need to be mapped. - altLangISO3 := stringSet{} - // Add dummy start to avoid the use of index 0. - altLangISO3.add("---") - altLangISO3.updateLater("---", "aa") - - lang := b.lang.clone() - for _, a := range meta.Alias.LanguageAlias { - if a.Replacement == "" { - a.Replacement = "und" - } - // TODO: support mapping to tags - repl := strings.SplitN(a.Replacement, "_", 2)[0] - if a.Reason == "overlong" { - if len(a.Replacement) == 2 && len(a.Type) == 3 { - lang.updateLater(a.Replacement, a.Type) - } - } else if len(a.Type) <= 3 { - switch a.Reason { - case "macrolanguage": - aliasTypeMap[a.Type] = Macro - case "deprecated": - // handled elsewhere - continue - case "bibliographic", "legacy": - if a.Type == "no" { - continue - } - aliasTypeMap[a.Type] = Legacy - default: - log.Fatalf("new %s alias: %s", a.Reason, a.Type) - } - langAliasMap.add(a.Type) - langAliasMap.updateLater(a.Type, repl) - } - } - // Manually add the mapping of "nb" (Norwegian) to its macro language. - // This can be removed if CLDR adopts this change. - langAliasMap.add("nb") - langAliasMap.updateLater("nb", "no") - aliasTypeMap["nb"] = Macro - - for k, v := range b.registry { - // Also add deprecated values for 3-letter ISO codes, which CLDR omits. - if v.typ == "language" && v.deprecated != "" && v.preferred != "" { - langAliasMap.add(k) - langAliasMap.updateLater(k, v.preferred) - aliasTypeMap[k] = Deprecated - } - } - // Fix CLDR mappings. - lang.updateLater("tl", "tgl") - lang.updateLater("sh", "hbs") - lang.updateLater("mo", "mol") - lang.updateLater("no", "nor") - lang.updateLater("tw", "twi") - lang.updateLater("nb", "nob") - lang.updateLater("ak", "aka") - lang.updateLater("bh", "bih") - - // Ensure that each 2-letter code is matched with a 3-letter code. - for _, v := range lang.s[1:] { - s, ok := lang.update[v] - if !ok { - if s, ok = lang.update[langAliasMap.update[v]]; !ok { - continue - } - lang.update[v] = s - } - if v[0] != s[0] { - altLangISO3.add(s) - altLangISO3.updateLater(s, v) - } - } - - // Complete canonicalized language tags. - lang.freeze() - for i, v := range lang.s { - // We can avoid these manual entries by using the IANA registry directly. - // Seems easier to update the list manually, as changes are rare. - // The panic in this loop will trigger if we miss an entry. - add := "" - if s, ok := lang.update[v]; ok { - if s[0] == v[0] { - add = s[1:] - } else { - add = string([]byte{0, byte(altLangISO3.index(s))}) - } - } else if len(v) == 3 { - add = "\x00" - } else { - log.Panicf("no data for long form of %q", v) - } - lang.s[i] += add - } - b.writeConst("lang", tag.Index(lang.join())) - - b.writeConst("langNoIndexOffset", len(b.lang.s)) - - // space of all valid 3-letter language identifiers. - b.writeBitVector("langNoIndex", b.langNoIndex.slice()) - - altLangIndex := []uint16{} - for i, s := range altLangISO3.slice() { - altLangISO3.s[i] += string([]byte{byte(len(altLangIndex))}) - if i > 0 { - idx := b.lang.index(altLangISO3.update[s]) - altLangIndex = append(altLangIndex, uint16(idx)) - } - } - b.writeConst("altLangISO3", tag.Index(altLangISO3.join())) - b.writeSlice("altLangIndex", altLangIndex) - - b.writeSortedMap("AliasMap", &langAliasMap, b.langIndex) - types := make([]AliasType, len(langAliasMap.s)) - for i, s := range langAliasMap.s { - types[i] = aliasTypeMap[s] - } - b.writeSlice("AliasTypes", types) -} - -var scriptConsts = []string{ - "Latn", "Hani", "Hans", "Hant", "Qaaa", "Qaai", "Qabx", "Zinh", "Zyyy", - "Zzzz", -} - -func (b *builder) writeScript() { - b.writeConsts(b.script.index, scriptConsts...) - b.writeConst("script", tag.Index(b.script.join())) - - supp := make([]uint8, len(b.lang.slice())) - for i, v := range b.lang.slice()[1:] { - if sc := b.registry[v].suppressScript; sc != "" { - supp[i+1] = uint8(b.script.index(sc)) - } - } - b.writeSlice("suppressScript", supp) - - // There is only one deprecated script in CLDR. This value is hard-coded. - // We check here if the code must be updated. - for _, a := range b.supp.Metadata.Alias.ScriptAlias { - if a.Type != "Qaai" { - log.Panicf("unexpected deprecated stript %q", a.Type) - } - } -} - -func parseM49(s string) int16 { - if len(s) == 0 { - return 0 - } - v, err := strconv.ParseUint(s, 10, 10) - failOnError(err) - return int16(v) -} - -var regionConsts = []string{ - "001", "419", "BR", "CA", "ES", "GB", "MD", "PT", "UK", "US", - "ZZ", "XA", "XC", "XK", // Unofficial tag for Kosovo. -} - -func (b *builder) writeRegion() { - b.writeConsts(b.region.index, regionConsts...) - - isoOffset := b.region.index("AA") - m49map := make([]int16, len(b.region.slice())) - fromM49map := make(map[int16]int) - altRegionISO3 := "" - altRegionIDs := []uint16{} - - b.writeConst("isoRegionOffset", isoOffset) - - // 2-letter region lookup and mapping to numeric codes. - regionISO := b.region.clone() - regionISO.s = regionISO.s[isoOffset:] - regionISO.sorted = false - - regionTypes := make([]byte, len(b.region.s)) - - // Is the region valid BCP 47? - for s, e := range b.registry { - if len(s) == 2 && s == strings.ToUpper(s) { - i := b.region.index(s) - for _, d := range e.description { - if strings.Contains(d, "Private use") { - regionTypes[i] = iso3166UserAssigned - } - } - regionTypes[i] |= bcp47Region - } - } - - // Is the region a valid ccTLD? - r := gen.OpenIANAFile("domains/root/db") - defer r.Close() - - buf, err := ioutil.ReadAll(r) - failOnError(err) - re := regexp.MustCompile(`"/domains/root/db/([a-z]{2}).html"`) - for _, m := range re.FindAllSubmatch(buf, -1) { - i := b.region.index(strings.ToUpper(string(m[1]))) - regionTypes[i] |= ccTLD - } - - b.writeSlice("regionTypes", regionTypes) - - iso3Set := make(map[string]int) - update := func(iso2, iso3 string) { - i := regionISO.index(iso2) - if j, ok := iso3Set[iso3]; !ok && iso3[0] == iso2[0] { - regionISO.s[i] += iso3[1:] - iso3Set[iso3] = -1 - } else { - if ok && j >= 0 { - regionISO.s[i] += string([]byte{0, byte(j)}) - } else { - iso3Set[iso3] = len(altRegionISO3) - regionISO.s[i] += string([]byte{0, byte(len(altRegionISO3))}) - altRegionISO3 += iso3 - altRegionIDs = append(altRegionIDs, uint16(isoOffset+i)) - } - } - } - for _, tc := range b.supp.CodeMappings.TerritoryCodes { - i := regionISO.index(tc.Type) + isoOffset - if d := m49map[i]; d != 0 { - log.Panicf("%s found as a duplicate UN.M49 code of %03d", tc.Numeric, d) - } - m49 := parseM49(tc.Numeric) - m49map[i] = m49 - if r := fromM49map[m49]; r == 0 { - fromM49map[m49] = i - } else if r != i { - dep := b.registry[regionISO.s[r-isoOffset]].deprecated - if t := b.registry[tc.Type]; t != nil && dep != "" && (t.deprecated == "" || t.deprecated > dep) { - fromM49map[m49] = i - } - } - } - for _, ta := range b.supp.Metadata.Alias.TerritoryAlias { - if len(ta.Type) == 3 && ta.Type[0] <= '9' && len(ta.Replacement) == 2 { - from := parseM49(ta.Type) - if r := fromM49map[from]; r == 0 { - fromM49map[from] = regionISO.index(ta.Replacement) + isoOffset - } - } - } - for _, tc := range b.supp.CodeMappings.TerritoryCodes { - if len(tc.Alpha3) == 3 { - update(tc.Type, tc.Alpha3) - } - } - // This entries are not included in territoryCodes. Mostly 3-letter variants - // of deleted codes and an entry for QU. - for _, m := range []struct{ iso2, iso3 string }{ - {"CT", "CTE"}, - {"DY", "DHY"}, - {"HV", "HVO"}, - {"JT", "JTN"}, - {"MI", "MID"}, - {"NH", "NHB"}, - {"NQ", "ATN"}, - {"PC", "PCI"}, - {"PU", "PUS"}, - {"PZ", "PCZ"}, - {"RH", "RHO"}, - {"VD", "VDR"}, - {"WK", "WAK"}, - // These three-letter codes are used for others as well. - {"FQ", "ATF"}, - } { - update(m.iso2, m.iso3) - } - for i, s := range regionISO.s { - if len(s) != 4 { - regionISO.s[i] = s + " " - } - } - b.writeConst("regionISO", tag.Index(regionISO.join())) - b.writeConst("altRegionISO3", altRegionISO3) - b.writeSlice("altRegionIDs", altRegionIDs) - - // Create list of deprecated regions. - // TODO: consider inserting SF -> FI. Not included by CLDR, but is the only - // Transitionally-reserved mapping not included. - regionOldMap := stringSet{} - // Include regions in territoryAlias (not all are in the IANA registry!) - for _, reg := range b.supp.Metadata.Alias.TerritoryAlias { - if len(reg.Type) == 2 && reg.Reason == "deprecated" && len(reg.Replacement) == 2 { - regionOldMap.add(reg.Type) - regionOldMap.updateLater(reg.Type, reg.Replacement) - i, _ := regionISO.find(reg.Type) - j, _ := regionISO.find(reg.Replacement) - if k := m49map[i+isoOffset]; k == 0 { - m49map[i+isoOffset] = m49map[j+isoOffset] - } - } - } - b.writeSortedMap("regionOldMap", ®ionOldMap, func(s string) uint16 { - return uint16(b.region.index(s)) - }) - // 3-digit region lookup, groupings. - for i := 1; i < isoOffset; i++ { - m := parseM49(b.region.s[i]) - m49map[i] = m - fromM49map[m] = i - } - b.writeSlice("m49", m49map) - - const ( - searchBits = 7 - regionBits = 9 - ) - if len(m49map) >= 1< %d", len(m49map), 1<>searchBits] = int16(len(fromM49)) - } - b.writeSlice("m49Index", m49Index) - b.writeSlice("fromM49", fromM49) -} - -const ( - // TODO: put these lists in regionTypes as user data? Could be used for - // various optimizations and refinements and could be exposed in the API. - iso3166Except = "AC CP DG EA EU FX IC SU TA UK" - iso3166Trans = "AN BU CS NT TP YU ZR" // SF is not in our set of Regions. - // DY and RH are actually not deleted, but indeterminately reserved. - iso3166DelCLDR = "CT DD DY FQ HV JT MI NH NQ PC PU PZ RH VD WK YD" -) - -const ( - iso3166UserAssigned = 1 << iota - ccTLD - bcp47Region -) - -func find(list []string, s string) int { - for i, t := range list { - if t == s { - return i - } - } - return -1 -} - -// writeVariants generates per-variant information and creates a map from variant -// name to index value. We assign index values such that sorting multiple -// variants by index value will result in the correct order. -// There are two types of variants: specialized and general. Specialized variants -// are only applicable to certain language or language-script pairs. Generalized -// variants apply to any language. Generalized variants always sort after -// specialized variants. We will therefore always assign a higher index value -// to a generalized variant than any other variant. Generalized variants are -// sorted alphabetically among themselves. -// Specialized variants may also sort after other specialized variants. Such -// variants will be ordered after any of the variants they may follow. -// We assume that if a variant x is followed by a variant y, then for any prefix -// p of x, p-x is a prefix of y. This allows us to order tags based on the -// maximum of the length of any of its prefixes. -// TODO: it is possible to define a set of Prefix values on variants such that -// a total order cannot be defined to the point that this algorithm breaks. -// In other words, we cannot guarantee the same order of variants for the -// future using the same algorithm or for non-compliant combinations of -// variants. For this reason, consider using simple alphabetic sorting -// of variants and ignore Prefix restrictions altogether. -func (b *builder) writeVariant() { - generalized := stringSet{} - specialized := stringSet{} - specializedExtend := stringSet{} - // Collate the variants by type and check assumptions. - for _, v := range b.variant.slice() { - e := b.registry[v] - if len(e.prefix) == 0 { - generalized.add(v) - continue - } - c := strings.Split(e.prefix[0], "-") - hasScriptOrRegion := false - if len(c) > 1 { - _, hasScriptOrRegion = b.script.find(c[1]) - if !hasScriptOrRegion { - _, hasScriptOrRegion = b.region.find(c[1]) - - } - } - if len(c) == 1 || len(c) == 2 && hasScriptOrRegion { - // Variant is preceded by a language. - specialized.add(v) - continue - } - // Variant is preceded by another variant. - specializedExtend.add(v) - prefix := c[0] + "-" - if hasScriptOrRegion { - prefix += c[1] - } - for _, p := range e.prefix { - // Verify that the prefix minus the last element is a prefix of the - // predecessor element. - i := strings.LastIndex(p, "-") - pred := b.registry[p[i+1:]] - if find(pred.prefix, p[:i]) < 0 { - log.Fatalf("prefix %q for variant %q not consistent with predecessor spec", p, v) - } - // The sorting used below does not work in the general case. It works - // if we assume that variants that may be followed by others only have - // prefixes of the same length. Verify this. - count := strings.Count(p[:i], "-") - for _, q := range pred.prefix { - if c := strings.Count(q, "-"); c != count { - log.Fatalf("variant %q preceding %q has a prefix %q of size %d; want %d", p[i+1:], v, q, c, count) - } - } - if !strings.HasPrefix(p, prefix) { - log.Fatalf("prefix %q of variant %q should start with %q", p, v, prefix) - } - } - } - - // Sort extended variants. - a := specializedExtend.s - less := func(v, w string) bool { - // Sort by the maximum number of elements. - maxCount := func(s string) (max int) { - for _, p := range b.registry[s].prefix { - if c := strings.Count(p, "-"); c > max { - max = c - } - } - return - } - if cv, cw := maxCount(v), maxCount(w); cv != cw { - return cv < cw - } - // Sort by name as tie breaker. - return v < w - } - sort.Sort(funcSorter{less, sort.StringSlice(a)}) - specializedExtend.frozen = true - - // Create index from variant name to index. - variantIndex := make(map[string]uint8) - add := func(s []string) { - for _, v := range s { - variantIndex[v] = uint8(len(variantIndex)) - } - } - add(specialized.slice()) - add(specializedExtend.s) - numSpecialized := len(variantIndex) - add(generalized.slice()) - if n := len(variantIndex); n > 255 { - log.Fatalf("maximum number of variants exceeded: was %d; want <= 255", n) - } - b.writeMap("variantIndex", variantIndex) - b.writeConst("variantNumSpecialized", numSpecialized) -} - -func (b *builder) writeLanguageInfo() { -} - -// writeLikelyData writes tables that are used both for finding parent relations and for -// language matching. Each entry contains additional bits to indicate the status of the -// data to know when it cannot be used for parent relations. -func (b *builder) writeLikelyData() { - const ( - isList = 1 << iota - scriptInFrom - regionInFrom - ) - type ( // generated types - likelyScriptRegion struct { - region uint16 - script uint8 - flags uint8 - } - likelyLangScript struct { - lang uint16 - script uint8 - flags uint8 - } - likelyLangRegion struct { - lang uint16 - region uint16 - } - // likelyTag is used for getting likely tags for group regions, where - // the likely region might be a region contained in the group. - likelyTag struct { - lang uint16 - region uint16 - script uint8 - } - ) - var ( // generated variables - likelyRegionGroup = make([]likelyTag, len(b.groups)) - likelyLang = make([]likelyScriptRegion, len(b.lang.s)) - likelyRegion = make([]likelyLangScript, len(b.region.s)) - likelyScript = make([]likelyLangRegion, len(b.script.s)) - likelyLangList = []likelyScriptRegion{} - likelyRegionList = []likelyLangScript{} - ) - type fromTo struct { - from, to []string - } - langToOther := map[int][]fromTo{} - regionToOther := map[int][]fromTo{} - for _, m := range b.supp.LikelySubtags.LikelySubtag { - from := strings.Split(m.From, "_") - to := strings.Split(m.To, "_") - if len(to) != 3 { - log.Fatalf("invalid number of subtags in %q: found %d, want 3", m.To, len(to)) - } - if len(from) > 3 { - log.Fatalf("invalid number of subtags: found %d, want 1-3", len(from)) - } - if from[0] != to[0] && from[0] != "und" { - log.Fatalf("unexpected language change in expansion: %s -> %s", from, to) - } - if len(from) == 3 { - if from[2] != to[2] { - log.Fatalf("unexpected region change in expansion: %s -> %s", from, to) - } - if from[0] != "und" { - log.Fatalf("unexpected fully specified from tag: %s -> %s", from, to) - } - } - if len(from) == 1 || from[0] != "und" { - id := 0 - if from[0] != "und" { - id = b.lang.index(from[0]) - } - langToOther[id] = append(langToOther[id], fromTo{from, to}) - } else if len(from) == 2 && len(from[1]) == 4 { - sid := b.script.index(from[1]) - likelyScript[sid].lang = uint16(b.langIndex(to[0])) - likelyScript[sid].region = uint16(b.region.index(to[2])) - } else { - r := b.region.index(from[len(from)-1]) - if id, ok := b.groups[r]; ok { - if from[0] != "und" { - log.Fatalf("region changed unexpectedly: %s -> %s", from, to) - } - likelyRegionGroup[id].lang = uint16(b.langIndex(to[0])) - likelyRegionGroup[id].script = uint8(b.script.index(to[1])) - likelyRegionGroup[id].region = uint16(b.region.index(to[2])) - } else { - regionToOther[r] = append(regionToOther[r], fromTo{from, to}) - } - } - } - b.writeType(likelyLangRegion{}) - b.writeSlice("likelyScript", likelyScript) - - for id := range b.lang.s { - list := langToOther[id] - if len(list) == 1 { - likelyLang[id].region = uint16(b.region.index(list[0].to[2])) - likelyLang[id].script = uint8(b.script.index(list[0].to[1])) - } else if len(list) > 1 { - likelyLang[id].flags = isList - likelyLang[id].region = uint16(len(likelyLangList)) - likelyLang[id].script = uint8(len(list)) - for _, x := range list { - flags := uint8(0) - if len(x.from) > 1 { - if x.from[1] == x.to[2] { - flags = regionInFrom - } else { - flags = scriptInFrom - } - } - likelyLangList = append(likelyLangList, likelyScriptRegion{ - region: uint16(b.region.index(x.to[2])), - script: uint8(b.script.index(x.to[1])), - flags: flags, - }) - } - } - } - // TODO: merge suppressScript data with this table. - b.writeType(likelyScriptRegion{}) - b.writeSlice("likelyLang", likelyLang) - b.writeSlice("likelyLangList", likelyLangList) - - for id := range b.region.s { - list := regionToOther[id] - if len(list) == 1 { - likelyRegion[id].lang = uint16(b.langIndex(list[0].to[0])) - likelyRegion[id].script = uint8(b.script.index(list[0].to[1])) - if len(list[0].from) > 2 { - likelyRegion[id].flags = scriptInFrom - } - } else if len(list) > 1 { - likelyRegion[id].flags = isList - likelyRegion[id].lang = uint16(len(likelyRegionList)) - likelyRegion[id].script = uint8(len(list)) - for i, x := range list { - if len(x.from) == 2 && i != 0 || i > 0 && len(x.from) != 3 { - log.Fatalf("unspecified script must be first in list: %v at %d", x.from, i) - } - x := likelyLangScript{ - lang: uint16(b.langIndex(x.to[0])), - script: uint8(b.script.index(x.to[1])), - } - if len(list[0].from) > 2 { - x.flags = scriptInFrom - } - likelyRegionList = append(likelyRegionList, x) - } - } - } - b.writeType(likelyLangScript{}) - b.writeSlice("likelyRegion", likelyRegion) - b.writeSlice("likelyRegionList", likelyRegionList) - - b.writeType(likelyTag{}) - b.writeSlice("likelyRegionGroup", likelyRegionGroup) -} - -func (b *builder) writeRegionInclusionData() { - var ( - // mm holds for each group the set of groups with a distance of 1. - mm = make(map[int][]index) - - // containment holds for each group the transitive closure of - // containment of other groups. - containment = make(map[index][]index) - ) - for _, g := range b.supp.TerritoryContainment.Group { - // Skip UN and EURO zone as they are flattening the containment - // relationship. - if g.Type == "EZ" || g.Type == "UN" { - continue - } - group := b.region.index(g.Type) - groupIdx := b.groups[group] - for _, mem := range strings.Split(g.Contains, " ") { - r := b.region.index(mem) - mm[r] = append(mm[r], groupIdx) - if g, ok := b.groups[r]; ok { - mm[group] = append(mm[group], g) - containment[groupIdx] = append(containment[groupIdx], g) - } - } - } - - regionContainment := make([]uint64, len(b.groups)) - for _, g := range b.groups { - l := containment[g] - - // Compute the transitive closure of containment. - for i := 0; i < len(l); i++ { - l = append(l, containment[l[i]]...) - } - - // Compute the bitmask. - regionContainment[g] = 1 << g - for _, v := range l { - regionContainment[g] |= 1 << v - } - } - b.writeSlice("regionContainment", regionContainment) - - regionInclusion := make([]uint8, len(b.region.s)) - bvs := make(map[uint64]index) - // Make the first bitvector positions correspond with the groups. - for r, i := range b.groups { - bv := uint64(1 << i) - for _, g := range mm[r] { - bv |= 1 << g - } - bvs[bv] = i - regionInclusion[r] = uint8(bvs[bv]) - } - for r := 1; r < len(b.region.s); r++ { - if _, ok := b.groups[r]; !ok { - bv := uint64(0) - for _, g := range mm[r] { - bv |= 1 << g - } - if bv == 0 { - // Pick the world for unspecified regions. - bv = 1 << b.groups[b.region.index("001")] - } - if _, ok := bvs[bv]; !ok { - bvs[bv] = index(len(bvs)) - } - regionInclusion[r] = uint8(bvs[bv]) - } - } - b.writeSlice("regionInclusion", regionInclusion) - regionInclusionBits := make([]uint64, len(bvs)) - for k, v := range bvs { - regionInclusionBits[v] = uint64(k) - } - // Add bit vectors for increasingly large distances until a fixed point is reached. - regionInclusionNext := []uint8{} - for i := 0; i < len(regionInclusionBits); i++ { - bits := regionInclusionBits[i] - next := bits - for i := uint(0); i < uint(len(b.groups)); i++ { - if bits&(1< 6 { - log.Fatalf("Too many groups: %d", i) - } - idToIndex[mv.Id] = uint8(i + 1) - // TODO: also handle '-' - for _, r := range strings.Split(mv.Value, "+") { - todo := []string{r} - for k := 0; k < len(todo); k++ { - r := todo[k] - regionToGroups[b.regionIndex(r)] |= 1 << uint8(i) - todo = append(todo, regionHierarchy[r]...) - } - } - } - b.w.WriteVar("regionToGroups", regionToGroups) - - // maps language id to in- and out-of-group region. - paradigmLocales := [][3]uint16{} - locales := strings.Split(lm[0].ParadigmLocales[0].Locales, " ") - for i := 0; i < len(locales); i += 2 { - x := [3]uint16{} - for j := 0; j < 2; j++ { - pc := strings.SplitN(locales[i+j], "-", 2) - x[0] = b.langIndex(pc[0]) - if len(pc) == 2 { - x[1+j] = uint16(b.regionIndex(pc[1])) - } - } - paradigmLocales = append(paradigmLocales, x) - } - b.w.WriteVar("paradigmLocales", paradigmLocales) - - b.w.WriteType(mutualIntelligibility{}) - b.w.WriteType(scriptIntelligibility{}) - b.w.WriteType(regionIntelligibility{}) - - matchLang := []mutualIntelligibility{} - matchScript := []scriptIntelligibility{} - matchRegion := []regionIntelligibility{} - // Convert the languageMatch entries in lists keyed by desired language. - for _, m := range lm[0].LanguageMatch { - // Different versions of CLDR use different separators. - desired := strings.Replace(m.Desired, "-", "_", -1) - supported := strings.Replace(m.Supported, "-", "_", -1) - d := strings.Split(desired, "_") - s := strings.Split(supported, "_") - if len(d) != len(s) { - log.Fatalf("not supported: desired=%q; supported=%q", desired, supported) - continue - } - distance, _ := strconv.ParseInt(m.Distance, 10, 8) - switch len(d) { - case 2: - if desired == supported && desired == "*_*" { - continue - } - // language-script pair. - matchScript = append(matchScript, scriptIntelligibility{ - wantLang: uint16(b.langIndex(d[0])), - haveLang: uint16(b.langIndex(s[0])), - wantScript: uint8(b.scriptIndex(d[1])), - haveScript: uint8(b.scriptIndex(s[1])), - distance: uint8(distance), - }) - if m.Oneway != "true" { - matchScript = append(matchScript, scriptIntelligibility{ - wantLang: uint16(b.langIndex(s[0])), - haveLang: uint16(b.langIndex(d[0])), - wantScript: uint8(b.scriptIndex(s[1])), - haveScript: uint8(b.scriptIndex(d[1])), - distance: uint8(distance), - }) - } - case 1: - if desired == supported && desired == "*" { - continue - } - if distance == 1 { - // nb == no is already handled by macro mapping. Check there - // really is only this case. - if d[0] != "no" || s[0] != "nb" { - log.Fatalf("unhandled equivalence %s == %s", s[0], d[0]) - } - continue - } - // TODO: consider dropping oneway field and just doubling the entry. - matchLang = append(matchLang, mutualIntelligibility{ - want: uint16(b.langIndex(d[0])), - have: uint16(b.langIndex(s[0])), - distance: uint8(distance), - oneway: m.Oneway == "true", - }) - case 3: - if desired == supported && desired == "*_*_*" { - continue - } - if desired != supported { - // This is now supported by CLDR, but only one case, which - // should already be covered by paradigm locales. For instance, - // test case "und, en, en-GU, en-IN, en-GB ; en-ZA ; en-GB" in - // testdata/CLDRLocaleMatcherTest.txt tests this. - if supported != "en_*_GB" { - log.Fatalf("not supported: desired=%q; supported=%q", desired, supported) - } - continue - } - ri := regionIntelligibility{ - lang: b.langIndex(d[0]), - distance: uint8(distance), - } - if d[1] != "*" { - ri.script = uint8(b.scriptIndex(d[1])) - } - switch { - case d[2] == "*": - ri.group = 0x80 // not contained in anything - case strings.HasPrefix(d[2], "$!"): - ri.group = 0x80 - d[2] = "$" + d[2][len("$!"):] - fallthrough - case strings.HasPrefix(d[2], "$"): - ri.group |= idToIndex[d[2]] - } - matchRegion = append(matchRegion, ri) - default: - log.Fatalf("not supported: desired=%q; supported=%q", desired, supported) - } - } - sort.SliceStable(matchLang, func(i, j int) bool { - return matchLang[i].distance < matchLang[j].distance - }) - b.w.WriteComment(` - matchLang holds pairs of langIDs of base languages that are typically - mutually intelligible. Each pair is associated with a confidence and - whether the intelligibility goes one or both ways.`) - b.w.WriteVar("matchLang", matchLang) - - b.w.WriteComment(` - matchScript holds pairs of scriptIDs where readers of one script - can typically also read the other. Each is associated with a confidence.`) - sort.SliceStable(matchScript, func(i, j int) bool { - return matchScript[i].distance < matchScript[j].distance - }) - b.w.WriteVar("matchScript", matchScript) - - sort.SliceStable(matchRegion, func(i, j int) bool { - return matchRegion[i].distance < matchRegion[j].distance - }) - b.w.WriteVar("matchRegion", matchRegion) -} diff --git a/vendor/golang.org/x/text/unicode/bidi/gen.go b/vendor/golang.org/x/text/unicode/bidi/gen.go deleted file mode 100644 index 987fc169..00000000 --- a/vendor/golang.org/x/text/unicode/bidi/gen.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "flag" - "log" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" -) - -var outputFile = flag.String("out", "tables.go", "output file") - -func main() { - gen.Init() - gen.Repackage("gen_trieval.go", "trieval.go", "bidi") - gen.Repackage("gen_ranges.go", "ranges_test.go", "bidi") - - genTables() -} - -// bidiClass names and codes taken from class "bc" in -// https://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt -var bidiClass = map[string]Class{ - "AL": AL, // ArabicLetter - "AN": AN, // ArabicNumber - "B": B, // ParagraphSeparator - "BN": BN, // BoundaryNeutral - "CS": CS, // CommonSeparator - "EN": EN, // EuropeanNumber - "ES": ES, // EuropeanSeparator - "ET": ET, // EuropeanTerminator - "L": L, // LeftToRight - "NSM": NSM, // NonspacingMark - "ON": ON, // OtherNeutral - "R": R, // RightToLeft - "S": S, // SegmentSeparator - "WS": WS, // WhiteSpace - - "FSI": Control, - "PDF": Control, - "PDI": Control, - "LRE": Control, - "LRI": Control, - "LRO": Control, - "RLE": Control, - "RLI": Control, - "RLO": Control, -} - -func genTables() { - if numClass > 0x0F { - log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass) - } - w := gen.NewCodeWriter() - defer w.WriteVersionedGoFile(*outputFile, "bidi") - - gen.WriteUnicodeVersion(w) - - t := triegen.NewTrie("bidi") - - // Build data about bracket mapping. These bits need to be or-ed with - // any other bits. - orMask := map[rune]uint64{} - - xorMap := map[rune]int{} - xorMasks := []rune{0} // First value is no-op. - - ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { - r1 := p.Rune(0) - r2 := p.Rune(1) - xor := r1 ^ r2 - if _, ok := xorMap[xor]; !ok { - xorMap[xor] = len(xorMasks) - xorMasks = append(xorMasks, xor) - } - entry := uint64(xorMap[xor]) << xorMaskShift - switch p.String(2) { - case "o": - entry |= openMask - case "c", "n": - default: - log.Fatalf("Unknown bracket class %q.", p.String(2)) - } - orMask[r1] = entry - }) - - w.WriteComment(` - xorMasks contains masks to be xor-ed with brackets to get the reverse - version.`) - w.WriteVar("xorMasks", xorMasks) - - done := map[rune]bool{} - - insert := func(r rune, c Class) { - if !done[r] { - t.Insert(r, orMask[r]|uint64(c)) - done[r] = true - } - } - - // Insert the derived BiDi properties. - ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - class, ok := bidiClass[p.String(1)] - if !ok { - log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1)) - } - insert(r, class) - }) - visitDefaults(insert) - - // TODO: use sparse blocks. This would reduce table size considerably - // from the looks of it. - - sz, err := t.Gen(w) - if err != nil { - log.Fatal(err) - } - w.Size += sz -} - -// dummy values to make methods in gen_common compile. The real versions -// will be generated by this file to tables.go. -var ( - xorMasks []rune -) diff --git a/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go b/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go deleted file mode 100644 index 02c3b505..00000000 --- a/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "unicode" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/ucd" - "golang.org/x/text/unicode/rangetable" -) - -// These tables are hand-extracted from: -// https://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt -func visitDefaults(fn func(r rune, c Class)) { - // first write default values for ranges listed above. - visitRunes(fn, AL, []rune{ - 0x0600, 0x07BF, // Arabic - 0x08A0, 0x08FF, // Arabic Extended-A - 0xFB50, 0xFDCF, // Arabic Presentation Forms - 0xFDF0, 0xFDFF, - 0xFE70, 0xFEFF, - 0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols - }) - visitRunes(fn, R, []rune{ - 0x0590, 0x05FF, // Hebrew - 0x07C0, 0x089F, // Nko et al. - 0xFB1D, 0xFB4F, - 0x00010800, 0x00010FFF, // Cypriot Syllabary et. al. - 0x0001E800, 0x0001EDFF, - 0x0001EF00, 0x0001EFFF, - }) - visitRunes(fn, ET, []rune{ // European Terminator - 0x20A0, 0x20Cf, // Currency symbols - }) - rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) { - fn(r, BN) // Boundary Neutral - }) - ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { - if p.String(1) == "Default_Ignorable_Code_Point" { - fn(p.Rune(0), BN) // Boundary Neutral - } - }) -} - -func visitRunes(fn func(r rune, c Class), c Class, runes []rune) { - for i := 0; i < len(runes); i += 2 { - lo, hi := runes[i], runes[i+1] - for j := lo; j <= hi; j++ { - fn(j, c) - } - } -} diff --git a/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go b/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go deleted file mode 100644 index 9cb99428..00000000 --- a/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// Class is the Unicode BiDi class. Each rune has a single class. -type Class uint - -const ( - L Class = iota // LeftToRight - R // RightToLeft - EN // EuropeanNumber - ES // EuropeanSeparator - ET // EuropeanTerminator - AN // ArabicNumber - CS // CommonSeparator - B // ParagraphSeparator - S // SegmentSeparator - WS // WhiteSpace - ON // OtherNeutral - BN // BoundaryNeutral - NSM // NonspacingMark - AL // ArabicLetter - Control // Control LRO - PDI - - numClass - - LRO // LeftToRightOverride - RLO // RightToLeftOverride - LRE // LeftToRightEmbedding - RLE // RightToLeftEmbedding - PDF // PopDirectionalFormat - LRI // LeftToRightIsolate - RLI // RightToLeftIsolate - FSI // FirstStrongIsolate - PDI // PopDirectionalIsolate - - unknownClass = ^Class(0) -) - -var controlToClass = map[rune]Class{ - 0x202D: LRO, // LeftToRightOverride, - 0x202E: RLO, // RightToLeftOverride, - 0x202A: LRE, // LeftToRightEmbedding, - 0x202B: RLE, // RightToLeftEmbedding, - 0x202C: PDF, // PopDirectionalFormat, - 0x2066: LRI, // LeftToRightIsolate, - 0x2067: RLI, // RightToLeftIsolate, - 0x2068: FSI, // FirstStrongIsolate, - 0x2069: PDI, // PopDirectionalIsolate, -} - -// A trie entry has the following bits: -// 7..5 XOR mask for brackets -// 4 1: Bracket open, 0: Bracket close -// 3..0 Class type - -const ( - openMask = 0x10 - xorMaskShift = 5 -) diff --git a/vendor/golang.org/x/text/unicode/norm/maketables.go b/vendor/golang.org/x/text/unicode/norm/maketables.go deleted file mode 100644 index 30a3aa93..00000000 --- a/vendor/golang.org/x/text/unicode/norm/maketables.go +++ /dev/null @@ -1,986 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Normalization table generator. -// Data read from the web. -// See forminfo.go for a description of the trie values associated with each rune. - -package main - -import ( - "bytes" - "encoding/binary" - "flag" - "fmt" - "io" - "log" - "sort" - "strconv" - "strings" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" -) - -func main() { - gen.Init() - loadUnicodeData() - compactCCC() - loadCompositionExclusions() - completeCharFields(FCanonical) - completeCharFields(FCompatibility) - computeNonStarterCounts() - verifyComputed() - printChars() - testDerived() - printTestdata() - makeTables() -} - -var ( - tablelist = flag.String("tables", - "all", - "comma-separated list of which tables to generate; "+ - "can be 'decomp', 'recomp', 'info' and 'all'") - test = flag.Bool("test", - false, - "test existing tables against DerivedNormalizationProps and generate test data for regression testing") - verbose = flag.Bool("verbose", - false, - "write data to stdout as it is parsed") -) - -const MaxChar = 0x10FFFF // anything above this shouldn't exist - -// Quick Check properties of runes allow us to quickly -// determine whether a rune may occur in a normal form. -// For a given normal form, a rune may be guaranteed to occur -// verbatim (QC=Yes), may or may not combine with another -// rune (QC=Maybe), or may not occur (QC=No). -type QCResult int - -const ( - QCUnknown QCResult = iota - QCYes - QCNo - QCMaybe -) - -func (r QCResult) String() string { - switch r { - case QCYes: - return "Yes" - case QCNo: - return "No" - case QCMaybe: - return "Maybe" - } - return "***UNKNOWN***" -} - -const ( - FCanonical = iota // NFC or NFD - FCompatibility // NFKC or NFKD - FNumberOfFormTypes -) - -const ( - MComposed = iota // NFC or NFKC - MDecomposed // NFD or NFKD - MNumberOfModes -) - -// This contains only the properties we're interested in. -type Char struct { - name string - codePoint rune // if zero, this index is not a valid code point. - ccc uint8 // canonical combining class - origCCC uint8 - excludeInComp bool // from CompositionExclusions.txt - compatDecomp bool // it has a compatibility expansion - - nTrailingNonStarters uint8 - nLeadingNonStarters uint8 // must be equal to trailing if non-zero - - forms [FNumberOfFormTypes]FormInfo // For FCanonical and FCompatibility - - state State -} - -var chars = make([]Char, MaxChar+1) -var cccMap = make(map[uint8]uint8) - -func (c Char) String() string { - buf := new(bytes.Buffer) - - fmt.Fprintf(buf, "%U [%s]:\n", c.codePoint, c.name) - fmt.Fprintf(buf, " ccc: %v\n", c.ccc) - fmt.Fprintf(buf, " excludeInComp: %v\n", c.excludeInComp) - fmt.Fprintf(buf, " compatDecomp: %v\n", c.compatDecomp) - fmt.Fprintf(buf, " state: %v\n", c.state) - fmt.Fprintf(buf, " NFC:\n") - fmt.Fprint(buf, c.forms[FCanonical]) - fmt.Fprintf(buf, " NFKC:\n") - fmt.Fprint(buf, c.forms[FCompatibility]) - - return buf.String() -} - -// In UnicodeData.txt, some ranges are marked like this: -// 3400;;Lo;0;L;;;;;N;;;;; -// 4DB5;;Lo;0;L;;;;;N;;;;; -// parseCharacter keeps a state variable indicating the weirdness. -type State int - -const ( - SNormal State = iota // known to be zero for the type - SFirst - SLast - SMissing -) - -var lastChar = rune('\u0000') - -func (c Char) isValid() bool { - return c.codePoint != 0 && c.state != SMissing -} - -type FormInfo struct { - quickCheck [MNumberOfModes]QCResult // index: MComposed or MDecomposed - verified [MNumberOfModes]bool // index: MComposed or MDecomposed - - combinesForward bool // May combine with rune on the right - combinesBackward bool // May combine with rune on the left - isOneWay bool // Never appears in result - inDecomp bool // Some decompositions result in this char. - decomp Decomposition - expandedDecomp Decomposition -} - -func (f FormInfo) String() string { - buf := bytes.NewBuffer(make([]byte, 0)) - - fmt.Fprintf(buf, " quickCheck[C]: %v\n", f.quickCheck[MComposed]) - fmt.Fprintf(buf, " quickCheck[D]: %v\n", f.quickCheck[MDecomposed]) - fmt.Fprintf(buf, " cmbForward: %v\n", f.combinesForward) - fmt.Fprintf(buf, " cmbBackward: %v\n", f.combinesBackward) - fmt.Fprintf(buf, " isOneWay: %v\n", f.isOneWay) - fmt.Fprintf(buf, " inDecomp: %v\n", f.inDecomp) - fmt.Fprintf(buf, " decomposition: %X\n", f.decomp) - fmt.Fprintf(buf, " expandedDecomp: %X\n", f.expandedDecomp) - - return buf.String() -} - -type Decomposition []rune - -func parseDecomposition(s string, skipfirst bool) (a []rune, err error) { - decomp := strings.Split(s, " ") - if len(decomp) > 0 && skipfirst { - decomp = decomp[1:] - } - for _, d := range decomp { - point, err := strconv.ParseUint(d, 16, 64) - if err != nil { - return a, err - } - a = append(a, rune(point)) - } - return a, nil -} - -func loadUnicodeData() { - f := gen.OpenUCDFile("UnicodeData.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - r := p.Rune(ucd.CodePoint) - char := &chars[r] - - char.ccc = uint8(p.Uint(ucd.CanonicalCombiningClass)) - decmap := p.String(ucd.DecompMapping) - - exp, err := parseDecomposition(decmap, false) - isCompat := false - if err != nil { - if len(decmap) > 0 { - exp, err = parseDecomposition(decmap, true) - if err != nil { - log.Fatalf(`%U: bad decomp |%v|: "%s"`, r, decmap, err) - } - isCompat = true - } - } - - char.name = p.String(ucd.Name) - char.codePoint = r - char.forms[FCompatibility].decomp = exp - if !isCompat { - char.forms[FCanonical].decomp = exp - } else { - char.compatDecomp = true - } - if len(decmap) > 0 { - char.forms[FCompatibility].decomp = exp - } - } - if err := p.Err(); err != nil { - log.Fatal(err) - } -} - -// compactCCC converts the sparse set of CCC values to a continguous one, -// reducing the number of bits needed from 8 to 6. -func compactCCC() { - m := make(map[uint8]uint8) - for i := range chars { - c := &chars[i] - m[c.ccc] = 0 - } - cccs := []int{} - for v, _ := range m { - cccs = append(cccs, int(v)) - } - sort.Ints(cccs) - for i, c := range cccs { - cccMap[uint8(i)] = uint8(c) - m[uint8(c)] = uint8(i) - } - for i := range chars { - c := &chars[i] - c.origCCC = c.ccc - c.ccc = m[c.ccc] - } - if len(m) >= 1<<6 { - log.Fatalf("too many difference CCC values: %d >= 64", len(m)) - } -} - -// CompositionExclusions.txt has form: -// 0958 # ... -// See https://unicode.org/reports/tr44/ for full explanation -func loadCompositionExclusions() { - f := gen.OpenUCDFile("CompositionExclusions.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - c := &chars[p.Rune(0)] - if c.excludeInComp { - log.Fatalf("%U: Duplicate entry in exclusions.", c.codePoint) - } - c.excludeInComp = true - } - if e := p.Err(); e != nil { - log.Fatal(e) - } -} - -// hasCompatDecomp returns true if any of the recursive -// decompositions contains a compatibility expansion. -// In this case, the character may not occur in NFK*. -func hasCompatDecomp(r rune) bool { - c := &chars[r] - if c.compatDecomp { - return true - } - for _, d := range c.forms[FCompatibility].decomp { - if hasCompatDecomp(d) { - return true - } - } - return false -} - -// Hangul related constants. -const ( - HangulBase = 0xAC00 - HangulEnd = 0xD7A4 // hangulBase + Jamo combinations (19 * 21 * 28) - - JamoLBase = 0x1100 - JamoLEnd = 0x1113 - JamoVBase = 0x1161 - JamoVEnd = 0x1176 - JamoTBase = 0x11A8 - JamoTEnd = 0x11C3 - - JamoLVTCount = 19 * 21 * 28 - JamoTCount = 28 -) - -func isHangul(r rune) bool { - return HangulBase <= r && r < HangulEnd -} - -func isHangulWithoutJamoT(r rune) bool { - if !isHangul(r) { - return false - } - r -= HangulBase - return r < JamoLVTCount && r%JamoTCount == 0 -} - -func ccc(r rune) uint8 { - return chars[r].ccc -} - -// Insert a rune in a buffer, ordered by Canonical Combining Class. -func insertOrdered(b Decomposition, r rune) Decomposition { - n := len(b) - b = append(b, 0) - cc := ccc(r) - if cc > 0 { - // Use bubble sort. - for ; n > 0; n-- { - if ccc(b[n-1]) <= cc { - break - } - b[n] = b[n-1] - } - } - b[n] = r - return b -} - -// Recursively decompose. -func decomposeRecursive(form int, r rune, d Decomposition) Decomposition { - dcomp := chars[r].forms[form].decomp - if len(dcomp) == 0 { - return insertOrdered(d, r) - } - for _, c := range dcomp { - d = decomposeRecursive(form, c, d) - } - return d -} - -func completeCharFields(form int) { - // Phase 0: pre-expand decomposition. - for i := range chars { - f := &chars[i].forms[form] - if len(f.decomp) == 0 { - continue - } - exp := make(Decomposition, 0) - for _, c := range f.decomp { - exp = decomposeRecursive(form, c, exp) - } - f.expandedDecomp = exp - } - - // Phase 1: composition exclusion, mark decomposition. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - // Marks script-specific exclusions and version restricted. - f.isOneWay = c.excludeInComp - - // Singletons - f.isOneWay = f.isOneWay || len(f.decomp) == 1 - - // Non-starter decompositions - if len(f.decomp) > 1 { - chk := c.ccc != 0 || chars[f.decomp[0]].ccc != 0 - f.isOneWay = f.isOneWay || chk - } - - // Runes that decompose into more than two runes. - f.isOneWay = f.isOneWay || len(f.decomp) > 2 - - if form == FCompatibility { - f.isOneWay = f.isOneWay || hasCompatDecomp(c.codePoint) - } - - for _, r := range f.decomp { - chars[r].forms[form].inDecomp = true - } - } - - // Phase 2: forward and backward combining. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - if !f.isOneWay && len(f.decomp) == 2 { - f0 := &chars[f.decomp[0]].forms[form] - f1 := &chars[f.decomp[1]].forms[form] - if !f0.isOneWay { - f0.combinesForward = true - } - if !f1.isOneWay { - f1.combinesBackward = true - } - } - if isHangulWithoutJamoT(rune(i)) { - f.combinesForward = true - } - } - - // Phase 3: quick check values. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - switch { - case len(f.decomp) > 0: - f.quickCheck[MDecomposed] = QCNo - case isHangul(rune(i)): - f.quickCheck[MDecomposed] = QCNo - default: - f.quickCheck[MDecomposed] = QCYes - } - switch { - case f.isOneWay: - f.quickCheck[MComposed] = QCNo - case (i & 0xffff00) == JamoLBase: - f.quickCheck[MComposed] = QCYes - if JamoLBase <= i && i < JamoLEnd { - f.combinesForward = true - } - if JamoVBase <= i && i < JamoVEnd { - f.quickCheck[MComposed] = QCMaybe - f.combinesBackward = true - f.combinesForward = true - } - if JamoTBase <= i && i < JamoTEnd { - f.quickCheck[MComposed] = QCMaybe - f.combinesBackward = true - } - case !f.combinesBackward: - f.quickCheck[MComposed] = QCYes - default: - f.quickCheck[MComposed] = QCMaybe - } - } -} - -func computeNonStarterCounts() { - // Phase 4: leading and trailing non-starter count - for i := range chars { - c := &chars[i] - - runes := []rune{rune(i)} - // We always use FCompatibility so that the CGJ insertion points do not - // change for repeated normalizations with different forms. - if exp := c.forms[FCompatibility].expandedDecomp; len(exp) > 0 { - runes = exp - } - // We consider runes that combine backwards to be non-starters for the - // purpose of Stream-Safe Text Processing. - for _, r := range runes { - if cr := &chars[r]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { - break - } - c.nLeadingNonStarters++ - } - for i := len(runes) - 1; i >= 0; i-- { - if cr := &chars[runes[i]]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { - break - } - c.nTrailingNonStarters++ - } - if c.nTrailingNonStarters > 3 { - log.Fatalf("%U: Decomposition with more than 3 (%d) trailing modifiers (%U)", i, c.nTrailingNonStarters, runes) - } - - if isHangul(rune(i)) { - c.nTrailingNonStarters = 2 - if isHangulWithoutJamoT(rune(i)) { - c.nTrailingNonStarters = 1 - } - } - - if l, t := c.nLeadingNonStarters, c.nTrailingNonStarters; l > 0 && l != t { - log.Fatalf("%U: number of leading and trailing non-starters should be equal (%d vs %d)", i, l, t) - } - if t := c.nTrailingNonStarters; t > 3 { - log.Fatalf("%U: number of trailing non-starters is %d > 3", t) - } - } -} - -func printBytes(w io.Writer, b []byte, name string) { - fmt.Fprintf(w, "// %s: %d bytes\n", name, len(b)) - fmt.Fprintf(w, "var %s = [...]byte {", name) - for i, c := range b { - switch { - case i%64 == 0: - fmt.Fprintf(w, "\n// Bytes %x - %x\n", i, i+63) - case i%8 == 0: - fmt.Fprintf(w, "\n") - } - fmt.Fprintf(w, "0x%.2X, ", c) - } - fmt.Fprint(w, "\n}\n\n") -} - -// See forminfo.go for format. -func makeEntry(f *FormInfo, c *Char) uint16 { - e := uint16(0) - if r := c.codePoint; HangulBase <= r && r < HangulEnd { - e |= 0x40 - } - if f.combinesForward { - e |= 0x20 - } - if f.quickCheck[MDecomposed] == QCNo { - e |= 0x4 - } - switch f.quickCheck[MComposed] { - case QCYes: - case QCNo: - e |= 0x10 - case QCMaybe: - e |= 0x18 - default: - log.Fatalf("Illegal quickcheck value %v.", f.quickCheck[MComposed]) - } - e |= uint16(c.nTrailingNonStarters) - return e -} - -// decompSet keeps track of unique decompositions, grouped by whether -// the decomposition is followed by a trailing and/or leading CCC. -type decompSet [7]map[string]bool - -const ( - normalDecomp = iota - firstMulti - firstCCC - endMulti - firstLeadingCCC - firstCCCZeroExcept - firstStarterWithNLead - lastDecomp -) - -var cname = []string{"firstMulti", "firstCCC", "endMulti", "firstLeadingCCC", "firstCCCZeroExcept", "firstStarterWithNLead", "lastDecomp"} - -func makeDecompSet() decompSet { - m := decompSet{} - for i := range m { - m[i] = make(map[string]bool) - } - return m -} -func (m *decompSet) insert(key int, s string) { - m[key][s] = true -} - -func printCharInfoTables(w io.Writer) int { - mkstr := func(r rune, f *FormInfo) (int, string) { - d := f.expandedDecomp - s := string([]rune(d)) - if max := 1 << 6; len(s) >= max { - const msg = "%U: too many bytes in decomposition: %d >= %d" - log.Fatalf(msg, r, len(s), max) - } - head := uint8(len(s)) - if f.quickCheck[MComposed] != QCYes { - head |= 0x40 - } - if f.combinesForward { - head |= 0x80 - } - s = string([]byte{head}) + s - - lccc := ccc(d[0]) - tccc := ccc(d[len(d)-1]) - cc := ccc(r) - if cc != 0 && lccc == 0 && tccc == 0 { - log.Fatalf("%U: trailing and leading ccc are 0 for non-zero ccc %d", r, cc) - } - if tccc < lccc && lccc != 0 { - const msg = "%U: lccc (%d) must be <= tcc (%d)" - log.Fatalf(msg, r, lccc, tccc) - } - index := normalDecomp - nTrail := chars[r].nTrailingNonStarters - nLead := chars[r].nLeadingNonStarters - if tccc > 0 || lccc > 0 || nTrail > 0 { - tccc <<= 2 - tccc |= nTrail - s += string([]byte{tccc}) - index = endMulti - for _, r := range d[1:] { - if ccc(r) == 0 { - index = firstCCC - } - } - if lccc > 0 || nLead > 0 { - s += string([]byte{lccc}) - if index == firstCCC { - log.Fatalf("%U: multi-segment decomposition not supported for decompositions with leading CCC != 0", r) - } - index = firstLeadingCCC - } - if cc != lccc { - if cc != 0 { - log.Fatalf("%U: for lccc != ccc, expected ccc to be 0; was %d", r, cc) - } - index = firstCCCZeroExcept - } - } else if len(d) > 1 { - index = firstMulti - } - return index, s - } - - decompSet := makeDecompSet() - const nLeadStr = "\x00\x01" // 0-byte length and tccc with nTrail. - decompSet.insert(firstStarterWithNLead, nLeadStr) - - // Store the uniqued decompositions in a byte buffer, - // preceded by their byte length. - for _, c := range chars { - for _, f := range c.forms { - if len(f.expandedDecomp) == 0 { - continue - } - if f.combinesBackward { - log.Fatalf("%U: combinesBackward and decompose", c.codePoint) - } - index, s := mkstr(c.codePoint, &f) - decompSet.insert(index, s) - } - } - - decompositions := bytes.NewBuffer(make([]byte, 0, 10000)) - size := 0 - positionMap := make(map[string]uint16) - decompositions.WriteString("\000") - fmt.Fprintln(w, "const (") - for i, m := range decompSet { - sa := []string{} - for s := range m { - sa = append(sa, s) - } - sort.Strings(sa) - for _, s := range sa { - p := decompositions.Len() - decompositions.WriteString(s) - positionMap[s] = uint16(p) - } - if cname[i] != "" { - fmt.Fprintf(w, "%s = 0x%X\n", cname[i], decompositions.Len()) - } - } - fmt.Fprintln(w, "maxDecomp = 0x8000") - fmt.Fprintln(w, ")") - b := decompositions.Bytes() - printBytes(w, b, "decomps") - size += len(b) - - varnames := []string{"nfc", "nfkc"} - for i := 0; i < FNumberOfFormTypes; i++ { - trie := triegen.NewTrie(varnames[i]) - - for r, c := range chars { - f := c.forms[i] - d := f.expandedDecomp - if len(d) != 0 { - _, key := mkstr(c.codePoint, &f) - trie.Insert(rune(r), uint64(positionMap[key])) - if c.ccc != ccc(d[0]) { - // We assume the lead ccc of a decomposition !=0 in this case. - if ccc(d[0]) == 0 { - log.Fatalf("Expected leading CCC to be non-zero; ccc is %d", c.ccc) - } - } - } else if c.nLeadingNonStarters > 0 && len(f.expandedDecomp) == 0 && c.ccc == 0 && !f.combinesBackward { - // Handle cases where it can't be detected that the nLead should be equal - // to nTrail. - trie.Insert(c.codePoint, uint64(positionMap[nLeadStr])) - } else if v := makeEntry(&f, &c)<<8 | uint16(c.ccc); v != 0 { - trie.Insert(c.codePoint, uint64(0x8000|v)) - } - } - sz, err := trie.Gen(w, triegen.Compact(&normCompacter{name: varnames[i]})) - if err != nil { - log.Fatal(err) - } - size += sz - } - return size -} - -func contains(sa []string, s string) bool { - for _, a := range sa { - if a == s { - return true - } - } - return false -} - -func makeTables() { - w := &bytes.Buffer{} - - size := 0 - if *tablelist == "" { - return - } - list := strings.Split(*tablelist, ",") - if *tablelist == "all" { - list = []string{"recomp", "info"} - } - - // Compute maximum decomposition size. - max := 0 - for _, c := range chars { - if n := len(string(c.forms[FCompatibility].expandedDecomp)); n > max { - max = n - } - } - fmt.Fprintln(w, `import "sync"`) - fmt.Fprintln(w) - - fmt.Fprintln(w, "const (") - fmt.Fprintln(w, "\t// Version is the Unicode edition from which the tables are derived.") - fmt.Fprintf(w, "\tVersion = %q\n", gen.UnicodeVersion()) - fmt.Fprintln(w) - fmt.Fprintln(w, "\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform") - fmt.Fprintln(w, "\t// may need to write atomically for any Form. Making a destination buffer at") - fmt.Fprintln(w, "\t// least this size ensures that Transform can always make progress and that") - fmt.Fprintln(w, "\t// the user does not need to grow the buffer on an ErrShortDst.") - fmt.Fprintf(w, "\tMaxTransformChunkSize = %d+maxNonStarters*4\n", len(string(0x034F))+max) - fmt.Fprintln(w, ")\n") - - // Print the CCC remap table. - size += len(cccMap) - fmt.Fprintf(w, "var ccc = [%d]uint8{", len(cccMap)) - for i := 0; i < len(cccMap); i++ { - if i%8 == 0 { - fmt.Fprintln(w) - } - fmt.Fprintf(w, "%3d, ", cccMap[uint8(i)]) - } - fmt.Fprintln(w, "\n}\n") - - if contains(list, "info") { - size += printCharInfoTables(w) - } - - if contains(list, "recomp") { - // Note that we use 32 bit keys, instead of 64 bit. - // This clips the bits of three entries, but we know - // this won't cause a collision. The compiler will catch - // any changes made to UnicodeData.txt that introduces - // a collision. - // Note that the recomposition map for NFC and NFKC - // are identical. - - // Recomposition map - nrentries := 0 - for _, c := range chars { - f := c.forms[FCanonical] - if !f.isOneWay && len(f.decomp) > 0 { - nrentries++ - } - } - sz := nrentries * 8 - size += sz - fmt.Fprintf(w, "// recompMap: %d bytes (entries only)\n", sz) - fmt.Fprintln(w, "var recompMap map[uint32]rune") - fmt.Fprintln(w, "var recompMapOnce sync.Once\n") - fmt.Fprintln(w, `const recompMapPacked = "" +`) - var buf [8]byte - for i, c := range chars { - f := c.forms[FCanonical] - d := f.decomp - if !f.isOneWay && len(d) > 0 { - key := uint32(uint16(d[0]))<<16 + uint32(uint16(d[1])) - binary.BigEndian.PutUint32(buf[:4], key) - binary.BigEndian.PutUint32(buf[4:], uint32(i)) - fmt.Fprintf(w, "\t\t%q + // 0x%.8X: 0x%.8X\n", string(buf[:]), key, uint32(i)) - } - } - // hack so we don't have to special case the trailing plus sign - fmt.Fprintf(w, ` ""`) - fmt.Fprintln(w) - } - - fmt.Fprintf(w, "// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size) - gen.WriteVersionedGoFile("tables.go", "norm", w.Bytes()) -} - -func printChars() { - if *verbose { - for _, c := range chars { - if !c.isValid() || c.state == SMissing { - continue - } - fmt.Println(c) - } - } -} - -// verifyComputed does various consistency tests. -func verifyComputed() { - for i, c := range chars { - for _, f := range c.forms { - isNo := (f.quickCheck[MDecomposed] == QCNo) - if (len(f.decomp) > 0) != isNo && !isHangul(rune(i)) { - log.Fatalf("%U: NF*D QC must be No if rune decomposes", i) - } - - isMaybe := f.quickCheck[MComposed] == QCMaybe - if f.combinesBackward != isMaybe { - log.Fatalf("%U: NF*C QC must be Maybe if combinesBackward", i) - } - if len(f.decomp) > 0 && f.combinesForward && isMaybe { - log.Fatalf("%U: NF*C QC must be Yes or No if combinesForward and decomposes", i) - } - - if len(f.expandedDecomp) != 0 { - continue - } - if a, b := c.nLeadingNonStarters > 0, (c.ccc > 0 || f.combinesBackward); a != b { - // We accept these runes to be treated differently (it only affects - // segment breaking in iteration, most likely on improper use), but - // reconsider if more characters are added. - // U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; - // U+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; - // U+3133 HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; - // U+318E HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; - // U+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; - // U+FFDC HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; - if i != 0xFF9E && i != 0xFF9F && !(0x3133 <= i && i <= 0x318E) && !(0xFFA3 <= i && i <= 0xFFDC) { - log.Fatalf("%U: nLead was %v; want %v", i, a, b) - } - } - } - nfc := c.forms[FCanonical] - nfkc := c.forms[FCompatibility] - if nfc.combinesBackward != nfkc.combinesBackward { - log.Fatalf("%U: Cannot combine combinesBackward\n", c.codePoint) - } - } -} - -// Use values in DerivedNormalizationProps.txt to compare against the -// values we computed. -// DerivedNormalizationProps.txt has form: -// 00C0..00C5 ; NFD_QC; N # ... -// 0374 ; NFD_QC; N # ... -// See https://unicode.org/reports/tr44/ for full explanation -func testDerived() { - f := gen.OpenUCDFile("DerivedNormalizationProps.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - r := p.Rune(0) - c := &chars[r] - - var ftype, mode int - qt := p.String(1) - switch qt { - case "NFC_QC": - ftype, mode = FCanonical, MComposed - case "NFD_QC": - ftype, mode = FCanonical, MDecomposed - case "NFKC_QC": - ftype, mode = FCompatibility, MComposed - case "NFKD_QC": - ftype, mode = FCompatibility, MDecomposed - default: - continue - } - var qr QCResult - switch p.String(2) { - case "Y": - qr = QCYes - case "N": - qr = QCNo - case "M": - qr = QCMaybe - default: - log.Fatalf(`Unexpected quick check value "%s"`, p.String(2)) - } - if got := c.forms[ftype].quickCheck[mode]; got != qr { - log.Printf("%U: FAILED %s (was %v need %v)\n", r, qt, got, qr) - } - c.forms[ftype].verified[mode] = true - } - if err := p.Err(); err != nil { - log.Fatal(err) - } - // Any unspecified value must be QCYes. Verify this. - for i, c := range chars { - for j, fd := range c.forms { - for k, qr := range fd.quickCheck { - if !fd.verified[k] && qr != QCYes { - m := "%U: FAIL F:%d M:%d (was %v need Yes) %s\n" - log.Printf(m, i, j, k, qr, c.name) - } - } - } - } -} - -var testHeader = `const ( - Yes = iota - No - Maybe -) - -type formData struct { - qc uint8 - combinesForward bool - decomposition string -} - -type runeData struct { - r rune - ccc uint8 - nLead uint8 - nTrail uint8 - f [2]formData // 0: canonical; 1: compatibility -} - -func f(qc uint8, cf bool, dec string) [2]formData { - return [2]formData{{qc, cf, dec}, {qc, cf, dec}} -} - -func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData { - return [2]formData{{qc, cf, d}, {qck, cfk, dk}} -} - -var testData = []runeData{ -` - -func printTestdata() { - type lastInfo struct { - ccc uint8 - nLead uint8 - nTrail uint8 - f string - } - - last := lastInfo{} - w := &bytes.Buffer{} - fmt.Fprintf(w, testHeader) - for r, c := range chars { - f := c.forms[FCanonical] - qc, cf, d := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) - f = c.forms[FCompatibility] - qck, cfk, dk := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) - s := "" - if d == dk && qc == qck && cf == cfk { - s = fmt.Sprintf("f(%s, %v, %q)", qc, cf, d) - } else { - s = fmt.Sprintf("g(%s, %s, %v, %v, %q, %q)", qc, qck, cf, cfk, d, dk) - } - current := lastInfo{c.ccc, c.nLeadingNonStarters, c.nTrailingNonStarters, s} - if last != current { - fmt.Fprintf(w, "\t{0x%x, %d, %d, %d, %s},\n", r, c.origCCC, c.nLeadingNonStarters, c.nTrailingNonStarters, s) - last = current - } - } - fmt.Fprintln(w, "}") - gen.WriteVersionedGoFile("data_test.go", "norm", w.Bytes()) -} diff --git a/vendor/golang.org/x/text/unicode/norm/triegen.go b/vendor/golang.org/x/text/unicode/norm/triegen.go deleted file mode 100644 index 45d71190..00000000 --- a/vendor/golang.org/x/text/unicode/norm/triegen.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Trie table generator. -// Used by make*tables tools to generate a go file with trie data structures -// for mapping UTF-8 to a 16-bit value. All but the last byte in a UTF-8 byte -// sequence are used to lookup offsets in the index table to be used for the -// next byte. The last byte is used to index into a table with 16-bit values. - -package main - -import ( - "fmt" - "io" -) - -const maxSparseEntries = 16 - -type normCompacter struct { - sparseBlocks [][]uint64 - sparseOffset []uint16 - sparseCount int - name string -} - -func mostFrequentStride(a []uint64) int { - counts := make(map[int]int) - var v int - for _, x := range a { - if stride := int(x) - v; v != 0 && stride >= 0 { - counts[stride]++ - } - v = int(x) - } - var maxs, maxc int - for stride, cnt := range counts { - if cnt > maxc || (cnt == maxc && stride < maxs) { - maxs, maxc = stride, cnt - } - } - return maxs -} - -func countSparseEntries(a []uint64) int { - stride := mostFrequentStride(a) - var v, count int - for _, tv := range a { - if int(tv)-v != stride { - if tv != 0 { - count++ - } - } - v = int(tv) - } - return count -} - -func (c *normCompacter) Size(v []uint64) (sz int, ok bool) { - if n := countSparseEntries(v); n <= maxSparseEntries { - return (n+1)*4 + 2, true - } - return 0, false -} - -func (c *normCompacter) Store(v []uint64) uint32 { - h := uint32(len(c.sparseOffset)) - c.sparseBlocks = append(c.sparseBlocks, v) - c.sparseOffset = append(c.sparseOffset, uint16(c.sparseCount)) - c.sparseCount += countSparseEntries(v) + 1 - return h -} - -func (c *normCompacter) Handler() string { - return c.name + "Sparse.lookup" -} - -func (c *normCompacter) Print(w io.Writer) (retErr error) { - p := func(f string, x ...interface{}) { - if _, err := fmt.Fprintf(w, f, x...); retErr == nil && err != nil { - retErr = err - } - } - - ls := len(c.sparseBlocks) - p("// %sSparseOffset: %d entries, %d bytes\n", c.name, ls, ls*2) - p("var %sSparseOffset = %#v\n\n", c.name, c.sparseOffset) - - ns := c.sparseCount - p("// %sSparseValues: %d entries, %d bytes\n", c.name, ns, ns*4) - p("var %sSparseValues = [%d]valueRange {", c.name, ns) - for i, b := range c.sparseBlocks { - p("\n// Block %#x, offset %#x", i, c.sparseOffset[i]) - var v int - stride := mostFrequentStride(b) - n := countSparseEntries(b) - p("\n{value:%#04x,lo:%#02x},", stride, uint8(n)) - for i, nv := range b { - if int(nv)-v != stride { - if v != 0 { - p(",hi:%#02x},", 0x80+i-1) - } - if nv != 0 { - p("\n{value:%#04x,lo:%#02x", nv, 0x80+i) - } - } - v = int(nv) - } - if v != 0 { - p(",hi:%#02x},", 0x80+len(b)-1) - } - } - p("\n}\n\n") - return -} diff --git a/vendor/google.golang.org/api/analytics/v3/analytics-api.json b/vendor/google.golang.org/api/analytics/v3/analytics-api.json new file mode 100644 index 00000000..9a47e9f1 --- /dev/null +++ b/vendor/google.golang.org/api/analytics/v3/analytics-api.json @@ -0,0 +1,7459 @@ +{ + "auth": { + "oauth2": { + "scopes": { + "https://www.googleapis.com/auth/analytics": { + "description": "View and manage your Google Analytics data" + }, + "https://www.googleapis.com/auth/analytics.edit": { + "description": "Edit Google Analytics management entities" + }, + "https://www.googleapis.com/auth/analytics.manage.users": { + "description": "Manage Google Analytics Account users by email address" + }, + "https://www.googleapis.com/auth/analytics.manage.users.readonly": { + "description": "View Google Analytics user permissions" + }, + "https://www.googleapis.com/auth/analytics.provision": { + "description": "Create a new Google Analytics account along with its default property and view" + }, + "https://www.googleapis.com/auth/analytics.readonly": { + "description": "View your Google Analytics data" + }, + "https://www.googleapis.com/auth/analytics.user.deletion": { + "description": "Manage Google Analytics user deletion requests" + } + } + } + }, + "basePath": "/analytics/v3/", + "baseUrl": "https://www.googleapis.com/analytics/v3/", + "batchPath": "batch/analytics/v3", + "description": "Views and manages your Google Analytics data.", + "discoveryVersion": "v1", + "documentationLink": "https://developers.google.com/analytics/", + "etag": "\"9eZ1uxVRThTDhLJCZHhqs3eQWz4/o_TVyaWurnALX6ZIQ952-U5m22Y\"", + "icons": { + "x16": "https://www.google.com/images/icons/product/analytics-16.png", + "x32": "https://www.google.com/images/icons/product/analytics-32.png" + }, + "id": "analytics:v3", + "kind": "discovery#restDescription", + "name": "analytics", + "ownerDomain": "google.com", + "ownerName": "Google", + "parameters": { + "alt": { + "default": "json", + "description": "Data format for the response.", + "enum": [ + "json" + ], + "enumDescriptions": [ + "Responses with Content-Type of application/json" + ], + "location": "query", + "type": "string" + }, + "fields": { + "description": "Selector specifying which fields to include in a partial response.", + "location": "query", + "type": "string" + }, + "key": { + "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", + "location": "query", + "type": "string" + }, + "oauth_token": { + "description": "OAuth 2.0 token for the current user.", + "location": "query", + "type": "string" + }, + "prettyPrint": { + "default": "false", + "description": "Returns response with indentations and line breaks.", + "location": "query", + "type": "boolean" + }, + "quotaUser": { + "description": "An opaque string that represents a user for quota purposes. Must not exceed 40 characters.", + "location": "query", + "type": "string" + }, + "userIp": { + "description": "Deprecated. Please use quotaUser instead.", + "location": "query", + "type": "string" + } + }, + "protocol": "rest", + "resources": { + "data": { + "resources": { + "ga": { + "methods": { + "get": { + "description": "Returns Analytics data for a view (profile).", + "httpMethod": "GET", + "id": "analytics.data.ga.get", + "parameterOrder": [ + "ids", + "start-date", + "end-date", + "metrics" + ], + "parameters": { + "dimensions": { + "description": "A comma-separated list of Analytics dimensions. E.g., 'ga:browser,ga:city'.", + "location": "query", + "pattern": "(ga:.+)?", + "type": "string" + }, + "end-date": { + "description": "End date for fetching Analytics data. Request can should specify an end date formatted as YYYY-MM-DD, or as a relative date (e.g., today, yesterday, or 7daysAgo). The default value is yesterday.", + "location": "query", + "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}|today|yesterday|[0-9]+(daysAgo)", + "required": true, + "type": "string" + }, + "filters": { + "description": "A comma-separated list of dimension or metric filters to be applied to Analytics data.", + "location": "query", + "pattern": "ga:.+", + "type": "string" + }, + "ids": { + "description": "Unique table ID for retrieving Analytics data. Table ID is of the form ga:XXXX, where XXXX is the Analytics view (profile) ID.", + "location": "query", + "pattern": "ga:[0-9]+", + "required": true, + "type": "string" + }, + "include-empty-rows": { + "description": "The response will include empty rows if this parameter is set to true, the default is true", + "location": "query", + "type": "boolean" + }, + "max-results": { + "description": "The maximum number of entries to include in this feed.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "metrics": { + "description": "A comma-separated list of Analytics metrics. E.g., 'ga:sessions,ga:pageviews'. At least one metric must be specified.", + "location": "query", + "pattern": "ga:.+", + "required": true, + "type": "string" + }, + "output": { + "description": "The selected format for the response. Default format is JSON.", + "enum": [ + "dataTable", + "json" + ], + "enumDescriptions": [ + "Returns the response in Google Charts Data Table format. This is useful in creating visualization using Google Charts.", + "Returns the response in standard JSON format." + ], + "location": "query", + "type": "string" + }, + "samplingLevel": { + "description": "The desired sampling level.", + "enum": [ + "DEFAULT", + "FASTER", + "HIGHER_PRECISION" + ], + "enumDescriptions": [ + "Returns response with a sample size that balances speed and accuracy.", + "Returns a fast response with a smaller sample size.", + "Returns a more accurate response using a large sample size, but this may result in the response being slower." + ], + "location": "query", + "type": "string" + }, + "segment": { + "description": "An Analytics segment to be applied to data.", + "location": "query", + "type": "string" + }, + "sort": { + "description": "A comma-separated list of dimensions or metrics that determine the sort order for Analytics data.", + "location": "query", + "pattern": "(-)?ga:.+", + "type": "string" + }, + "start-date": { + "description": "Start date for fetching Analytics data. Requests can specify a start date formatted as YYYY-MM-DD, or as a relative date (e.g., today, yesterday, or 7daysAgo). The default value is 7daysAgo.", + "location": "query", + "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}|today|yesterday|[0-9]+(daysAgo)", + "required": true, + "type": "string" + }, + "start-index": { + "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + } + }, + "path": "data/ga", + "response": { + "$ref": "GaData" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.readonly" + ] + } + } + }, + "mcf": { + "methods": { + "get": { + "description": "Returns Analytics Multi-Channel Funnels data for a view (profile).", + "httpMethod": "GET", + "id": "analytics.data.mcf.get", + "parameterOrder": [ + "ids", + "start-date", + "end-date", + "metrics" + ], + "parameters": { + "dimensions": { + "description": "A comma-separated list of Multi-Channel Funnels dimensions. E.g., 'mcf:source,mcf:medium'.", + "location": "query", + "pattern": "(mcf:.+)?", + "type": "string" + }, + "end-date": { + "description": "End date for fetching Analytics data. Requests can specify a start date formatted as YYYY-MM-DD, or as a relative date (e.g., today, yesterday, or 7daysAgo). The default value is 7daysAgo.", + "location": "query", + "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}|today|yesterday|[0-9]+(daysAgo)", + "required": true, + "type": "string" + }, + "filters": { + "description": "A comma-separated list of dimension or metric filters to be applied to the Analytics data.", + "location": "query", + "pattern": "mcf:.+", + "type": "string" + }, + "ids": { + "description": "Unique table ID for retrieving Analytics data. Table ID is of the form ga:XXXX, where XXXX is the Analytics view (profile) ID.", + "location": "query", + "pattern": "ga:[0-9]+", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of entries to include in this feed.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "metrics": { + "description": "A comma-separated list of Multi-Channel Funnels metrics. E.g., 'mcf:totalConversions,mcf:totalConversionValue'. At least one metric must be specified.", + "location": "query", + "pattern": "mcf:.+", + "required": true, + "type": "string" + }, + "samplingLevel": { + "description": "The desired sampling level.", + "enum": [ + "DEFAULT", + "FASTER", + "HIGHER_PRECISION" + ], + "enumDescriptions": [ + "Returns response with a sample size that balances speed and accuracy.", + "Returns a fast response with a smaller sample size.", + "Returns a more accurate response using a large sample size, but this may result in the response being slower." + ], + "location": "query", + "type": "string" + }, + "sort": { + "description": "A comma-separated list of dimensions or metrics that determine the sort order for the Analytics data.", + "location": "query", + "pattern": "(-)?mcf:.+", + "type": "string" + }, + "start-date": { + "description": "Start date for fetching Analytics data. Requests can specify a start date formatted as YYYY-MM-DD, or as a relative date (e.g., today, yesterday, or 7daysAgo). The default value is 7daysAgo.", + "location": "query", + "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}|today|yesterday|[0-9]+(daysAgo)", + "required": true, + "type": "string" + }, + "start-index": { + "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + } + }, + "path": "data/mcf", + "response": { + "$ref": "McfData" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.readonly" + ] + } + } + }, + "realtime": { + "methods": { + "get": { + "description": "Returns real time data for a view (profile).", + "httpMethod": "GET", + "id": "analytics.data.realtime.get", + "parameterOrder": [ + "ids", + "metrics" + ], + "parameters": { + "dimensions": { + "description": "A comma-separated list of real time dimensions. E.g., 'rt:medium,rt:city'.", + "location": "query", + "pattern": "(ga:.+)|(rt:.+)", + "type": "string" + }, + "filters": { + "description": "A comma-separated list of dimension or metric filters to be applied to real time data.", + "location": "query", + "pattern": "(ga:.+)|(rt:.+)", + "type": "string" + }, + "ids": { + "description": "Unique table ID for retrieving real time data. Table ID is of the form ga:XXXX, where XXXX is the Analytics view (profile) ID.", + "location": "query", + "pattern": "ga:[0-9]+", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of entries to include in this feed.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "metrics": { + "description": "A comma-separated list of real time metrics. E.g., 'rt:activeUsers'. At least one metric must be specified.", + "location": "query", + "pattern": "(ga:.+)|(rt:.+)", + "required": true, + "type": "string" + }, + "sort": { + "description": "A comma-separated list of dimensions or metrics that determine the sort order for real time data.", + "location": "query", + "pattern": "(-)?((ga:.+)|(rt:.+))", + "type": "string" + } + }, + "path": "data/realtime", + "response": { + "$ref": "RealtimeData" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.readonly" + ] + } + } + } + } + }, + "management": { + "resources": { + "accountSummaries": { + "methods": { + "list": { + "description": "Lists account summaries (lightweight tree comprised of accounts/properties/profiles) to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.accountSummaries.list", + "parameters": { + "max-results": { + "description": "The maximum number of account summaries to include in this response, where the largest acceptable value is 1000.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + } + }, + "path": "management/accountSummaries", + "response": { + "$ref": "AccountSummaries" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + } + } + }, + "accountUserLinks": { + "methods": { + "delete": { + "description": "Removes a user from the given account.", + "httpMethod": "DELETE", + "id": "analytics.management.accountUserLinks.delete", + "parameterOrder": [ + "accountId", + "linkId" + ], + "parameters": { + "accountId": { + "description": "Account ID to delete the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "linkId": { + "description": "Link ID to delete the user link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/entityUserLinks/{linkId}", + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users" + ] + }, + "insert": { + "description": "Adds a new user to the given account.", + "httpMethod": "POST", + "id": "analytics.management.accountUserLinks.insert", + "parameterOrder": [ + "accountId" + ], + "parameters": { + "accountId": { + "description": "Account ID to create the user link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/entityUserLinks", + "request": { + "$ref": "EntityUserLink" + }, + "response": { + "$ref": "EntityUserLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users" + ] + }, + "list": { + "description": "Lists account-user links for a given account.", + "httpMethod": "GET", + "id": "analytics.management.accountUserLinks.list", + "parameterOrder": [ + "accountId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve the user links for.", + "location": "path", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of account-user links to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first account-user link to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + } + }, + "path": "management/accounts/{accountId}/entityUserLinks", + "response": { + "$ref": "EntityUserLinks" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users", + "https://www.googleapis.com/auth/analytics.manage.users.readonly" + ] + }, + "update": { + "description": "Updates permissions for an existing user on the given account.", + "httpMethod": "PUT", + "id": "analytics.management.accountUserLinks.update", + "parameterOrder": [ + "accountId", + "linkId" + ], + "parameters": { + "accountId": { + "description": "Account ID to update the account-user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "linkId": { + "description": "Link ID to update the account-user link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/entityUserLinks/{linkId}", + "request": { + "$ref": "EntityUserLink" + }, + "response": { + "$ref": "EntityUserLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users" + ] + } + } + }, + "accounts": { + "methods": { + "list": { + "description": "Lists all accounts to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.accounts.list", + "parameters": { + "max-results": { + "description": "The maximum number of accounts to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first account to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + } + }, + "path": "management/accounts", + "response": { + "$ref": "Accounts" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + } + } + }, + "clientId": { + "methods": { + "hashClientId": { + "description": "Hashes the given Client ID.", + "httpMethod": "POST", + "id": "analytics.management.clientId.hashClientId", + "path": "management/clientId:hashClientId", + "request": { + "$ref": "HashClientIdRequest" + }, + "response": { + "$ref": "HashClientIdResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + } + } + }, + "customDataSources": { + "methods": { + "list": { + "description": "List custom data sources to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.customDataSources.list", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account Id for the custom data sources to retrieve.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of custom data sources to include in this response.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "start-index": { + "description": "A 1-based index of the first custom data source to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web property Id for the custom data sources to retrieve.", + "location": "path", + "pattern": "UA-(\\d+)-(\\d+)", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources", + "response": { + "$ref": "CustomDataSources" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + } + } + }, + "customDimensions": { + "methods": { + "get": { + "description": "Get a custom dimension to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.customDimensions.get", + "parameterOrder": [ + "accountId", + "webPropertyId", + "customDimensionId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the custom dimension to retrieve.", + "location": "path", + "required": true, + "type": "string" + }, + "customDimensionId": { + "description": "The ID of the custom dimension to retrieve.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID for the custom dimension to retrieve.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}", + "response": { + "$ref": "CustomDimension" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Create a new custom dimension.", + "httpMethod": "POST", + "id": "analytics.management.customDimensions.insert", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the custom dimension to create.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID for the custom dimension to create.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions", + "request": { + "$ref": "CustomDimension" + }, + "response": { + "$ref": "CustomDimension" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists custom dimensions to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.customDimensions.list", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the custom dimensions to retrieve.", + "location": "path", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of custom dimensions to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web property ID for the custom dimensions to retrieve.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions", + "response": { + "$ref": "CustomDimensions" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "patch": { + "description": "Updates an existing custom dimension. This method supports patch semantics.", + "httpMethod": "PATCH", + "id": "analytics.management.customDimensions.patch", + "parameterOrder": [ + "accountId", + "webPropertyId", + "customDimensionId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the custom dimension to update.", + "location": "path", + "required": true, + "type": "string" + }, + "customDimensionId": { + "description": "Custom dimension ID for the custom dimension to update.", + "location": "path", + "required": true, + "type": "string" + }, + "ignoreCustomDataSourceLinks": { + "default": "false", + "description": "Force the update and ignore any warnings related to the custom dimension being linked to a custom data source / data set.", + "location": "query", + "type": "boolean" + }, + "webPropertyId": { + "description": "Web property ID for the custom dimension to update.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}", + "request": { + "$ref": "CustomDimension" + }, + "response": { + "$ref": "CustomDimension" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "update": { + "description": "Updates an existing custom dimension.", + "httpMethod": "PUT", + "id": "analytics.management.customDimensions.update", + "parameterOrder": [ + "accountId", + "webPropertyId", + "customDimensionId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the custom dimension to update.", + "location": "path", + "required": true, + "type": "string" + }, + "customDimensionId": { + "description": "Custom dimension ID for the custom dimension to update.", + "location": "path", + "required": true, + "type": "string" + }, + "ignoreCustomDataSourceLinks": { + "default": "false", + "description": "Force the update and ignore any warnings related to the custom dimension being linked to a custom data source / data set.", + "location": "query", + "type": "boolean" + }, + "webPropertyId": { + "description": "Web property ID for the custom dimension to update.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}", + "request": { + "$ref": "CustomDimension" + }, + "response": { + "$ref": "CustomDimension" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + } + } + }, + "customMetrics": { + "methods": { + "get": { + "description": "Get a custom metric to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.customMetrics.get", + "parameterOrder": [ + "accountId", + "webPropertyId", + "customMetricId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the custom metric to retrieve.", + "location": "path", + "required": true, + "type": "string" + }, + "customMetricId": { + "description": "The ID of the custom metric to retrieve.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID for the custom metric to retrieve.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}", + "response": { + "$ref": "CustomMetric" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Create a new custom metric.", + "httpMethod": "POST", + "id": "analytics.management.customMetrics.insert", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the custom metric to create.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID for the custom dimension to create.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics", + "request": { + "$ref": "CustomMetric" + }, + "response": { + "$ref": "CustomMetric" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists custom metrics to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.customMetrics.list", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the custom metrics to retrieve.", + "location": "path", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of custom metrics to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web property ID for the custom metrics to retrieve.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics", + "response": { + "$ref": "CustomMetrics" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "patch": { + "description": "Updates an existing custom metric. This method supports patch semantics.", + "httpMethod": "PATCH", + "id": "analytics.management.customMetrics.patch", + "parameterOrder": [ + "accountId", + "webPropertyId", + "customMetricId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the custom metric to update.", + "location": "path", + "required": true, + "type": "string" + }, + "customMetricId": { + "description": "Custom metric ID for the custom metric to update.", + "location": "path", + "required": true, + "type": "string" + }, + "ignoreCustomDataSourceLinks": { + "default": "false", + "description": "Force the update and ignore any warnings related to the custom metric being linked to a custom data source / data set.", + "location": "query", + "type": "boolean" + }, + "webPropertyId": { + "description": "Web property ID for the custom metric to update.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}", + "request": { + "$ref": "CustomMetric" + }, + "response": { + "$ref": "CustomMetric" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "update": { + "description": "Updates an existing custom metric.", + "httpMethod": "PUT", + "id": "analytics.management.customMetrics.update", + "parameterOrder": [ + "accountId", + "webPropertyId", + "customMetricId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the custom metric to update.", + "location": "path", + "required": true, + "type": "string" + }, + "customMetricId": { + "description": "Custom metric ID for the custom metric to update.", + "location": "path", + "required": true, + "type": "string" + }, + "ignoreCustomDataSourceLinks": { + "default": "false", + "description": "Force the update and ignore any warnings related to the custom metric being linked to a custom data source / data set.", + "location": "query", + "type": "boolean" + }, + "webPropertyId": { + "description": "Web property ID for the custom metric to update.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}", + "request": { + "$ref": "CustomMetric" + }, + "response": { + "$ref": "CustomMetric" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + } + } + }, + "experiments": { + "methods": { + "delete": { + "description": "Delete an experiment.", + "httpMethod": "DELETE", + "id": "analytics.management.experiments.delete", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "experimentId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which the experiment belongs", + "location": "path", + "required": true, + "type": "string" + }, + "experimentId": { + "description": "ID of the experiment to delete", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to which the experiment belongs", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to which the experiment belongs", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}", + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "get": { + "description": "Returns an experiment to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.experiments.get", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "experimentId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve the experiment for.", + "location": "path", + "required": true, + "type": "string" + }, + "experimentId": { + "description": "Experiment ID to retrieve the experiment for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to retrieve the experiment for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to retrieve the experiment for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}", + "response": { + "$ref": "Experiment" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Create a new experiment.", + "httpMethod": "POST", + "id": "analytics.management.experiments.insert", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to create the experiment for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to create the experiment for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to create the experiment for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments", + "request": { + "$ref": "Experiment" + }, + "response": { + "$ref": "Experiment" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists experiments to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.experiments.list", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve experiments for.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of experiments to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "profileId": { + "description": "View (Profile) ID to retrieve experiments for.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "start-index": { + "description": "An index of the first experiment to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web property ID to retrieve experiments for.", + "location": "path", + "pattern": "UA-(\\d+)-(\\d+)", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments", + "response": { + "$ref": "Experiments" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "patch": { + "description": "Update an existing experiment. This method supports patch semantics.", + "httpMethod": "PATCH", + "id": "analytics.management.experiments.patch", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "experimentId" + ], + "parameters": { + "accountId": { + "description": "Account ID of the experiment to update.", + "location": "path", + "required": true, + "type": "string" + }, + "experimentId": { + "description": "Experiment ID of the experiment to update.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID of the experiment to update.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID of the experiment to update.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}", + "request": { + "$ref": "Experiment" + }, + "response": { + "$ref": "Experiment" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "update": { + "description": "Update an existing experiment.", + "httpMethod": "PUT", + "id": "analytics.management.experiments.update", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "experimentId" + ], + "parameters": { + "accountId": { + "description": "Account ID of the experiment to update.", + "location": "path", + "required": true, + "type": "string" + }, + "experimentId": { + "description": "Experiment ID of the experiment to update.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID of the experiment to update.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID of the experiment to update.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}", + "request": { + "$ref": "Experiment" + }, + "response": { + "$ref": "Experiment" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit" + ] + } + } + }, + "filters": { + "methods": { + "delete": { + "description": "Delete a filter.", + "httpMethod": "DELETE", + "id": "analytics.management.filters.delete", + "parameterOrder": [ + "accountId", + "filterId" + ], + "parameters": { + "accountId": { + "description": "Account ID to delete the filter for.", + "location": "path", + "required": true, + "type": "string" + }, + "filterId": { + "description": "ID of the filter to be deleted.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/filters/{filterId}", + "response": { + "$ref": "Filter" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "get": { + "description": "Returns filters to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.filters.get", + "parameterOrder": [ + "accountId", + "filterId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve filters for.", + "location": "path", + "required": true, + "type": "string" + }, + "filterId": { + "description": "Filter ID to retrieve filters for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/filters/{filterId}", + "response": { + "$ref": "Filter" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Create a new filter.", + "httpMethod": "POST", + "id": "analytics.management.filters.insert", + "parameterOrder": [ + "accountId" + ], + "parameters": { + "accountId": { + "description": "Account ID to create filter for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/filters", + "request": { + "$ref": "Filter" + }, + "response": { + "$ref": "Filter" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists all filters for an account", + "httpMethod": "GET", + "id": "analytics.management.filters.list", + "parameterOrder": [ + "accountId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve filters for.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of filters to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + } + }, + "path": "management/accounts/{accountId}/filters", + "response": { + "$ref": "Filters" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "patch": { + "description": "Updates an existing filter. This method supports patch semantics.", + "httpMethod": "PATCH", + "id": "analytics.management.filters.patch", + "parameterOrder": [ + "accountId", + "filterId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which the filter belongs.", + "location": "path", + "required": true, + "type": "string" + }, + "filterId": { + "description": "ID of the filter to be updated.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/filters/{filterId}", + "request": { + "$ref": "Filter" + }, + "response": { + "$ref": "Filter" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "update": { + "description": "Updates an existing filter.", + "httpMethod": "PUT", + "id": "analytics.management.filters.update", + "parameterOrder": [ + "accountId", + "filterId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which the filter belongs.", + "location": "path", + "required": true, + "type": "string" + }, + "filterId": { + "description": "ID of the filter to be updated.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/filters/{filterId}", + "request": { + "$ref": "Filter" + }, + "response": { + "$ref": "Filter" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + } + } + }, + "goals": { + "methods": { + "get": { + "description": "Gets a goal to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.goals.get", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "goalId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve the goal for.", + "location": "path", + "required": true, + "type": "string" + }, + "goalId": { + "description": "Goal ID to retrieve the goal for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to retrieve the goal for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to retrieve the goal for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}", + "response": { + "$ref": "Goal" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Create a new goal.", + "httpMethod": "POST", + "id": "analytics.management.goals.insert", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to create the goal for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to create the goal for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to create the goal for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals", + "request": { + "$ref": "Goal" + }, + "response": { + "$ref": "Goal" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists goals to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.goals.list", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve goals for. Can either be a specific account ID or '~all', which refers to all the accounts that user has access to.", + "location": "path", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of goals to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "profileId": { + "description": "View (Profile) ID to retrieve goals for. Can either be a specific view (profile) ID or '~all', which refers to all the views (profiles) that user has access to.", + "location": "path", + "required": true, + "type": "string" + }, + "start-index": { + "description": "An index of the first goal to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web property ID to retrieve goals for. Can either be a specific web property ID or '~all', which refers to all the web properties that user has access to.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals", + "response": { + "$ref": "Goals" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "patch": { + "description": "Updates an existing goal. This method supports patch semantics.", + "httpMethod": "PATCH", + "id": "analytics.management.goals.patch", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "goalId" + ], + "parameters": { + "accountId": { + "description": "Account ID to update the goal.", + "location": "path", + "required": true, + "type": "string" + }, + "goalId": { + "description": "Index of the goal to be updated.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to update the goal.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to update the goal.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}", + "request": { + "$ref": "Goal" + }, + "response": { + "$ref": "Goal" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "update": { + "description": "Updates an existing goal.", + "httpMethod": "PUT", + "id": "analytics.management.goals.update", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "goalId" + ], + "parameters": { + "accountId": { + "description": "Account ID to update the goal.", + "location": "path", + "required": true, + "type": "string" + }, + "goalId": { + "description": "Index of the goal to be updated.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to update the goal.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to update the goal.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}", + "request": { + "$ref": "Goal" + }, + "response": { + "$ref": "Goal" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + } + } + }, + "profileFilterLinks": { + "methods": { + "delete": { + "description": "Delete a profile filter link.", + "httpMethod": "DELETE", + "id": "analytics.management.profileFilterLinks.delete", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "linkId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which the profile filter link belongs.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "linkId": { + "description": "ID of the profile filter link to delete.", + "location": "path", + "pattern": "\\d+:\\d+", + "required": true, + "type": "string" + }, + "profileId": { + "description": "Profile ID to which the filter link belongs.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property Id to which the profile filter link belongs.", + "location": "path", + "pattern": "UA-(\\d+)-(\\d+)", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}", + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "get": { + "description": "Returns a single profile filter link.", + "httpMethod": "GET", + "id": "analytics.management.profileFilterLinks.get", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "linkId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve profile filter link for.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "linkId": { + "description": "ID of the profile filter link.", + "location": "path", + "pattern": "\\d+:\\d+", + "required": true, + "type": "string" + }, + "profileId": { + "description": "Profile ID to retrieve filter link for.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property Id to retrieve profile filter link for.", + "location": "path", + "pattern": "UA-(\\d+)-(\\d+)", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}", + "response": { + "$ref": "ProfileFilterLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Create a new profile filter link.", + "httpMethod": "POST", + "id": "analytics.management.profileFilterLinks.insert", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to create profile filter link for.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "profileId": { + "description": "Profile ID to create filter link for.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property Id to create profile filter link for.", + "location": "path", + "pattern": "UA-(\\d+)-(\\d+)", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks", + "request": { + "$ref": "ProfileFilterLink" + }, + "response": { + "$ref": "ProfileFilterLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists all profile filter links for a profile.", + "httpMethod": "GET", + "id": "analytics.management.profileFilterLinks.list", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve profile filter links for.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of profile filter links to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "profileId": { + "description": "Profile ID to retrieve filter links for. Can either be a specific profile ID or '~all', which refers to all the profiles that user has access to.", + "location": "path", + "required": true, + "type": "string" + }, + "start-index": { + "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web property Id for profile filter links for. Can either be a specific web property ID or '~all', which refers to all the web properties that user has access to.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks", + "response": { + "$ref": "ProfileFilterLinks" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "patch": { + "description": "Update an existing profile filter link. This method supports patch semantics.", + "httpMethod": "PATCH", + "id": "analytics.management.profileFilterLinks.patch", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "linkId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which profile filter link belongs.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "linkId": { + "description": "ID of the profile filter link to be updated.", + "location": "path", + "pattern": "\\d+:\\d+", + "required": true, + "type": "string" + }, + "profileId": { + "description": "Profile ID to which filter link belongs", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property Id to which profile filter link belongs", + "location": "path", + "pattern": "UA-(\\d+)-(\\d+)", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}", + "request": { + "$ref": "ProfileFilterLink" + }, + "response": { + "$ref": "ProfileFilterLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "update": { + "description": "Update an existing profile filter link.", + "httpMethod": "PUT", + "id": "analytics.management.profileFilterLinks.update", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "linkId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which profile filter link belongs.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "linkId": { + "description": "ID of the profile filter link to be updated.", + "location": "path", + "pattern": "\\d+:\\d+", + "required": true, + "type": "string" + }, + "profileId": { + "description": "Profile ID to which filter link belongs", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property Id to which profile filter link belongs", + "location": "path", + "pattern": "UA-(\\d+)-(\\d+)", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}", + "request": { + "$ref": "ProfileFilterLink" + }, + "response": { + "$ref": "ProfileFilterLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + } + } + }, + "profileUserLinks": { + "methods": { + "delete": { + "description": "Removes a user from the given view (profile).", + "httpMethod": "DELETE", + "id": "analytics.management.profileUserLinks.delete", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "linkId" + ], + "parameters": { + "accountId": { + "description": "Account ID to delete the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "linkId": { + "description": "Link ID to delete the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to delete the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web Property ID to delete the user link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}", + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users" + ] + }, + "insert": { + "description": "Adds a new user to the given view (profile).", + "httpMethod": "POST", + "id": "analytics.management.profileUserLinks.insert", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to create the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to create the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web Property ID to create the user link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks", + "request": { + "$ref": "EntityUserLink" + }, + "response": { + "$ref": "EntityUserLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users" + ] + }, + "list": { + "description": "Lists profile-user links for a given view (profile).", + "httpMethod": "GET", + "id": "analytics.management.profileUserLinks.list", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID which the given view (profile) belongs to.", + "location": "path", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of profile-user links to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "profileId": { + "description": "View (Profile) ID to retrieve the profile-user links for. Can either be a specific profile ID or '~all', which refers to all the profiles that user has access to.", + "location": "path", + "required": true, + "type": "string" + }, + "start-index": { + "description": "An index of the first profile-user link to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web Property ID which the given view (profile) belongs to. Can either be a specific web property ID or '~all', which refers to all the web properties that user has access to.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks", + "response": { + "$ref": "EntityUserLinks" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users", + "https://www.googleapis.com/auth/analytics.manage.users.readonly" + ] + }, + "update": { + "description": "Updates permissions for an existing user on the given view (profile).", + "httpMethod": "PUT", + "id": "analytics.management.profileUserLinks.update", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "linkId" + ], + "parameters": { + "accountId": { + "description": "Account ID to update the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "linkId": { + "description": "Link ID to update the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile ID) to update the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web Property ID to update the user link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}", + "request": { + "$ref": "EntityUserLink" + }, + "response": { + "$ref": "EntityUserLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users" + ] + } + } + }, + "profiles": { + "methods": { + "delete": { + "description": "Deletes a view (profile).", + "httpMethod": "DELETE", + "id": "analytics.management.profiles.delete", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to delete the view (profile) for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "ID of the view (profile) to be deleted.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to delete the view (profile) for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}", + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "get": { + "description": "Gets a view (profile) to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.profiles.get", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve the view (profile) for.", + "location": "path", + "pattern": "[0-9]+", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to retrieve the view (profile) for.", + "location": "path", + "pattern": "[0-9]+", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to retrieve the view (profile) for.", + "location": "path", + "pattern": "UA-[0-9]+-[0-9]+", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}", + "response": { + "$ref": "Profile" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Create a new view (profile).", + "httpMethod": "POST", + "id": "analytics.management.profiles.insert", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID to create the view (profile) for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to create the view (profile) for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles", + "request": { + "$ref": "Profile" + }, + "response": { + "$ref": "Profile" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists views (profiles) to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.profiles.list", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID for the view (profiles) to retrieve. Can either be a specific account ID or '~all', which refers to all the accounts to which the user has access.", + "location": "path", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of views (profiles) to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web property ID for the views (profiles) to retrieve. Can either be a specific web property ID or '~all', which refers to all the web properties to which the user has access.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles", + "response": { + "$ref": "Profiles" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "patch": { + "description": "Updates an existing view (profile). This method supports patch semantics.", + "httpMethod": "PATCH", + "id": "analytics.management.profiles.patch", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which the view (profile) belongs", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "ID of the view (profile) to be updated.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to which the view (profile) belongs", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}", + "request": { + "$ref": "Profile" + }, + "response": { + "$ref": "Profile" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "update": { + "description": "Updates an existing view (profile).", + "httpMethod": "PUT", + "id": "analytics.management.profiles.update", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which the view (profile) belongs", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "ID of the view (profile) to be updated.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to which the view (profile) belongs", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}", + "request": { + "$ref": "Profile" + }, + "response": { + "$ref": "Profile" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + } + } + }, + "remarketingAudience": { + "methods": { + "delete": { + "description": "Delete a remarketing audience.", + "httpMethod": "DELETE", + "id": "analytics.management.remarketingAudience.delete", + "parameterOrder": [ + "accountId", + "webPropertyId", + "remarketingAudienceId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which the remarketing audience belongs.", + "location": "path", + "required": true, + "type": "string" + }, + "remarketingAudienceId": { + "description": "The ID of the remarketing audience to delete.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to which the remarketing audience belongs.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}", + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "get": { + "description": "Gets a remarketing audience to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.remarketingAudience.get", + "parameterOrder": [ + "accountId", + "webPropertyId", + "remarketingAudienceId" + ], + "parameters": { + "accountId": { + "description": "The account ID of the remarketing audience to retrieve.", + "location": "path", + "required": true, + "type": "string" + }, + "remarketingAudienceId": { + "description": "The ID of the remarketing audience to retrieve.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "The web property ID of the remarketing audience to retrieve.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}", + "response": { + "$ref": "RemarketingAudience" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Creates a new remarketing audience.", + "httpMethod": "POST", + "id": "analytics.management.remarketingAudience.insert", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "The account ID for which to create the remarketing audience.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID for which to create the remarketing audience.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences", + "request": { + "$ref": "RemarketingAudience" + }, + "response": { + "$ref": "RemarketingAudience" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists remarketing audiences to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.remarketingAudience.list", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "The account ID of the remarketing audiences to retrieve.", + "location": "path", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of remarketing audiences to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "type": { + "default": "all", + "location": "query", + "type": "string" + }, + "webPropertyId": { + "description": "The web property ID of the remarketing audiences to retrieve.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences", + "response": { + "$ref": "RemarketingAudiences" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "patch": { + "description": "Updates an existing remarketing audience. This method supports patch semantics.", + "httpMethod": "PATCH", + "id": "analytics.management.remarketingAudience.patch", + "parameterOrder": [ + "accountId", + "webPropertyId", + "remarketingAudienceId" + ], + "parameters": { + "accountId": { + "description": "The account ID of the remarketing audience to update.", + "location": "path", + "required": true, + "type": "string" + }, + "remarketingAudienceId": { + "description": "The ID of the remarketing audience to update.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "The web property ID of the remarketing audience to update.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}", + "request": { + "$ref": "RemarketingAudience" + }, + "response": { + "$ref": "RemarketingAudience" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "update": { + "description": "Updates an existing remarketing audience.", + "httpMethod": "PUT", + "id": "analytics.management.remarketingAudience.update", + "parameterOrder": [ + "accountId", + "webPropertyId", + "remarketingAudienceId" + ], + "parameters": { + "accountId": { + "description": "The account ID of the remarketing audience to update.", + "location": "path", + "required": true, + "type": "string" + }, + "remarketingAudienceId": { + "description": "The ID of the remarketing audience to update.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "The web property ID of the remarketing audience to update.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}", + "request": { + "$ref": "RemarketingAudience" + }, + "response": { + "$ref": "RemarketingAudience" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + } + } + }, + "segments": { + "methods": { + "list": { + "description": "Lists segments to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.segments.list", + "parameters": { + "max-results": { + "description": "The maximum number of segments to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first segment to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + } + }, + "path": "management/segments", + "response": { + "$ref": "Segments" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + } + } + }, + "unsampledReports": { + "methods": { + "delete": { + "description": "Deletes an unsampled report.", + "httpMethod": "DELETE", + "id": "analytics.management.unsampledReports.delete", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "unsampledReportId" + ], + "parameters": { + "accountId": { + "description": "Account ID to delete the unsampled report for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to delete the unsampled report for.", + "location": "path", + "required": true, + "type": "string" + }, + "unsampledReportId": { + "description": "ID of the unsampled report to be deleted.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to delete the unsampled reports for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}", + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "get": { + "description": "Returns a single unsampled report.", + "httpMethod": "GET", + "id": "analytics.management.unsampledReports.get", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId", + "unsampledReportId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve unsampled report for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to retrieve unsampled report for.", + "location": "path", + "required": true, + "type": "string" + }, + "unsampledReportId": { + "description": "ID of the unsampled report to retrieve.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to retrieve unsampled reports for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}", + "response": { + "$ref": "UnsampledReport" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Create a new unsampled report.", + "httpMethod": "POST", + "id": "analytics.management.unsampledReports.insert", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to create the unsampled report for.", + "location": "path", + "required": true, + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to create the unsampled report for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to create the unsampled report for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports", + "request": { + "$ref": "UnsampledReport" + }, + "response": { + "$ref": "UnsampledReport" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists unsampled reports to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.unsampledReports.list", + "parameterOrder": [ + "accountId", + "webPropertyId", + "profileId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve unsampled reports for. Must be a specific account ID, ~all is not supported.", + "location": "path", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of unsampled reports to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "profileId": { + "description": "View (Profile) ID to retrieve unsampled reports for. Must be a specific view (profile) ID, ~all is not supported.", + "location": "path", + "required": true, + "type": "string" + }, + "start-index": { + "description": "An index of the first unsampled report to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web property ID to retrieve unsampled reports for. Must be a specific web property ID, ~all is not supported.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports", + "response": { + "$ref": "UnsampledReports" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + } + } + }, + "uploads": { + "methods": { + "deleteUploadData": { + "description": "Delete data associated with a previous upload.", + "httpMethod": "POST", + "id": "analytics.management.uploads.deleteUploadData", + "parameterOrder": [ + "accountId", + "webPropertyId", + "customDataSourceId" + ], + "parameters": { + "accountId": { + "description": "Account Id for the uploads to be deleted.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "customDataSourceId": { + "description": "Custom data source Id for the uploads to be deleted.", + "location": "path", + "pattern": ".{22}", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property Id for the uploads to be deleted.", + "location": "path", + "pattern": "UA-(\\d+)-(\\d+)", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/deleteUploadData", + "request": { + "$ref": "AnalyticsDataimportDeleteUploadDataRequest" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "get": { + "description": "List uploads to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.uploads.get", + "parameterOrder": [ + "accountId", + "webPropertyId", + "customDataSourceId", + "uploadId" + ], + "parameters": { + "accountId": { + "description": "Account Id for the upload to retrieve.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "customDataSourceId": { + "description": "Custom data source Id for upload to retrieve.", + "location": "path", + "pattern": ".{22}", + "required": true, + "type": "string" + }, + "uploadId": { + "description": "Upload Id to retrieve.", + "location": "path", + "pattern": ".{22}", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property Id for the upload to retrieve.", + "location": "path", + "pattern": "UA-(\\d+)-(\\d+)", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads/{uploadId}", + "response": { + "$ref": "Upload" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "list": { + "description": "List uploads to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.uploads.list", + "parameterOrder": [ + "accountId", + "webPropertyId", + "customDataSourceId" + ], + "parameters": { + "accountId": { + "description": "Account Id for the uploads to retrieve.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "customDataSourceId": { + "description": "Custom data source Id for uploads to retrieve.", + "location": "path", + "pattern": ".{22}", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of uploads to include in this response.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "start-index": { + "description": "A 1-based index of the first upload to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web property Id for the uploads to retrieve.", + "location": "path", + "pattern": "UA-(\\d+)-(\\d+)", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads", + "response": { + "$ref": "Uploads" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "uploadData": { + "description": "Upload data for a custom data source.", + "httpMethod": "POST", + "id": "analytics.management.uploads.uploadData", + "mediaUpload": { + "accept": [ + "application/octet-stream" + ], + "maxSize": "1GB", + "protocols": { + "resumable": { + "multipart": true, + "path": "/resumable/upload/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads" + }, + "simple": { + "multipart": true, + "path": "/upload/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads" + } + } + }, + "parameterOrder": [ + "accountId", + "webPropertyId", + "customDataSourceId" + ], + "parameters": { + "accountId": { + "description": "Account Id associated with the upload.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "customDataSourceId": { + "description": "Custom data source Id to which the data being uploaded belongs.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property UA-string associated with the upload.", + "location": "path", + "pattern": "UA-\\d+-\\d+", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads", + "response": { + "$ref": "Upload" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit" + ], + "supportsMediaUpload": true + } + } + }, + "webPropertyAdWordsLinks": { + "methods": { + "delete": { + "description": "Deletes a web property-Google Ads link.", + "httpMethod": "DELETE", + "id": "analytics.management.webPropertyAdWordsLinks.delete", + "parameterOrder": [ + "accountId", + "webPropertyId", + "webPropertyAdWordsLinkId" + ], + "parameters": { + "accountId": { + "description": "ID of the account which the given web property belongs to.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyAdWordsLinkId": { + "description": "Web property Google Ads link ID.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to delete the Google Ads link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}", + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "get": { + "description": "Returns a web property-Google Ads link to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.webPropertyAdWordsLinks.get", + "parameterOrder": [ + "accountId", + "webPropertyId", + "webPropertyAdWordsLinkId" + ], + "parameters": { + "accountId": { + "description": "ID of the account which the given web property belongs to.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyAdWordsLinkId": { + "description": "Web property-Google Ads link ID.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to retrieve the Google Ads link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}", + "response": { + "$ref": "EntityAdWordsLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Creates a webProperty-Google Ads link.", + "httpMethod": "POST", + "id": "analytics.management.webPropertyAdWordsLinks.insert", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "ID of the Google Analytics account to create the link for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to create the link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks", + "request": { + "$ref": "EntityAdWordsLink" + }, + "response": { + "$ref": "EntityAdWordsLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists webProperty-Google Ads links for a given web property.", + "httpMethod": "GET", + "id": "analytics.management.webPropertyAdWordsLinks.list", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "ID of the account which the given web property belongs to.", + "location": "path", + "pattern": "\\d+", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of webProperty-Google Ads links to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first webProperty-Google Ads link to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web property ID to retrieve the Google Ads links for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks", + "response": { + "$ref": "EntityAdWordsLinks" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "patch": { + "description": "Updates an existing webProperty-Google Ads link. This method supports patch semantics.", + "httpMethod": "PATCH", + "id": "analytics.management.webPropertyAdWordsLinks.patch", + "parameterOrder": [ + "accountId", + "webPropertyId", + "webPropertyAdWordsLinkId" + ], + "parameters": { + "accountId": { + "description": "ID of the account which the given web property belongs to.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyAdWordsLinkId": { + "description": "Web property-Google Ads link ID.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to retrieve the Google Ads link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}", + "request": { + "$ref": "EntityAdWordsLink" + }, + "response": { + "$ref": "EntityAdWordsLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "update": { + "description": "Updates an existing webProperty-Google Ads link.", + "httpMethod": "PUT", + "id": "analytics.management.webPropertyAdWordsLinks.update", + "parameterOrder": [ + "accountId", + "webPropertyId", + "webPropertyAdWordsLinkId" + ], + "parameters": { + "accountId": { + "description": "ID of the account which the given web property belongs to.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyAdWordsLinkId": { + "description": "Web property-Google Ads link ID.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to retrieve the Google Ads link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}", + "request": { + "$ref": "EntityAdWordsLink" + }, + "response": { + "$ref": "EntityAdWordsLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + } + } + }, + "webproperties": { + "methods": { + "get": { + "description": "Gets a web property to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.webproperties.get", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve the web property for.", + "location": "path", + "pattern": "[0-9]+", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "ID to retrieve the web property for.", + "location": "path", + "pattern": "UA-[0-9]+-[0-9]+", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}", + "response": { + "$ref": "Webproperty" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "insert": { + "description": "Create a new property if the account has fewer than 20 properties. Web properties are visible in the Google Analytics interface only if they have at least one profile.", + "httpMethod": "POST", + "id": "analytics.management.webproperties.insert", + "parameterOrder": [ + "accountId" + ], + "parameters": { + "accountId": { + "description": "Account ID to create the web property for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties", + "request": { + "$ref": "Webproperty" + }, + "response": { + "$ref": "Webproperty" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "list": { + "description": "Lists web properties to which the user has access.", + "httpMethod": "GET", + "id": "analytics.management.webproperties.list", + "parameterOrder": [ + "accountId" + ], + "parameters": { + "accountId": { + "description": "Account ID to retrieve web properties for. Can either be a specific account ID or '~all', which refers to all the accounts that user has access to.", + "location": "path", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of web properties to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + } + }, + "path": "management/accounts/{accountId}/webproperties", + "response": { + "$ref": "Webproperties" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + }, + "patch": { + "description": "Updates an existing web property. This method supports patch semantics.", + "httpMethod": "PATCH", + "id": "analytics.management.webproperties.patch", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which the web property belongs", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}", + "request": { + "$ref": "Webproperty" + }, + "response": { + "$ref": "Webproperty" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + }, + "update": { + "description": "Updates an existing web property.", + "httpMethod": "PUT", + "id": "analytics.management.webproperties.update", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID to which the web property belongs", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}", + "request": { + "$ref": "Webproperty" + }, + "response": { + "$ref": "Webproperty" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.edit" + ] + } + } + }, + "webpropertyUserLinks": { + "methods": { + "delete": { + "description": "Removes a user from the given web property.", + "httpMethod": "DELETE", + "id": "analytics.management.webpropertyUserLinks.delete", + "parameterOrder": [ + "accountId", + "webPropertyId", + "linkId" + ], + "parameters": { + "accountId": { + "description": "Account ID to delete the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "linkId": { + "description": "Link ID to delete the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web Property ID to delete the user link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}", + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users" + ] + }, + "insert": { + "description": "Adds a new user to the given web property.", + "httpMethod": "POST", + "id": "analytics.management.webpropertyUserLinks.insert", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID to create the user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web Property ID to create the user link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks", + "request": { + "$ref": "EntityUserLink" + }, + "response": { + "$ref": "EntityUserLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users" + ] + }, + "list": { + "description": "Lists webProperty-user links for a given web property.", + "httpMethod": "GET", + "id": "analytics.management.webpropertyUserLinks.list", + "parameterOrder": [ + "accountId", + "webPropertyId" + ], + "parameters": { + "accountId": { + "description": "Account ID which the given web property belongs to.", + "location": "path", + "required": true, + "type": "string" + }, + "max-results": { + "description": "The maximum number of webProperty-user Links to include in this response.", + "format": "int32", + "location": "query", + "type": "integer" + }, + "start-index": { + "description": "An index of the first webProperty-user link to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + "format": "int32", + "location": "query", + "minimum": "1", + "type": "integer" + }, + "webPropertyId": { + "description": "Web Property ID for the webProperty-user links to retrieve. Can either be a specific web property ID or '~all', which refers to all the web properties that user has access to.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks", + "response": { + "$ref": "EntityUserLinks" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users", + "https://www.googleapis.com/auth/analytics.manage.users.readonly" + ] + }, + "update": { + "description": "Updates permissions for an existing user on the given web property.", + "httpMethod": "PUT", + "id": "analytics.management.webpropertyUserLinks.update", + "parameterOrder": [ + "accountId", + "webPropertyId", + "linkId" + ], + "parameters": { + "accountId": { + "description": "Account ID to update the account-user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "linkId": { + "description": "Link ID to update the account-user link for.", + "location": "path", + "required": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to update the account-user link for.", + "location": "path", + "required": true, + "type": "string" + } + }, + "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}", + "request": { + "$ref": "EntityUserLink" + }, + "response": { + "$ref": "EntityUserLink" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.manage.users" + ] + } + } + } + } + }, + "metadata": { + "resources": { + "columns": { + "methods": { + "list": { + "description": "Lists all columns for a report type", + "httpMethod": "GET", + "id": "analytics.metadata.columns.list", + "parameterOrder": [ + "reportType" + ], + "parameters": { + "reportType": { + "description": "Report type. Allowed Values: 'ga'. Where 'ga' corresponds to the Core Reporting API", + "location": "path", + "pattern": "ga", + "required": true, + "type": "string" + } + }, + "path": "metadata/{reportType}/columns", + "response": { + "$ref": "Columns" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.readonly" + ] + } + } + } + } + }, + "provisioning": { + "methods": { + "createAccountTicket": { + "description": "Creates an account ticket.", + "httpMethod": "POST", + "id": "analytics.provisioning.createAccountTicket", + "path": "provisioning/createAccountTicket", + "request": { + "$ref": "AccountTicket" + }, + "response": { + "$ref": "AccountTicket" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.provision" + ] + }, + "createAccountTree": { + "description": "Provision account.", + "httpMethod": "POST", + "id": "analytics.provisioning.createAccountTree", + "path": "provisioning/createAccountTree", + "request": { + "$ref": "AccountTreeRequest" + }, + "response": { + "$ref": "AccountTreeResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.provision" + ] + } + } + }, + "userDeletion": { + "resources": { + "userDeletionRequest": { + "methods": { + "upsert": { + "description": "Insert or update a user deletion requests.", + "httpMethod": "POST", + "id": "analytics.userDeletion.userDeletionRequest.upsert", + "path": "userDeletion/userDeletionRequests:upsert", + "request": { + "$ref": "UserDeletionRequest" + }, + "response": { + "$ref": "UserDeletionRequest" + }, + "scopes": [ + "https://www.googleapis.com/auth/analytics.user.deletion" + ] + } + } + } + } + } + }, + "revision": "20190807", + "rootUrl": "https://www.googleapis.com/", + "schemas": { + "Account": { + "description": "JSON template for Analytics account entry.", + "id": "Account", + "properties": { + "childLink": { + "description": "Child link for an account entry. Points to the list of web properties for this account.", + "properties": { + "href": { + "description": "Link to the list of web properties for this account.", + "type": "string" + }, + "type": { + "default": "analytics#webproperties", + "description": "Type of the child link. Its value is \"analytics#webproperties\".", + "type": "string" + } + }, + "type": "object" + }, + "created": { + "description": "Time the account was created.", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "Account ID.", + "type": "string" + }, + "kind": { + "default": "analytics#account", + "description": "Resource type for Analytics account.", + "type": "string" + }, + "name": { + "description": "Account name.", + "type": "string" + }, + "permissions": { + "description": "Permissions the user has for this account.", + "properties": { + "effective": { + "description": "All the permissions that the user has for this account. These include any implied permissions (e.g., EDIT implies VIEW).", + "items": { + "type": "string" + }, + "readOnly": true, + "type": "array" + } + }, + "type": "object" + }, + "selfLink": { + "description": "Link for this account.", + "type": "string" + }, + "starred": { + "description": "Indicates whether this account is starred or not.", + "type": "boolean" + }, + "updated": { + "description": "Time the account was last modified.", + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "AccountRef": { + "description": "JSON template for a linked account.", + "id": "AccountRef", + "properties": { + "href": { + "description": "Link for this account.", + "type": "string" + }, + "id": { + "description": "Account ID.", + "type": "string" + }, + "kind": { + "default": "analytics#accountRef", + "description": "Analytics account reference.", + "type": "string" + }, + "name": { + "description": "Account name.", + "type": "string" + } + }, + "type": "object" + }, + "AccountSummaries": { + "description": "An AccountSummary collection lists a summary of accounts, properties and views (profiles) to which the user has access. Each resource in the collection corresponds to a single AccountSummary.", + "id": "AccountSummaries", + "properties": { + "items": { + "description": "A list of AccountSummaries.", + "items": { + "$ref": "AccountSummary" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#accountSummaries", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this AccountSummary collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this AccountSummary collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "AccountSummary": { + "description": "JSON template for an Analytics AccountSummary. An AccountSummary is a lightweight tree comprised of properties/profiles.", + "id": "AccountSummary", + "properties": { + "id": { + "description": "Account ID.", + "type": "string" + }, + "kind": { + "default": "analytics#accountSummary", + "description": "Resource type for Analytics AccountSummary.", + "type": "string" + }, + "name": { + "description": "Account name.", + "type": "string" + }, + "starred": { + "description": "Indicates whether this account is starred or not.", + "type": "boolean" + }, + "webProperties": { + "description": "List of web properties under this account.", + "items": { + "$ref": "WebPropertySummary" + }, + "type": "array" + } + }, + "type": "object" + }, + "AccountTicket": { + "description": "JSON template for an Analytics account ticket. The account ticket consists of the ticket ID and the basic information for the account, property and profile.", + "id": "AccountTicket", + "properties": { + "account": { + "$ref": "Account", + "description": "Account for this ticket." + }, + "id": { + "description": "Account ticket ID used to access the account ticket.", + "type": "string" + }, + "kind": { + "default": "analytics#accountTicket", + "description": "Resource type for account ticket.", + "type": "string" + }, + "profile": { + "$ref": "Profile", + "description": "View (Profile) for the account." + }, + "redirectUri": { + "description": "Redirect URI where the user will be sent after accepting Terms of Service. Must be configured in APIs console as a callback URL.", + "type": "string" + }, + "webproperty": { + "$ref": "Webproperty", + "description": "Web property for the account." + } + }, + "type": "object" + }, + "AccountTreeRequest": { + "description": "JSON template for an Analytics account tree requests. The account tree request is used in the provisioning api to create an account, property, and view (profile). It contains the basic information required to make these fields.", + "id": "AccountTreeRequest", + "properties": { + "accountName": { + "annotations": { + "required": [ + "analytics.provisioning.createAccountTree" + ] + }, + "type": "string" + }, + "kind": { + "default": "analytics#accountTreeRequest", + "description": "Resource type for account ticket.", + "type": "string" + }, + "profileName": { + "annotations": { + "required": [ + "analytics.provisioning.createAccountTree" + ] + }, + "type": "string" + }, + "timezone": { + "annotations": { + "required": [ + "analytics.provisioning.createAccountTree" + ] + }, + "type": "string" + }, + "webpropertyName": { + "annotations": { + "required": [ + "analytics.provisioning.createAccountTree" + ] + }, + "type": "string" + }, + "websiteUrl": { + "annotations": { + "required": [ + "analytics.provisioning.createAccountTree" + ] + }, + "type": "string" + } + }, + "type": "object" + }, + "AccountTreeResponse": { + "description": "JSON template for an Analytics account tree response. The account tree response is used in the provisioning api to return the result of creating an account, property, and view (profile).", + "id": "AccountTreeResponse", + "properties": { + "account": { + "$ref": "Account", + "description": "The account created." + }, + "kind": { + "default": "analytics#accountTreeResponse", + "description": "Resource type for account ticket.", + "type": "string" + }, + "profile": { + "$ref": "Profile", + "description": "View (Profile) for the account." + }, + "webproperty": { + "$ref": "Webproperty", + "description": "Web property for the account." + } + }, + "type": "object" + }, + "Accounts": { + "description": "An account collection provides a list of Analytics accounts to which a user has access. The account collection is the entry point to all management information. Each resource in the collection corresponds to a single Analytics account.", + "id": "Accounts", + "properties": { + "items": { + "description": "A list of accounts.", + "items": { + "$ref": "Account" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of entries the response can contain, regardless of the actual number of entries returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#accounts", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Next link for this account collection.", + "type": "string" + }, + "previousLink": { + "description": "Previous link for this account collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the entries, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "AdWordsAccount": { + "description": "JSON template for an Google Ads account.", + "id": "AdWordsAccount", + "properties": { + "autoTaggingEnabled": { + "description": "True if auto-tagging is enabled on the Google Ads account. Read-only after the insert operation.", + "type": "boolean" + }, + "customerId": { + "annotations": { + "required": [ + "analytics.management.webPropertyAdWordsLinks.insert", + "analytics.management.webPropertyAdWordsLinks.update" + ] + }, + "description": "Customer ID. This field is required when creating a Google Ads link.", + "type": "string" + }, + "kind": { + "default": "analytics#adWordsAccount", + "description": "Resource type for Google Ads account.", + "type": "string" + } + }, + "type": "object" + }, + "AnalyticsDataimportDeleteUploadDataRequest": { + "description": "Request template for the delete upload data request.", + "id": "AnalyticsDataimportDeleteUploadDataRequest", + "properties": { + "customDataImportUids": { + "description": "A list of upload UIDs.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "Column": { + "description": "JSON template for a metadata column.", + "id": "Column", + "properties": { + "attributes": { + "additionalProperties": { + "description": "The name of the attribute.", + "type": "string" + }, + "description": "Map of attribute name and value for this column.", + "type": "object" + }, + "id": { + "description": "Column id.", + "type": "string" + }, + "kind": { + "default": "analytics#column", + "description": "Resource type for Analytics column.", + "type": "string" + } + }, + "type": "object" + }, + "Columns": { + "description": "Lists columns (dimensions and metrics) for a particular report type.", + "id": "Columns", + "properties": { + "attributeNames": { + "description": "List of attributes names returned by columns.", + "items": { + "type": "string" + }, + "type": "array" + }, + "etag": { + "description": "Etag of collection. This etag can be compared with the last response etag to check if response has changed.", + "type": "string" + }, + "items": { + "description": "List of columns for a report type.", + "items": { + "$ref": "Column" + }, + "type": "array" + }, + "kind": { + "default": "analytics#columns", + "description": "Collection type.", + "type": "string" + }, + "totalResults": { + "description": "Total number of columns returned in the response.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "CustomDataSource": { + "description": "JSON template for an Analytics custom data source.", + "id": "CustomDataSource", + "properties": { + "accountId": { + "description": "Account ID to which this custom data source belongs.", + "type": "string" + }, + "childLink": { + "properties": { + "href": { + "description": "Link to the list of daily uploads for this custom data source. Link to the list of uploads for this custom data source.", + "type": "string" + }, + "type": { + "description": "Value is \"analytics#dailyUploads\". Value is \"analytics#uploads\".", + "type": "string" + } + }, + "type": "object" + }, + "created": { + "description": "Time this custom data source was created.", + "format": "date-time", + "type": "string" + }, + "description": { + "description": "Description of custom data source.", + "type": "string" + }, + "id": { + "description": "Custom data source ID.", + "type": "string" + }, + "importBehavior": { + "type": "string" + }, + "kind": { + "default": "analytics#customDataSource", + "description": "Resource type for Analytics custom data source.", + "type": "string" + }, + "name": { + "description": "Name of this custom data source.", + "type": "string" + }, + "parentLink": { + "description": "Parent link for this custom data source. Points to the web property to which this custom data source belongs.", + "properties": { + "href": { + "description": "Link to the web property to which this custom data source belongs.", + "type": "string" + }, + "type": { + "default": "analytics#webproperty", + "description": "Value is \"analytics#webproperty\".", + "type": "string" + } + }, + "type": "object" + }, + "profilesLinked": { + "description": "IDs of views (profiles) linked to the custom data source.", + "items": { + "type": "string" + }, + "type": "array" + }, + "schema": { + "description": "Collection of schema headers of the custom data source.", + "items": { + "type": "string" + }, + "type": "array" + }, + "selfLink": { + "description": "Link for this Analytics custom data source.", + "type": "string" + }, + "type": { + "description": "Type of the custom data source.", + "type": "string" + }, + "updated": { + "description": "Time this custom data source was last modified.", + "format": "date-time", + "type": "string" + }, + "uploadType": { + "description": "Upload type of the custom data source.", + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID of the form UA-XXXXX-YY to which this custom data source belongs.", + "type": "string" + } + }, + "type": "object" + }, + "CustomDataSources": { + "description": "Lists Analytics custom data sources to which the user has access. Each resource in the collection corresponds to a single Analytics custom data source.", + "id": "CustomDataSources", + "properties": { + "items": { + "description": "Collection of custom data sources.", + "items": { + "$ref": "CustomDataSource" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#customDataSources", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this custom data source collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this custom data source collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "CustomDimension": { + "description": "JSON template for Analytics Custom Dimension.", + "id": "CustomDimension", + "properties": { + "accountId": { + "description": "Account ID.", + "type": "string" + }, + "active": { + "description": "Boolean indicating whether the custom dimension is active.", + "type": "boolean" + }, + "created": { + "description": "Time the custom dimension was created.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "id": { + "description": "Custom dimension ID.", + "type": "string" + }, + "index": { + "description": "Index of the custom dimension.", + "format": "int32", + "readOnly": true, + "type": "integer" + }, + "kind": { + "default": "analytics#customDimension", + "description": "Kind value for a custom dimension. Set to \"analytics#customDimension\". It is a read-only field.", + "readOnly": true, + "type": "string" + }, + "name": { + "description": "Name of the custom dimension.", + "type": "string" + }, + "parentLink": { + "description": "Parent link for the custom dimension. Points to the property to which the custom dimension belongs.", + "properties": { + "href": { + "description": "Link to the property to which the custom dimension belongs.", + "type": "string" + }, + "type": { + "default": "analytics#webproperty", + "description": "Type of the parent link. Set to \"analytics#webproperty\".", + "type": "string" + } + }, + "type": "object" + }, + "scope": { + "description": "Scope of the custom dimension: HIT, SESSION, USER or PRODUCT.", + "type": "string" + }, + "selfLink": { + "description": "Link for the custom dimension", + "readOnly": true, + "type": "string" + }, + "updated": { + "description": "Time the custom dimension was last modified.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "webPropertyId": { + "description": "Property ID.", + "type": "string" + } + }, + "type": "object" + }, + "CustomDimensions": { + "description": "A custom dimension collection lists Analytics custom dimensions to which the user has access. Each resource in the collection corresponds to a single Analytics custom dimension.", + "id": "CustomDimensions", + "properties": { + "items": { + "description": "Collection of custom dimensions.", + "items": { + "$ref": "CustomDimension" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#customDimensions", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this custom dimension collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this custom dimension collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "CustomMetric": { + "description": "JSON template for Analytics Custom Metric.", + "id": "CustomMetric", + "properties": { + "accountId": { + "description": "Account ID.", + "type": "string" + }, + "active": { + "description": "Boolean indicating whether the custom metric is active.", + "type": "boolean" + }, + "created": { + "description": "Time the custom metric was created.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "id": { + "description": "Custom metric ID.", + "type": "string" + }, + "index": { + "description": "Index of the custom metric.", + "format": "int32", + "readOnly": true, + "type": "integer" + }, + "kind": { + "default": "analytics#customMetric", + "description": "Kind value for a custom metric. Set to \"analytics#customMetric\". It is a read-only field.", + "readOnly": true, + "type": "string" + }, + "max_value": { + "description": "Max value of custom metric.", + "type": "string" + }, + "min_value": { + "description": "Min value of custom metric.", + "type": "string" + }, + "name": { + "description": "Name of the custom metric.", + "type": "string" + }, + "parentLink": { + "description": "Parent link for the custom metric. Points to the property to which the custom metric belongs.", + "properties": { + "href": { + "description": "Link to the property to which the custom metric belongs.", + "type": "string" + }, + "type": { + "default": "analytics#webproperty", + "description": "Type of the parent link. Set to \"analytics#webproperty\".", + "type": "string" + } + }, + "type": "object" + }, + "scope": { + "description": "Scope of the custom metric: HIT or PRODUCT.", + "type": "string" + }, + "selfLink": { + "description": "Link for the custom metric", + "readOnly": true, + "type": "string" + }, + "type": { + "description": "Data type of custom metric.", + "type": "string" + }, + "updated": { + "description": "Time the custom metric was last modified.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "webPropertyId": { + "description": "Property ID.", + "type": "string" + } + }, + "type": "object" + }, + "CustomMetrics": { + "description": "A custom metric collection lists Analytics custom metrics to which the user has access. Each resource in the collection corresponds to a single Analytics custom metric.", + "id": "CustomMetrics", + "properties": { + "items": { + "description": "Collection of custom metrics.", + "items": { + "$ref": "CustomMetric" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#customMetrics", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this custom metric collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this custom metric collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "EntityAdWordsLink": { + "description": "JSON template for Analytics Entity Google Ads Link.", + "id": "EntityAdWordsLink", + "properties": { + "adWordsAccounts": { + "annotations": { + "required": [ + "analytics.management.webPropertyAdWordsLinks.insert", + "analytics.management.webPropertyAdWordsLinks.update" + ] + }, + "description": "A list of Google Ads client accounts. These cannot be MCC accounts. This field is required when creating a Google Ads link. It cannot be empty.", + "items": { + "$ref": "AdWordsAccount" + }, + "type": "array" + }, + "entity": { + "description": "Web property being linked.", + "properties": { + "webPropertyRef": { + "$ref": "WebPropertyRef" + } + }, + "type": "object" + }, + "id": { + "description": "Entity Google Ads link ID", + "type": "string" + }, + "kind": { + "default": "analytics#entityAdWordsLink", + "description": "Resource type for entity Google Ads link.", + "type": "string" + }, + "name": { + "annotations": { + "required": [ + "analytics.management.webPropertyAdWordsLinks.insert", + "analytics.management.webPropertyAdWordsLinks.update" + ] + }, + "description": "Name of the link. This field is required when creating a Google Ads link.", + "type": "string" + }, + "profileIds": { + "description": "IDs of linked Views (Profiles) represented as strings.", + "items": { + "type": "string" + }, + "type": "array" + }, + "selfLink": { + "description": "URL link for this Google Analytics - Google Ads link.", + "type": "string" + } + }, + "type": "object" + }, + "EntityAdWordsLinks": { + "description": "An entity Google Ads link collection provides a list of GA-Google Ads links Each resource in this collection corresponds to a single link.", + "id": "EntityAdWordsLinks", + "properties": { + "items": { + "description": "A list of entity Google Ads links.", + "items": { + "$ref": "EntityAdWordsLink" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of entries the response can contain, regardless of the actual number of entries returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#entityAdWordsLinks", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Next link for this Google Ads link collection.", + "type": "string" + }, + "previousLink": { + "description": "Previous link for this Google Ads link collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the entries, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "EntityUserLink": { + "description": "JSON template for an Analytics Entity-User Link. Returns permissions that a user has for an entity.", + "id": "EntityUserLink", + "properties": { + "entity": { + "description": "Entity for this link. It can be an account, a web property, or a view (profile).", + "properties": { + "accountRef": { + "$ref": "AccountRef", + "description": "Account for this link." + }, + "profileRef": { + "$ref": "ProfileRef", + "description": "View (Profile) for this link." + }, + "webPropertyRef": { + "$ref": "WebPropertyRef", + "description": "Web property for this link." + } + }, + "type": "object" + }, + "id": { + "description": "Entity user link ID", + "type": "string" + }, + "kind": { + "default": "analytics#entityUserLink", + "description": "Resource type for entity user link.", + "type": "string" + }, + "permissions": { + "description": "Permissions the user has for this entity.", + "properties": { + "effective": { + "description": "Effective permissions represent all the permissions that a user has for this entity. These include any implied permissions (e.g., EDIT implies VIEW) or inherited permissions from the parent entity. Effective permissions are read-only.", + "items": { + "type": "string" + }, + "readOnly": true, + "type": "array" + }, + "local": { + "description": "Permissions that a user has been assigned at this very level. Does not include any implied or inherited permissions. Local permissions are modifiable.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "selfLink": { + "description": "Self link for this resource.", + "type": "string" + }, + "userRef": { + "$ref": "UserRef", + "description": "User reference." + } + }, + "type": "object" + }, + "EntityUserLinks": { + "description": "An entity user link collection provides a list of Analytics ACL links Each resource in this collection corresponds to a single link.", + "id": "EntityUserLinks", + "properties": { + "items": { + "description": "A list of entity user links.", + "items": { + "$ref": "EntityUserLink" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of entries the response can contain, regardless of the actual number of entries returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#entityUserLinks", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Next link for this account collection.", + "type": "string" + }, + "previousLink": { + "description": "Previous link for this account collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the entries, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "Experiment": { + "description": "JSON template for Analytics experiment resource.", + "id": "Experiment", + "properties": { + "accountId": { + "description": "Account ID to which this experiment belongs. This field is read-only.", + "type": "string" + }, + "created": { + "description": "Time the experiment was created. This field is read-only.", + "format": "date-time", + "type": "string" + }, + "description": { + "description": "Notes about this experiment.", + "type": "string" + }, + "editableInGaUi": { + "description": "If true, the end user will be able to edit the experiment via the Google Analytics user interface.", + "type": "boolean" + }, + "endTime": { + "description": "The ending time of the experiment (the time the status changed from RUNNING to ENDED). This field is present only if the experiment has ended. This field is read-only.", + "format": "date-time", + "type": "string" + }, + "equalWeighting": { + "description": "Boolean specifying whether to distribute traffic evenly across all variations. If the value is False, content experiments follows the default behavior of adjusting traffic dynamically based on variation performance. Optional -- defaults to False. This field may not be changed for an experiment whose status is ENDED.", + "type": "boolean" + }, + "id": { + "annotations": { + "required": [ + "analytics.management.experiments.patch", + "analytics.management.experiments.update" + ] + }, + "description": "Experiment ID. Required for patch and update. Disallowed for create.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for the web property to which this experiment belongs. This field is read-only.", + "type": "string" + }, + "kind": { + "default": "analytics#experiment", + "description": "Resource type for an Analytics experiment. This field is read-only.", + "type": "string" + }, + "minimumExperimentLengthInDays": { + "description": "An integer number in [3, 90]. Specifies the minimum length of the experiment. Can be changed for a running experiment. This field may not be changed for an experiments whose status is ENDED.", + "format": "int32", + "type": "integer" + }, + "name": { + "annotations": { + "required": [ + "analytics.management.experiments.insert", + "analytics.management.experiments.update" + ] + }, + "description": "Experiment name. This field may not be changed for an experiment whose status is ENDED. This field is required when creating an experiment.", + "type": "string" + }, + "objectiveMetric": { + "description": "The metric that the experiment is optimizing. Valid values: \"ga:goal(n)Completions\", \"ga:adsenseAdsClicks\", \"ga:adsenseAdsViewed\", \"ga:adsenseRevenue\", \"ga:bounces\", \"ga:pageviews\", \"ga:sessionDuration\", \"ga:transactions\", \"ga:transactionRevenue\". This field is required if status is \"RUNNING\" and servingFramework is one of \"REDIRECT\" or \"API\".", + "type": "string" + }, + "optimizationType": { + "description": "Whether the objectiveMetric should be minimized or maximized. Possible values: \"MAXIMUM\", \"MINIMUM\". Optional--defaults to \"MAXIMUM\". Cannot be specified without objectiveMetric. Cannot be modified when status is \"RUNNING\" or \"ENDED\".", + "type": "string" + }, + "parentLink": { + "description": "Parent link for an experiment. Points to the view (profile) to which this experiment belongs.", + "properties": { + "href": { + "description": "Link to the view (profile) to which this experiment belongs. This field is read-only.", + "type": "string" + }, + "type": { + "default": "analytics#profile", + "description": "Value is \"analytics#profile\". This field is read-only.", + "type": "string" + } + }, + "type": "object" + }, + "profileId": { + "description": "View (Profile) ID to which this experiment belongs. This field is read-only.", + "type": "string" + }, + "reasonExperimentEnded": { + "description": "Why the experiment ended. Possible values: \"STOPPED_BY_USER\", \"WINNER_FOUND\", \"EXPERIMENT_EXPIRED\", \"ENDED_WITH_NO_WINNER\", \"GOAL_OBJECTIVE_CHANGED\". \"ENDED_WITH_NO_WINNER\" means that the experiment didn't expire but no winner was projected to be found. If the experiment status is changed via the API to ENDED this field is set to STOPPED_BY_USER. This field is read-only.", + "type": "string" + }, + "rewriteVariationUrlsAsOriginal": { + "description": "Boolean specifying whether variations URLS are rewritten to match those of the original. This field may not be changed for an experiments whose status is ENDED.", + "type": "boolean" + }, + "selfLink": { + "description": "Link for this experiment. This field is read-only.", + "type": "string" + }, + "servingFramework": { + "description": "The framework used to serve the experiment variations and evaluate the results. One of: \n- REDIRECT: Google Analytics redirects traffic to different variation pages, reports the chosen variation and evaluates the results.\n- API: Google Analytics chooses and reports the variation to serve and evaluates the results; the caller is responsible for serving the selected variation.\n- EXTERNAL: The variations will be served externally and the chosen variation reported to Google Analytics. The caller is responsible for serving the selected variation and evaluating the results.", + "type": "string" + }, + "snippet": { + "description": "The snippet of code to include on the control page(s). This field is read-only.", + "type": "string" + }, + "startTime": { + "description": "The starting time of the experiment (the time the status changed from READY_TO_RUN to RUNNING). This field is present only if the experiment has started. This field is read-only.", + "format": "date-time", + "type": "string" + }, + "status": { + "annotations": { + "required": [ + "analytics.management.experiments.insert", + "analytics.management.experiments.update" + ] + }, + "description": "Experiment status. Possible values: \"DRAFT\", \"READY_TO_RUN\", \"RUNNING\", \"ENDED\". Experiments can be created in the \"DRAFT\", \"READY_TO_RUN\" or \"RUNNING\" state. This field is required when creating an experiment.", + "type": "string" + }, + "trafficCoverage": { + "description": "A floating-point number in (0, 1]. Specifies the fraction of the traffic that participates in the experiment. Can be changed for a running experiment. This field may not be changed for an experiments whose status is ENDED.", + "format": "double", + "type": "number" + }, + "updated": { + "description": "Time the experiment was last modified. This field is read-only.", + "format": "date-time", + "type": "string" + }, + "variations": { + "description": "Array of variations. The first variation in the array is the original. The number of variations may not change once an experiment is in the RUNNING state. At least two variations are required before status can be set to RUNNING.", + "items": { + "properties": { + "name": { + "annotations": { + "required": [ + "analytics.management.experiments.insert", + "analytics.management.experiments.update" + ] + }, + "description": "The name of the variation. This field is required when creating an experiment. This field may not be changed for an experiment whose status is ENDED.", + "type": "string" + }, + "status": { + "description": "Status of the variation. Possible values: \"ACTIVE\", \"INACTIVE\". INACTIVE variations are not served. This field may not be changed for an experiment whose status is ENDED.", + "type": "string" + }, + "url": { + "description": "The URL of the variation. This field may not be changed for an experiment whose status is RUNNING or ENDED.", + "type": "string" + }, + "weight": { + "description": "Weight that this variation should receive. Only present if the experiment is running. This field is read-only.", + "format": "double", + "type": "number" + }, + "won": { + "description": "True if the experiment has ended and this variation performed (statistically) significantly better than the original. This field is read-only.", + "type": "boolean" + } + }, + "type": "object" + }, + "type": "array" + }, + "webPropertyId": { + "description": "Web property ID to which this experiment belongs. The web property ID is of the form UA-XXXXX-YY. This field is read-only.", + "type": "string" + }, + "winnerConfidenceLevel": { + "description": "A floating-point number in (0, 1). Specifies the necessary confidence level to choose a winner. This field may not be changed for an experiments whose status is ENDED.", + "format": "double", + "type": "number" + }, + "winnerFound": { + "description": "Boolean specifying whether a winner has been found for this experiment. This field is read-only.", + "type": "boolean" + } + }, + "type": "object" + }, + "Experiments": { + "description": "An experiment collection lists Analytics experiments to which the user has access. Each view (profile) can have a set of experiments. Each resource in the Experiment collection corresponds to a single Analytics experiment.", + "id": "Experiments", + "properties": { + "items": { + "description": "A list of experiments.", + "items": { + "$ref": "Experiment" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#experiments", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this experiment collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this experiment collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of resources in the result.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "Filter": { + "description": "JSON template for an Analytics account filter.", + "id": "Filter", + "properties": { + "accountId": { + "description": "Account ID to which this filter belongs.", + "type": "string" + }, + "advancedDetails": { + "description": "Details for the filter of the type ADVANCED.", + "properties": { + "caseSensitive": { + "description": "Indicates if the filter expressions are case sensitive.", + "type": "boolean" + }, + "extractA": { + "description": "Expression to extract from field A.", + "type": "string" + }, + "extractB": { + "description": "Expression to extract from field B.", + "type": "string" + }, + "fieldA": { + "description": "Field A.", + "type": "string" + }, + "fieldAIndex": { + "description": "The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.", + "format": "int32", + "type": "integer" + }, + "fieldARequired": { + "description": "Indicates if field A is required to match.", + "type": "boolean" + }, + "fieldB": { + "description": "Field B.", + "type": "string" + }, + "fieldBIndex": { + "description": "The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.", + "format": "int32", + "type": "integer" + }, + "fieldBRequired": { + "description": "Indicates if field B is required to match.", + "type": "boolean" + }, + "outputConstructor": { + "description": "Expression used to construct the output value.", + "type": "string" + }, + "outputToField": { + "description": "Output field.", + "type": "string" + }, + "outputToFieldIndex": { + "description": "The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.", + "format": "int32", + "type": "integer" + }, + "overrideOutputField": { + "description": "Indicates if the existing value of the output field, if any, should be overridden by the output expression.", + "type": "boolean" + } + }, + "type": "object" + }, + "created": { + "description": "Time this filter was created.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "excludeDetails": { + "$ref": "FilterExpression", + "description": "Details for the filter of the type EXCLUDE." + }, + "id": { + "description": "Filter ID.", + "type": "string" + }, + "includeDetails": { + "$ref": "FilterExpression", + "description": "Details for the filter of the type INCLUDE." + }, + "kind": { + "default": "analytics#filter", + "description": "Resource type for Analytics filter.", + "readOnly": true, + "type": "string" + }, + "lowercaseDetails": { + "description": "Details for the filter of the type LOWER.", + "properties": { + "field": { + "description": "Field to use in the filter.", + "type": "string" + }, + "fieldIndex": { + "description": "The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "name": { + "annotations": { + "required": [ + "analytics.management.filters.insert", + "analytics.management.filters.update" + ] + }, + "description": "Name of this filter.", + "type": "string" + }, + "parentLink": { + "description": "Parent link for this filter. Points to the account to which this filter belongs.", + "properties": { + "href": { + "description": "Link to the account to which this filter belongs.", + "type": "string" + }, + "type": { + "default": "analytics#account", + "description": "Value is \"analytics#account\".", + "type": "string" + } + }, + "type": "object" + }, + "searchAndReplaceDetails": { + "description": "Details for the filter of the type SEARCH_AND_REPLACE.", + "properties": { + "caseSensitive": { + "description": "Determines if the filter is case sensitive.", + "type": "boolean" + }, + "field": { + "description": "Field to use in the filter.", + "type": "string" + }, + "fieldIndex": { + "description": "The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.", + "format": "int32", + "type": "integer" + }, + "replaceString": { + "description": "Term to replace the search term with.", + "type": "string" + }, + "searchString": { + "description": "Term to search.", + "type": "string" + } + }, + "type": "object" + }, + "selfLink": { + "description": "Link for this filter.", + "readOnly": true, + "type": "string" + }, + "type": { + "annotations": { + "required": [ + "analytics.management.filters.insert", + "analytics.management.filters.update" + ] + }, + "description": "Type of this filter. Possible values are INCLUDE, EXCLUDE, LOWERCASE, UPPERCASE, SEARCH_AND_REPLACE and ADVANCED.", + "type": "string" + }, + "updated": { + "description": "Time this filter was last modified.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "uppercaseDetails": { + "description": "Details for the filter of the type UPPER.", + "properties": { + "field": { + "description": "Field to use in the filter.", + "type": "string" + }, + "fieldIndex": { + "description": "The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "FilterExpression": { + "description": "JSON template for an Analytics filter expression.", + "id": "FilterExpression", + "properties": { + "caseSensitive": { + "description": "Determines if the filter is case sensitive.", + "type": "boolean" + }, + "expressionValue": { + "description": "Filter expression value", + "type": "string" + }, + "field": { + "description": "Field to filter. Possible values: \n- Content and Traffic \n- PAGE_REQUEST_URI, \n- PAGE_HOSTNAME, \n- PAGE_TITLE, \n- REFERRAL, \n- COST_DATA_URI (Campaign target URL), \n- HIT_TYPE, \n- INTERNAL_SEARCH_TERM, \n- INTERNAL_SEARCH_TYPE, \n- SOURCE_PROPERTY_TRACKING_ID, \n- Campaign or AdGroup \n- CAMPAIGN_SOURCE, \n- CAMPAIGN_MEDIUM, \n- CAMPAIGN_NAME, \n- CAMPAIGN_AD_GROUP, \n- CAMPAIGN_TERM, \n- CAMPAIGN_CONTENT, \n- CAMPAIGN_CODE, \n- CAMPAIGN_REFERRAL_PATH, \n- E-Commerce \n- TRANSACTION_COUNTRY, \n- TRANSACTION_REGION, \n- TRANSACTION_CITY, \n- TRANSACTION_AFFILIATION (Store or order location), \n- ITEM_NAME, \n- ITEM_CODE, \n- ITEM_VARIATION, \n- TRANSACTION_ID, \n- TRANSACTION_CURRENCY_CODE, \n- PRODUCT_ACTION_TYPE, \n- Audience/Users \n- BROWSER, \n- BROWSER_VERSION, \n- BROWSER_SIZE, \n- PLATFORM, \n- PLATFORM_VERSION, \n- LANGUAGE, \n- SCREEN_RESOLUTION, \n- SCREEN_COLORS, \n- JAVA_ENABLED (Boolean Field), \n- FLASH_VERSION, \n- GEO_SPEED (Connection speed), \n- VISITOR_TYPE, \n- GEO_ORGANIZATION (ISP organization), \n- GEO_DOMAIN, \n- GEO_IP_ADDRESS, \n- GEO_IP_VERSION, \n- Location \n- GEO_COUNTRY, \n- GEO_REGION, \n- GEO_CITY, \n- Event \n- EVENT_CATEGORY, \n- EVENT_ACTION, \n- EVENT_LABEL, \n- Other \n- CUSTOM_FIELD_1, \n- CUSTOM_FIELD_2, \n- USER_DEFINED_VALUE, \n- Application \n- APP_ID, \n- APP_INSTALLER_ID, \n- APP_NAME, \n- APP_VERSION, \n- SCREEN, \n- IS_APP (Boolean Field), \n- IS_FATAL_EXCEPTION (Boolean Field), \n- EXCEPTION_DESCRIPTION, \n- Mobile device \n- IS_MOBILE (Boolean Field, Deprecated. Use DEVICE_CATEGORY=mobile), \n- IS_TABLET (Boolean Field, Deprecated. Use DEVICE_CATEGORY=tablet), \n- DEVICE_CATEGORY, \n- MOBILE_HAS_QWERTY_KEYBOARD (Boolean Field), \n- MOBILE_HAS_NFC_SUPPORT (Boolean Field), \n- MOBILE_HAS_CELLULAR_RADIO (Boolean Field), \n- MOBILE_HAS_WIFI_SUPPORT (Boolean Field), \n- MOBILE_BRAND_NAME, \n- MOBILE_MODEL_NAME, \n- MOBILE_MARKETING_NAME, \n- MOBILE_POINTING_METHOD, \n- Social \n- SOCIAL_NETWORK, \n- SOCIAL_ACTION, \n- SOCIAL_ACTION_TARGET, \n- Custom dimension \n- CUSTOM_DIMENSION (See accompanying field index),", + "type": "string" + }, + "fieldIndex": { + "description": "The Index of the custom dimension. Set only if the field is a is CUSTOM_DIMENSION.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#filterExpression", + "description": "Kind value for filter expression", + "type": "string" + }, + "matchType": { + "description": "Match type for this filter. Possible values are BEGINS_WITH, EQUAL, ENDS_WITH, CONTAINS, or MATCHES. GEO_DOMAIN, GEO_IP_ADDRESS, PAGE_REQUEST_URI, or PAGE_HOSTNAME filters can use any match type; all other filters must use MATCHES.", + "type": "string" + } + }, + "type": "object" + }, + "FilterRef": { + "description": "JSON template for a profile filter link.", + "id": "FilterRef", + "properties": { + "accountId": { + "description": "Account ID to which this filter belongs.", + "readOnly": true, + "type": "string" + }, + "href": { + "description": "Link for this filter.", + "type": "string" + }, + "id": { + "annotations": { + "required": [ + "analytics.management.profileFilterLinks.insert" + ] + }, + "description": "Filter ID.", + "type": "string" + }, + "kind": { + "default": "analytics#filterRef", + "description": "Kind value for filter reference.", + "type": "string" + }, + "name": { + "description": "Name of this filter.", + "readOnly": true, + "type": "string" + } + }, + "type": "object" + }, + "Filters": { + "description": "A filter collection lists filters created by users in an Analytics account. Each resource in the collection corresponds to a filter.", + "id": "Filters", + "properties": { + "items": { + "description": "A list of filters.", + "items": { + "$ref": "Filter" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1,000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#filters", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this filter collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this filter collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "GaData": { + "description": "Analytics data for a given view (profile).", + "id": "GaData", + "properties": { + "columnHeaders": { + "description": "Column headers that list dimension names followed by the metric names. The order of dimensions and metrics is same as specified in the request.", + "items": { + "properties": { + "columnType": { + "description": "Column Type. Either DIMENSION or METRIC.", + "type": "string" + }, + "dataType": { + "description": "Data type. Dimension column headers have only STRING as the data type. Metric column headers have data types for metric values such as INTEGER, DOUBLE, CURRENCY etc.", + "type": "string" + }, + "name": { + "description": "Column name.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "containsSampledData": { + "description": "Determines if Analytics data contains samples.", + "type": "boolean" + }, + "dataLastRefreshed": { + "description": "The last refreshed time in seconds for Analytics data.", + "format": "int64", + "type": "string" + }, + "dataTable": { + "properties": { + "cols": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "label": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "rows": { + "items": { + "properties": { + "c": { + "items": { + "properties": { + "v": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "id": { + "description": "Unique ID for this data response.", + "type": "string" + }, + "itemsPerPage": { + "description": "The maximum number of rows the response can contain, regardless of the actual number of rows returned. Its value ranges from 1 to 10,000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#gaData", + "description": "Resource type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this Analytics data query.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this Analytics data query.", + "type": "string" + }, + "profileInfo": { + "description": "Information for the view (profile), for which the Analytics data was requested.", + "properties": { + "accountId": { + "description": "Account ID to which this view (profile) belongs.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for the web property to which this view (profile) belongs.", + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID.", + "type": "string" + }, + "profileName": { + "description": "View (Profile) name.", + "type": "string" + }, + "tableId": { + "description": "Table ID for view (profile).", + "type": "string" + }, + "webPropertyId": { + "description": "Web Property ID to which this view (profile) belongs.", + "type": "string" + } + }, + "type": "object" + }, + "query": { + "description": "Analytics data request query parameters.", + "properties": { + "dimensions": { + "description": "List of analytics dimensions.", + "type": "string" + }, + "end-date": { + "description": "End date.", + "type": "string" + }, + "filters": { + "description": "Comma-separated list of dimension or metric filters.", + "type": "string" + }, + "ids": { + "description": "Unique table ID.", + "type": "string" + }, + "max-results": { + "description": "Maximum results per page.", + "format": "int32", + "type": "integer" + }, + "metrics": { + "description": "List of analytics metrics.", + "items": { + "type": "string" + }, + "type": "array" + }, + "samplingLevel": { + "description": "Desired sampling level", + "type": "string" + }, + "segment": { + "description": "Analytics advanced segment.", + "type": "string" + }, + "sort": { + "description": "List of dimensions or metrics based on which Analytics data is sorted.", + "items": { + "type": "string" + }, + "type": "array" + }, + "start-date": { + "description": "Start date.", + "type": "string" + }, + "start-index": { + "description": "Start index.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "rows": { + "description": "Analytics data rows, where each row contains a list of dimension values followed by the metric values. The order of dimensions and metrics is same as specified in the request.", + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "array" + }, + "sampleSize": { + "description": "The number of samples used to calculate the result.", + "format": "int64", + "type": "string" + }, + "sampleSpace": { + "description": "Total size of the sample space from which the samples were selected.", + "format": "int64", + "type": "string" + }, + "selfLink": { + "description": "Link to this page.", + "type": "string" + }, + "totalResults": { + "description": "The total number of rows for the query, regardless of the number of rows in the response.", + "format": "int32", + "type": "integer" + }, + "totalsForAllResults": { + "additionalProperties": { + "description": "Key-value pair for the total value of a metric. Key is the metric name and the value is the total value for that metric.", + "type": "string" + }, + "description": "Total values for the requested metrics over all the results, not just the results returned in this response. The order of the metric totals is same as the metric order specified in the request.", + "type": "object" + } + }, + "type": "object" + }, + "Goal": { + "description": "JSON template for Analytics goal resource.", + "id": "Goal", + "properties": { + "accountId": { + "description": "Account ID to which this goal belongs.", + "type": "string" + }, + "active": { + "description": "Determines whether this goal is active.", + "type": "boolean" + }, + "created": { + "description": "Time this goal was created.", + "format": "date-time", + "type": "string" + }, + "eventDetails": { + "description": "Details for the goal of the type EVENT.", + "properties": { + "eventConditions": { + "description": "List of event conditions.", + "items": { + "properties": { + "comparisonType": { + "description": "Type of comparison. Possible values are LESS_THAN, GREATER_THAN or EQUAL.", + "type": "string" + }, + "comparisonValue": { + "description": "Value used for this comparison.", + "format": "int64", + "type": "string" + }, + "expression": { + "description": "Expression used for this match.", + "type": "string" + }, + "matchType": { + "description": "Type of the match to be performed. Possible values are REGEXP, BEGINS_WITH, or EXACT.", + "type": "string" + }, + "type": { + "description": "Type of this event condition. Possible values are CATEGORY, ACTION, LABEL, or VALUE.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "useEventValue": { + "description": "Determines if the event value should be used as the value for this goal.", + "type": "boolean" + } + }, + "type": "object" + }, + "id": { + "description": "Goal ID.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for the web property to which this goal belongs.", + "type": "string" + }, + "kind": { + "default": "analytics#goal", + "description": "Resource type for an Analytics goal.", + "type": "string" + }, + "name": { + "description": "Goal name.", + "type": "string" + }, + "parentLink": { + "description": "Parent link for a goal. Points to the view (profile) to which this goal belongs.", + "properties": { + "href": { + "description": "Link to the view (profile) to which this goal belongs.", + "type": "string" + }, + "type": { + "default": "analytics#profile", + "description": "Value is \"analytics#profile\".", + "type": "string" + } + }, + "type": "object" + }, + "profileId": { + "description": "View (Profile) ID to which this goal belongs.", + "type": "string" + }, + "selfLink": { + "description": "Link for this goal.", + "type": "string" + }, + "type": { + "description": "Goal type. Possible values are URL_DESTINATION, VISIT_TIME_ON_SITE, VISIT_NUM_PAGES, AND EVENT.", + "type": "string" + }, + "updated": { + "description": "Time this goal was last modified.", + "format": "date-time", + "type": "string" + }, + "urlDestinationDetails": { + "description": "Details for the goal of the type URL_DESTINATION.", + "properties": { + "caseSensitive": { + "description": "Determines if the goal URL must exactly match the capitalization of visited URLs.", + "type": "boolean" + }, + "firstStepRequired": { + "description": "Determines if the first step in this goal is required.", + "type": "boolean" + }, + "matchType": { + "description": "Match type for the goal URL. Possible values are HEAD, EXACT, or REGEX.", + "type": "string" + }, + "steps": { + "description": "List of steps configured for this goal funnel.", + "items": { + "properties": { + "name": { + "description": "Step name.", + "type": "string" + }, + "number": { + "description": "Step number.", + "format": "int32", + "type": "integer" + }, + "url": { + "description": "URL for this step.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "url": { + "description": "URL for this goal.", + "type": "string" + } + }, + "type": "object" + }, + "value": { + "description": "Goal value.", + "format": "float", + "type": "number" + }, + "visitNumPagesDetails": { + "description": "Details for the goal of the type VISIT_NUM_PAGES.", + "properties": { + "comparisonType": { + "description": "Type of comparison. Possible values are LESS_THAN, GREATER_THAN, or EQUAL.", + "type": "string" + }, + "comparisonValue": { + "description": "Value used for this comparison.", + "format": "int64", + "type": "string" + } + }, + "type": "object" + }, + "visitTimeOnSiteDetails": { + "description": "Details for the goal of the type VISIT_TIME_ON_SITE.", + "properties": { + "comparisonType": { + "description": "Type of comparison. Possible values are LESS_THAN or GREATER_THAN.", + "type": "string" + }, + "comparisonValue": { + "description": "Value used for this comparison.", + "format": "int64", + "type": "string" + } + }, + "type": "object" + }, + "webPropertyId": { + "description": "Web property ID to which this goal belongs. The web property ID is of the form UA-XXXXX-YY.", + "type": "string" + } + }, + "type": "object" + }, + "Goals": { + "description": "A goal collection lists Analytics goals to which the user has access. Each view (profile) can have a set of goals. Each resource in the Goal collection corresponds to a single Analytics goal.", + "id": "Goals", + "properties": { + "items": { + "description": "A list of goals.", + "items": { + "$ref": "Goal" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#goals", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this goal collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this goal collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of resources in the result.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "HashClientIdRequest": { + "description": "JSON template for a hash Client Id request resource.", + "id": "HashClientIdRequest", + "properties": { + "clientId": { + "type": "string" + }, + "kind": { + "default": "analytics#hashClientIdRequest", + "type": "string" + }, + "webPropertyId": { + "type": "string" + } + }, + "type": "object" + }, + "HashClientIdResponse": { + "description": "JSON template for a hash Client Id response resource.", + "id": "HashClientIdResponse", + "properties": { + "clientId": { + "type": "string" + }, + "hashedClientId": { + "type": "string" + }, + "kind": { + "default": "analytics#hashClientIdResponse", + "type": "string" + }, + "webPropertyId": { + "type": "string" + } + }, + "type": "object" + }, + "IncludeConditions": { + "description": "JSON template for an Analytics Remarketing Include Conditions.", + "id": "IncludeConditions", + "properties": { + "daysToLookBack": { + "description": "The look-back window lets you specify a time frame for evaluating the behavior that qualifies users for your audience. For example, if your filters include users from Central Asia, and Transactions Greater than 2, and you set the look-back window to 14 days, then any user from Central Asia whose cumulative transactions exceed 2 during the last 14 days is added to the audience.", + "format": "int32", + "type": "integer" + }, + "isSmartList": { + "description": "Boolean indicating whether this segment is a smart list. https://support.google.com/analytics/answer/4628577", + "type": "boolean" + }, + "kind": { + "default": "analytics#includeConditions", + "description": "Resource type for include conditions.", + "type": "string" + }, + "membershipDurationDays": { + "description": "Number of days (in the range 1 to 540) a user remains in the audience.", + "format": "int32", + "type": "integer" + }, + "segment": { + "description": "The segment condition that will cause a user to be added to an audience.", + "type": "string" + } + }, + "type": "object" + }, + "LinkedForeignAccount": { + "description": "JSON template for an Analytics Remarketing Audience Foreign Link.", + "id": "LinkedForeignAccount", + "properties": { + "accountId": { + "description": "Account ID to which this linked foreign account belongs.", + "type": "string" + }, + "eligibleForSearch": { + "description": "Boolean indicating whether this is eligible for search.", + "readOnly": true, + "type": "boolean" + }, + "id": { + "description": "Entity ad account link ID.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for the web property to which this linked foreign account belongs.", + "readOnly": true, + "type": "string" + }, + "kind": { + "default": "analytics#linkedForeignAccount", + "description": "Resource type for linked foreign account.", + "type": "string" + }, + "linkedAccountId": { + "description": "The foreign account ID. For example the an Google Ads `linkedAccountId` has the following format XXX-XXX-XXXX.", + "type": "string" + }, + "remarketingAudienceId": { + "description": "Remarketing audience ID to which this linked foreign account belongs.", + "type": "string" + }, + "status": { + "description": "The status of this foreign account link.", + "type": "string" + }, + "type": { + "description": "The type of the foreign account. For example, `ADWORDS_LINKS`, `DBM_LINKS`, `MCC_LINKS` or `OPTIMIZE`.", + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID of the form UA-XXXXX-YY to which this linked foreign account belongs.", + "type": "string" + } + }, + "type": "object" + }, + "McfData": { + "description": "Multi-Channel Funnels data for a given view (profile).", + "id": "McfData", + "properties": { + "columnHeaders": { + "description": "Column headers that list dimension names followed by the metric names. The order of dimensions and metrics is same as specified in the request.", + "items": { + "properties": { + "columnType": { + "description": "Column Type. Either DIMENSION or METRIC.", + "type": "string" + }, + "dataType": { + "description": "Data type. Dimension and metric values data types such as INTEGER, DOUBLE, CURRENCY, MCF_SEQUENCE etc.", + "type": "string" + }, + "name": { + "description": "Column name.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "containsSampledData": { + "description": "Determines if the Analytics data contains sampled data.", + "type": "boolean" + }, + "id": { + "description": "Unique ID for this data response.", + "type": "string" + }, + "itemsPerPage": { + "description": "The maximum number of rows the response can contain, regardless of the actual number of rows returned. Its value ranges from 1 to 10,000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#mcfData", + "description": "Resource type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this Analytics data query.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this Analytics data query.", + "type": "string" + }, + "profileInfo": { + "description": "Information for the view (profile), for which the Analytics data was requested.", + "properties": { + "accountId": { + "description": "Account ID to which this view (profile) belongs.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for the web property to which this view (profile) belongs.", + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID.", + "type": "string" + }, + "profileName": { + "description": "View (Profile) name.", + "type": "string" + }, + "tableId": { + "description": "Table ID for view (profile).", + "type": "string" + }, + "webPropertyId": { + "description": "Web Property ID to which this view (profile) belongs.", + "type": "string" + } + }, + "type": "object" + }, + "query": { + "description": "Analytics data request query parameters.", + "properties": { + "dimensions": { + "description": "List of analytics dimensions.", + "type": "string" + }, + "end-date": { + "description": "End date.", + "type": "string" + }, + "filters": { + "description": "Comma-separated list of dimension or metric filters.", + "type": "string" + }, + "ids": { + "description": "Unique table ID.", + "type": "string" + }, + "max-results": { + "description": "Maximum results per page.", + "format": "int32", + "type": "integer" + }, + "metrics": { + "description": "List of analytics metrics.", + "items": { + "type": "string" + }, + "type": "array" + }, + "samplingLevel": { + "description": "Desired sampling level", + "type": "string" + }, + "segment": { + "description": "Analytics advanced segment.", + "type": "string" + }, + "sort": { + "description": "List of dimensions or metrics based on which Analytics data is sorted.", + "items": { + "type": "string" + }, + "type": "array" + }, + "start-date": { + "description": "Start date.", + "type": "string" + }, + "start-index": { + "description": "Start index.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "rows": { + "description": "Analytics data rows, where each row contains a list of dimension values followed by the metric values. The order of dimensions and metrics is same as specified in the request.", + "items": { + "items": { + "description": "A union object representing a dimension or metric value. Only one of \"primitiveValue\" or \"conversionPathValue\" attribute will be populated.", + "properties": { + "conversionPathValue": { + "description": "A conversion path dimension value, containing a list of interactions with their attributes.", + "items": { + "properties": { + "interactionType": { + "description": "Type of an interaction on conversion path. Such as CLICK, IMPRESSION etc.", + "type": "string" + }, + "nodeValue": { + "description": "Node value of an interaction on conversion path. Such as source, medium etc.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "primitiveValue": { + "description": "A primitive dimension value. A primitive metric value.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "type": "array" + }, + "sampleSize": { + "description": "The number of samples used to calculate the result.", + "format": "int64", + "type": "string" + }, + "sampleSpace": { + "description": "Total size of the sample space from which the samples were selected.", + "format": "int64", + "type": "string" + }, + "selfLink": { + "description": "Link to this page.", + "type": "string" + }, + "totalResults": { + "description": "The total number of rows for the query, regardless of the number of rows in the response.", + "format": "int32", + "type": "integer" + }, + "totalsForAllResults": { + "additionalProperties": { + "description": "Key-value pair for the total value of a metric. Key is the metric name and the value is the total value for that metric.", + "type": "string" + }, + "description": "Total values for the requested metrics over all the results, not just the results returned in this response. The order of the metric totals is same as the metric order specified in the request.", + "type": "object" + } + }, + "type": "object" + }, + "Profile": { + "description": "JSON template for an Analytics view (profile).", + "id": "Profile", + "properties": { + "accountId": { + "description": "Account ID to which this view (profile) belongs.", + "type": "string" + }, + "botFilteringEnabled": { + "description": "Indicates whether bot filtering is enabled for this view (profile).", + "type": "boolean" + }, + "childLink": { + "description": "Child link for this view (profile). Points to the list of goals for this view (profile).", + "properties": { + "href": { + "description": "Link to the list of goals for this view (profile).", + "type": "string" + }, + "type": { + "default": "analytics#goals", + "description": "Value is \"analytics#goals\".", + "type": "string" + } + }, + "type": "object" + }, + "created": { + "description": "Time this view (profile) was created.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "currency": { + "description": "The currency type associated with this view (profile), defaults to USD. The supported values are:\nUSD, JPY, EUR, GBP, AUD, KRW, BRL, CNY, DKK, RUB, SEK, NOK, PLN, TRY, TWD, HKD, THB, IDR, ARS, MXN, VND, PHP, INR, CHF, CAD, CZK, NZD, HUF, BGN, LTL, ZAR, UAH, AED, BOB, CLP, COP, EGP, HRK, ILS, MAD, MYR, PEN, PKR, RON, RSD, SAR, SGD, VEF, LVL", + "type": "string" + }, + "defaultPage": { + "description": "Default page for this view (profile).", + "type": "string" + }, + "eCommerceTracking": { + "description": "Indicates whether ecommerce tracking is enabled for this view (profile).", + "type": "boolean" + }, + "enhancedECommerceTracking": { + "description": "Indicates whether enhanced ecommerce tracking is enabled for this view (profile). This property can only be enabled if ecommerce tracking is enabled.", + "type": "boolean" + }, + "excludeQueryParameters": { + "description": "The query parameters that are excluded from this view (profile).", + "type": "string" + }, + "id": { + "description": "View (Profile) ID.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for the web property to which this view (profile) belongs.", + "readOnly": true, + "type": "string" + }, + "kind": { + "default": "analytics#profile", + "description": "Resource type for Analytics view (profile).", + "readOnly": true, + "type": "string" + }, + "name": { + "description": "Name of this view (profile).", + "type": "string" + }, + "parentLink": { + "description": "Parent link for this view (profile). Points to the web property to which this view (profile) belongs.", + "properties": { + "href": { + "description": "Link to the web property to which this view (profile) belongs.", + "type": "string" + }, + "type": { + "default": "analytics#webproperty", + "description": "Value is \"analytics#webproperty\".", + "type": "string" + } + }, + "type": "object" + }, + "permissions": { + "description": "Permissions the user has for this view (profile).", + "properties": { + "effective": { + "description": "All the permissions that the user has for this view (profile). These include any implied permissions (e.g., EDIT implies VIEW) or inherited permissions from the parent web property.", + "items": { + "type": "string" + }, + "readOnly": true, + "type": "array" + } + }, + "type": "object" + }, + "selfLink": { + "description": "Link for this view (profile).", + "readOnly": true, + "type": "string" + }, + "siteSearchCategoryParameters": { + "description": "Site search category parameters for this view (profile).", + "type": "string" + }, + "siteSearchQueryParameters": { + "description": "The site search query parameters for this view (profile).", + "type": "string" + }, + "starred": { + "description": "Indicates whether this view (profile) is starred or not.", + "type": "boolean" + }, + "stripSiteSearchCategoryParameters": { + "description": "Whether or not Analytics will strip search category parameters from the URLs in your reports.", + "type": "boolean" + }, + "stripSiteSearchQueryParameters": { + "description": "Whether or not Analytics will strip search query parameters from the URLs in your reports.", + "type": "boolean" + }, + "timezone": { + "description": "Time zone for which this view (profile) has been configured. Time zones are identified by strings from the TZ database.", + "type": "string" + }, + "type": { + "description": "View (Profile) type. Supported types: WEB or APP.", + "type": "string" + }, + "updated": { + "description": "Time this view (profile) was last modified.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID of the form UA-XXXXX-YY to which this view (profile) belongs.", + "readOnly": true, + "type": "string" + }, + "websiteUrl": { + "description": "Website URL for this view (profile).", + "type": "string" + } + }, + "type": "object" + }, + "ProfileFilterLink": { + "description": "JSON template for an Analytics profile filter link.", + "id": "ProfileFilterLink", + "properties": { + "filterRef": { + "$ref": "FilterRef", + "description": "Filter for this link." + }, + "id": { + "description": "Profile filter link ID.", + "type": "string" + }, + "kind": { + "default": "analytics#profileFilterLink", + "description": "Resource type for Analytics filter.", + "readOnly": true, + "type": "string" + }, + "profileRef": { + "$ref": "ProfileRef", + "description": "View (Profile) for this link." + }, + "rank": { + "description": "The rank of this profile filter link relative to the other filters linked to the same profile.\nFor readonly (i.e., list and get) operations, the rank always starts at 1.\nFor write (i.e., create, update, or delete) operations, you may specify a value between 0 and 255 inclusively, [0, 255]. In order to insert a link at the end of the list, either don't specify a rank or set a rank to a number greater than the largest rank in the list. In order to insert a link to the beginning of the list specify a rank that is less than or equal to 1. The new link will move all existing filters with the same or lower rank down the list. After the link is inserted/updated/deleted all profile filter links will be renumbered starting at 1.", + "format": "int32", + "type": "integer" + }, + "selfLink": { + "description": "Link for this profile filter link.", + "readOnly": true, + "type": "string" + } + }, + "type": "object" + }, + "ProfileFilterLinks": { + "description": "A profile filter link collection lists profile filter links between profiles and filters. Each resource in the collection corresponds to a profile filter link.", + "id": "ProfileFilterLinks", + "properties": { + "items": { + "description": "A list of profile filter links.", + "items": { + "$ref": "ProfileFilterLink" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1,000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#profileFilterLinks", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this profile filter link collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this profile filter link collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "ProfileRef": { + "description": "JSON template for a linked view (profile).", + "id": "ProfileRef", + "properties": { + "accountId": { + "description": "Account ID to which this view (profile) belongs.", + "type": "string" + }, + "href": { + "description": "Link for this view (profile).", + "type": "string" + }, + "id": { + "description": "View (Profile) ID.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for the web property to which this view (profile) belongs.", + "type": "string" + }, + "kind": { + "default": "analytics#profileRef", + "description": "Analytics view (profile) reference.", + "type": "string" + }, + "name": { + "description": "Name of this view (profile).", + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID of the form UA-XXXXX-YY to which this view (profile) belongs.", + "type": "string" + } + }, + "type": "object" + }, + "ProfileSummary": { + "description": "JSON template for an Analytics ProfileSummary. ProfileSummary returns basic information (i.e., summary) for a profile.", + "id": "ProfileSummary", + "properties": { + "id": { + "description": "View (profile) ID.", + "type": "string" + }, + "kind": { + "default": "analytics#profileSummary", + "description": "Resource type for Analytics ProfileSummary.", + "type": "string" + }, + "name": { + "description": "View (profile) name.", + "type": "string" + }, + "starred": { + "description": "Indicates whether this view (profile) is starred or not.", + "type": "boolean" + }, + "type": { + "description": "View (Profile) type. Supported types: WEB or APP.", + "type": "string" + } + }, + "type": "object" + }, + "Profiles": { + "description": "A view (profile) collection lists Analytics views (profiles) to which the user has access. Each resource in the collection corresponds to a single Analytics view (profile).", + "id": "Profiles", + "properties": { + "items": { + "description": "A list of views (profiles).", + "items": { + "$ref": "Profile" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#profiles", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this view (profile) collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this view (profile) collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "RealtimeData": { + "description": "Real time data for a given view (profile).", + "id": "RealtimeData", + "properties": { + "columnHeaders": { + "description": "Column headers that list dimension names followed by the metric names. The order of dimensions and metrics is same as specified in the request.", + "items": { + "properties": { + "columnType": { + "description": "Column Type. Either DIMENSION or METRIC.", + "type": "string" + }, + "dataType": { + "description": "Data type. Dimension column headers have only STRING as the data type. Metric column headers have data types for metric values such as INTEGER, DOUBLE, CURRENCY etc.", + "type": "string" + }, + "name": { + "description": "Column name.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Unique ID for this data response.", + "type": "string" + }, + "kind": { + "default": "analytics#realtimeData", + "description": "Resource type.", + "type": "string" + }, + "profileInfo": { + "description": "Information for the view (profile), for which the real time data was requested.", + "properties": { + "accountId": { + "description": "Account ID to which this view (profile) belongs.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for the web property to which this view (profile) belongs.", + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID.", + "type": "string" + }, + "profileName": { + "description": "View (Profile) name.", + "type": "string" + }, + "tableId": { + "description": "Table ID for view (profile).", + "type": "string" + }, + "webPropertyId": { + "description": "Web Property ID to which this view (profile) belongs.", + "type": "string" + } + }, + "type": "object" + }, + "query": { + "description": "Real time data request query parameters.", + "properties": { + "dimensions": { + "description": "List of real time dimensions.", + "type": "string" + }, + "filters": { + "description": "Comma-separated list of dimension or metric filters.", + "type": "string" + }, + "ids": { + "description": "Unique table ID.", + "type": "string" + }, + "max-results": { + "description": "Maximum results per page.", + "format": "int32", + "type": "integer" + }, + "metrics": { + "description": "List of real time metrics.", + "items": { + "type": "string" + }, + "type": "array" + }, + "sort": { + "description": "List of dimensions or metrics based on which real time data is sorted.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "rows": { + "description": "Real time data rows, where each row contains a list of dimension values followed by the metric values. The order of dimensions and metrics is same as specified in the request.", + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "array" + }, + "selfLink": { + "description": "Link to this page.", + "type": "string" + }, + "totalResults": { + "description": "The total number of rows for the query, regardless of the number of rows in the response.", + "format": "int32", + "type": "integer" + }, + "totalsForAllResults": { + "additionalProperties": { + "description": "Key-value pair for the total value of a metric. Key is the metric name and the value is the total value for that metric.", + "type": "string" + }, + "description": "Total values for the requested metrics over all the results, not just the results returned in this response. The order of the metric totals is same as the metric order specified in the request.", + "type": "object" + } + }, + "type": "object" + }, + "RemarketingAudience": { + "description": "JSON template for an Analytics remarketing audience.", + "id": "RemarketingAudience", + "properties": { + "accountId": { + "description": "Account ID to which this remarketing audience belongs.", + "type": "string" + }, + "audienceDefinition": { + "description": "The simple audience definition that will cause a user to be added to an audience.", + "properties": { + "includeConditions": { + "$ref": "IncludeConditions", + "description": "Defines the conditions to include users to the audience." + } + }, + "type": "object" + }, + "audienceType": { + "description": "The type of audience, either SIMPLE or STATE_BASED.", + "type": "string" + }, + "created": { + "description": "Time this remarketing audience was created.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "description": { + "description": "The description of this remarketing audience.", + "readOnly": true, + "type": "string" + }, + "id": { + "description": "Remarketing Audience ID.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for the web property to which this remarketing audience belongs.", + "readOnly": true, + "type": "string" + }, + "kind": { + "default": "analytics#remarketingAudience", + "description": "Collection type.", + "type": "string" + }, + "linkedAdAccounts": { + "description": "The linked ad accounts associated with this remarketing audience. A remarketing audience can have only one linkedAdAccount currently.", + "items": { + "$ref": "LinkedForeignAccount" + }, + "type": "array" + }, + "linkedViews": { + "description": "The views (profiles) that this remarketing audience is linked to.", + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "description": "The name of this remarketing audience.", + "type": "string" + }, + "stateBasedAudienceDefinition": { + "description": "A state based audience definition that will cause a user to be added or removed from an audience.", + "properties": { + "excludeConditions": { + "description": "Defines the conditions to exclude users from the audience.", + "properties": { + "exclusionDuration": { + "description": "Whether to make the exclusion TEMPORARY or PERMANENT.", + "type": "string" + }, + "segment": { + "description": "The segment condition that will cause a user to be removed from an audience.", + "type": "string" + } + }, + "type": "object" + }, + "includeConditions": { + "$ref": "IncludeConditions", + "description": "Defines the conditions to include users to the audience." + } + }, + "type": "object" + }, + "updated": { + "description": "Time this remarketing audience was last modified.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID of the form UA-XXXXX-YY to which this remarketing audience belongs.", + "type": "string" + } + }, + "type": "object" + }, + "RemarketingAudiences": { + "description": "A remarketing audience collection lists Analytics remarketing audiences to which the user has access. Each resource in the collection corresponds to a single Analytics remarketing audience.", + "id": "RemarketingAudiences", + "properties": { + "items": { + "description": "A list of remarketing audiences.", + "items": { + "$ref": "RemarketingAudience" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#remarketingAudiences", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this remarketing audience collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this view (profile) collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "Segment": { + "description": "JSON template for an Analytics segment.", + "id": "Segment", + "properties": { + "created": { + "description": "Time the segment was created.", + "format": "date-time", + "type": "string" + }, + "definition": { + "description": "Segment definition.", + "type": "string" + }, + "id": { + "description": "Segment ID.", + "type": "string" + }, + "kind": { + "default": "analytics#segment", + "description": "Resource type for Analytics segment.", + "type": "string" + }, + "name": { + "description": "Segment name.", + "type": "string" + }, + "segmentId": { + "description": "Segment ID. Can be used with the 'segment' parameter in Core Reporting API.", + "type": "string" + }, + "selfLink": { + "description": "Link for this segment.", + "type": "string" + }, + "type": { + "description": "Type for a segment. Possible values are \"BUILT_IN\" or \"CUSTOM\".", + "type": "string" + }, + "updated": { + "description": "Time the segment was last modified.", + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "Segments": { + "description": "An segment collection lists Analytics segments that the user has access to. Each resource in the collection corresponds to a single Analytics segment.", + "id": "Segments", + "properties": { + "items": { + "description": "A list of segments.", + "items": { + "$ref": "Segment" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#segments", + "description": "Collection type for segments.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this segment collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this segment collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "UnsampledReport": { + "description": "JSON template for Analytics unsampled report resource.", + "id": "UnsampledReport", + "properties": { + "accountId": { + "description": "Account ID to which this unsampled report belongs.", + "type": "string" + }, + "cloudStorageDownloadDetails": { + "description": "Download details for a file stored in Google Cloud Storage.", + "properties": { + "bucketId": { + "description": "Id of the bucket the file object is stored in.", + "type": "string" + }, + "objectId": { + "description": "Id of the file object containing the report data.", + "type": "string" + } + }, + "readOnly": true, + "type": "object" + }, + "created": { + "description": "Time this unsampled report was created.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "dimensions": { + "description": "The dimensions for the unsampled report.", + "type": "string" + }, + "downloadType": { + "description": "The type of download you need to use for the report data file. Possible values include `GOOGLE_DRIVE` and `GOOGLE_CLOUD_STORAGE`. If the value is `GOOGLE_DRIVE`, see the `driveDownloadDetails` field. If the value is `GOOGLE_CLOUD_STORAGE`, see the `cloudStorageDownloadDetails` field.", + "readOnly": true, + "type": "string" + }, + "driveDownloadDetails": { + "description": "Download details for a file stored in Google Drive.", + "properties": { + "documentId": { + "description": "Id of the document/file containing the report data.", + "type": "string" + } + }, + "readOnly": true, + "type": "object" + }, + "end-date": { + "annotations": { + "required": [ + "analytics.management.filters.insert", + "analytics.management.unsampledReports.insert" + ] + }, + "description": "The end date for the unsampled report.", + "type": "string" + }, + "filters": { + "description": "The filters for the unsampled report.", + "type": "string" + }, + "id": { + "description": "Unsampled report ID.", + "type": "string" + }, + "kind": { + "default": "analytics#unsampledReport", + "description": "Resource type for an Analytics unsampled report.", + "readOnly": true, + "type": "string" + }, + "metrics": { + "annotations": { + "required": [ + "analytics.management.filters.insert", + "analytics.management.unsampledReports.insert" + ] + }, + "description": "The metrics for the unsampled report.", + "type": "string" + }, + "profileId": { + "description": "View (Profile) ID to which this unsampled report belongs.", + "type": "string" + }, + "segment": { + "description": "The segment for the unsampled report.", + "type": "string" + }, + "selfLink": { + "description": "Link for this unsampled report.", + "readOnly": true, + "type": "string" + }, + "start-date": { + "annotations": { + "required": [ + "analytics.management.filters.insert", + "analytics.management.unsampledReports.insert" + ] + }, + "description": "The start date for the unsampled report.", + "type": "string" + }, + "status": { + "description": "Status of this unsampled report. Possible values are PENDING, COMPLETED, or FAILED.", + "readOnly": true, + "type": "string" + }, + "title": { + "annotations": { + "required": [ + "analytics.management.filters.insert", + "analytics.management.unsampledReports.insert" + ] + }, + "description": "Title of the unsampled report.", + "type": "string" + }, + "updated": { + "description": "Time this unsampled report was last modified.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID to which this unsampled report belongs. The web property ID is of the form UA-XXXXX-YY.", + "type": "string" + } + }, + "type": "object" + }, + "UnsampledReports": { + "description": "An unsampled report collection lists Analytics unsampled reports to which the user has access. Each view (profile) can have a set of unsampled reports. Each resource in the unsampled report collection corresponds to a single Analytics unsampled report.", + "id": "UnsampledReports", + "properties": { + "items": { + "description": "A list of unsampled reports.", + "items": { + "$ref": "UnsampledReport" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#unsampledReports", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this unsampled report collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this unsampled report collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of resources in the result.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "Upload": { + "description": "Metadata returned for an upload operation.", + "id": "Upload", + "properties": { + "accountId": { + "description": "Account Id to which this upload belongs.", + "format": "int64", + "type": "string" + }, + "customDataSourceId": { + "description": "Custom data source Id to which this data import belongs.", + "type": "string" + }, + "errors": { + "description": "Data import errors collection.", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "A unique ID for this upload.", + "type": "string" + }, + "kind": { + "default": "analytics#upload", + "description": "Resource type for Analytics upload.", + "type": "string" + }, + "status": { + "description": "Upload status. Possible values: PENDING, COMPLETED, FAILED, DELETING, DELETED.", + "type": "string" + }, + "uploadTime": { + "description": "Time this file is uploaded.", + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "Uploads": { + "description": "Upload collection lists Analytics uploads to which the user has access. Each custom data source can have a set of uploads. Each resource in the upload collection corresponds to a single Analytics data upload.", + "id": "Uploads", + "properties": { + "items": { + "description": "A list of uploads.", + "items": { + "$ref": "Upload" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#uploads", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this upload collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this upload collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of resources in the result.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, + "UserDeletionRequest": { + "description": "JSON template for a user deletion request resource.", + "id": "UserDeletionRequest", + "properties": { + "deletionRequestTime": { + "description": "This marks the point in time for which all user data before should be deleted", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "firebaseProjectId": { + "description": "Firebase Project Id", + "type": "string" + }, + "id": { + "description": "User ID.", + "properties": { + "type": { + "description": "Type of user", + "type": "string" + }, + "userId": { + "description": "The User's id", + "type": "string" + } + }, + "type": "object" + }, + "kind": { + "default": "analytics#userDeletionRequest", + "description": "Value is \"analytics#userDeletionRequest\".", + "type": "string" + }, + "propertyId": { + "description": "Property ID", + "type": "string" + }, + "webPropertyId": { + "description": "Web property ID of the form UA-XXXXX-YY.", + "type": "string" + } + }, + "type": "object" + }, + "UserRef": { + "description": "JSON template for a user reference.", + "id": "UserRef", + "properties": { + "email": { + "description": "Email ID of this user.", + "type": "string" + }, + "id": { + "description": "User ID.", + "type": "string" + }, + "kind": { + "default": "analytics#userRef", + "type": "string" + } + }, + "type": "object" + }, + "WebPropertyRef": { + "description": "JSON template for a web property reference.", + "id": "WebPropertyRef", + "properties": { + "accountId": { + "description": "Account ID to which this web property belongs.", + "type": "string" + }, + "href": { + "description": "Link for this web property.", + "type": "string" + }, + "id": { + "description": "Web property ID of the form UA-XXXXX-YY.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for this web property.", + "type": "string" + }, + "kind": { + "default": "analytics#webPropertyRef", + "description": "Analytics web property reference.", + "type": "string" + }, + "name": { + "description": "Name of this web property.", + "type": "string" + } + }, + "type": "object" + }, + "WebPropertySummary": { + "description": "JSON template for an Analytics WebPropertySummary. WebPropertySummary returns basic information (i.e., summary) for a web property.", + "id": "WebPropertySummary", + "properties": { + "id": { + "description": "Web property ID of the form UA-XXXXX-YY.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for this web property.", + "type": "string" + }, + "kind": { + "default": "analytics#webPropertySummary", + "description": "Resource type for Analytics WebPropertySummary.", + "type": "string" + }, + "level": { + "description": "Level for this web property. Possible values are STANDARD or PREMIUM.", + "type": "string" + }, + "name": { + "description": "Web property name.", + "type": "string" + }, + "profiles": { + "description": "List of profiles under this web property.", + "items": { + "$ref": "ProfileSummary" + }, + "type": "array" + }, + "starred": { + "description": "Indicates whether this web property is starred or not.", + "type": "boolean" + }, + "websiteUrl": { + "description": "Website url for this web property.", + "type": "string" + } + }, + "type": "object" + }, + "Webproperties": { + "description": "A web property collection lists Analytics web properties to which the user has access. Each resource in the collection corresponds to a single Analytics web property.", + "id": "Webproperties", + "properties": { + "items": { + "description": "A list of web properties.", + "items": { + "$ref": "Webproperty" + }, + "type": "array" + }, + "itemsPerPage": { + "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.", + "format": "int32", + "type": "integer" + }, + "kind": { + "default": "analytics#webproperties", + "description": "Collection type.", + "type": "string" + }, + "nextLink": { + "description": "Link to next page for this web property collection.", + "type": "string" + }, + "previousLink": { + "description": "Link to previous page for this web property collection.", + "type": "string" + }, + "startIndex": { + "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.", + "format": "int32", + "type": "integer" + }, + "totalResults": { + "description": "The total number of results for the query, regardless of the number of results in the response.", + "format": "int32", + "type": "integer" + }, + "username": { + "description": "Email ID of the authenticated user", + "type": "string" + } + }, + "type": "object" + }, + "Webproperty": { + "description": "JSON template for an Analytics web property.", + "id": "Webproperty", + "properties": { + "accountId": { + "description": "Account ID to which this web property belongs.", + "type": "string" + }, + "childLink": { + "description": "Child link for this web property. Points to the list of views (profiles) for this web property.", + "properties": { + "href": { + "description": "Link to the list of views (profiles) for this web property.", + "type": "string" + }, + "type": { + "default": "analytics#profiles", + "description": "Type of the parent link. Its value is \"analytics#profiles\".", + "type": "string" + } + }, + "type": "object" + }, + "created": { + "description": "Time this web property was created.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "dataRetentionResetOnNewActivity": { + "description": "Set to true to reset the retention period of the user identifier with each new event from that user (thus setting the expiration date to current time plus retention period).\nSet to false to delete data associated with the user identifier automatically after the rentention period.\nThis property cannot be set on insert.", + "type": "boolean" + }, + "dataRetentionTtl": { + "description": "The length of time for which user and event data is retained.\nThis property cannot be set on insert.", + "type": "string" + }, + "defaultProfileId": { + "description": "Default view (profile) ID.", + "format": "int64", + "type": "string" + }, + "id": { + "description": "Web property ID of the form UA-XXXXX-YY.", + "type": "string" + }, + "industryVertical": { + "description": "The industry vertical/category selected for this web property.", + "type": "string" + }, + "internalWebPropertyId": { + "description": "Internal ID for this web property.", + "readOnly": true, + "type": "string" + }, + "kind": { + "default": "analytics#webproperty", + "description": "Resource type for Analytics WebProperty.", + "readOnly": true, + "type": "string" + }, + "level": { + "description": "Level for this web property. Possible values are STANDARD or PREMIUM.", + "readOnly": true, + "type": "string" + }, + "name": { + "description": "Name of this web property.", + "type": "string" + }, + "parentLink": { + "description": "Parent link for this web property. Points to the account to which this web property belongs.", + "properties": { + "href": { + "description": "Link to the account for this web property.", + "type": "string" + }, + "type": { + "default": "analytics#account", + "description": "Type of the parent link. Its value is \"analytics#account\".", + "type": "string" + } + }, + "type": "object" + }, + "permissions": { + "description": "Permissions the user has for this web property.", + "properties": { + "effective": { + "description": "All the permissions that the user has for this web property. These include any implied permissions (e.g., EDIT implies VIEW) or inherited permissions from the parent account.", + "items": { + "type": "string" + }, + "readOnly": true, + "type": "array" + } + }, + "type": "object" + }, + "profileCount": { + "description": "View (Profile) count for this web property.", + "format": "int32", + "readOnly": true, + "type": "integer" + }, + "selfLink": { + "description": "Link for this web property.", + "readOnly": true, + "type": "string" + }, + "starred": { + "description": "Indicates whether this web property is starred or not.", + "type": "boolean" + }, + "updated": { + "description": "Time this web property was last modified.", + "format": "date-time", + "readOnly": true, + "type": "string" + }, + "websiteUrl": { + "description": "Website url for this web property.", + "type": "string" + } + }, + "type": "object" + } + }, + "servicePath": "analytics/v3/", + "title": "Google Analytics API", + "version": "v3" +} \ No newline at end of file diff --git a/vendor/google.golang.org/api/analytics/v3/analytics-gen.go b/vendor/google.golang.org/api/analytics/v3/analytics-gen.go new file mode 100644 index 00000000..cf6fde5d --- /dev/null +++ b/vendor/google.golang.org/api/analytics/v3/analytics-gen.go @@ -0,0 +1,20204 @@ +// Copyright 2019 Google LLC. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated file. DO NOT EDIT. + +// Package analytics provides access to the Google Analytics API. +// +// For product documentation, see: https://developers.google.com/analytics/ +// +// Creating a client +// +// Usage example: +// +// import "google.golang.org/api/analytics/v3" +// ... +// ctx := context.Background() +// analyticsService, err := analytics.NewService(ctx) +// +// In this example, Google Application Default Credentials are used for authentication. +// +// For information on how to create and obtain Application Default Credentials, see https://developers.google.com/identity/protocols/application-default-credentials. +// +// Other authentication options +// +// By default, all available scopes (see "Constants") are used to authenticate. To restrict scopes, use option.WithScopes: +// +// analyticsService, err := analytics.NewService(ctx, option.WithScopes(analytics.AnalyticsUserDeletionScope)) +// +// To use an API key for authentication (note: some APIs do not support API keys), use option.WithAPIKey: +// +// analyticsService, err := analytics.NewService(ctx, option.WithAPIKey("AIza...")) +// +// To use an OAuth token (e.g., a user token obtained via a three-legged OAuth flow), use option.WithTokenSource: +// +// config := &oauth2.Config{...} +// // ... +// token, err := config.Exchange(ctx, ...) +// analyticsService, err := analytics.NewService(ctx, option.WithTokenSource(config.TokenSource(ctx, token))) +// +// See https://godoc.org/google.golang.org/api/option/ for details on options. +package analytics // import "google.golang.org/api/analytics/v3" + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "net/url" + "strconv" + "strings" + + gensupport "google.golang.org/api/gensupport" + googleapi "google.golang.org/api/googleapi" + option "google.golang.org/api/option" + htransport "google.golang.org/api/transport/http" +) + +// Always reference these packages, just in case the auto-generated code +// below doesn't. +var _ = bytes.NewBuffer +var _ = strconv.Itoa +var _ = fmt.Sprintf +var _ = json.NewDecoder +var _ = io.Copy +var _ = url.Parse +var _ = gensupport.MarshalJSON +var _ = googleapi.Version +var _ = errors.New +var _ = strings.Replace +var _ = context.Canceled + +const apiId = "analytics:v3" +const apiName = "analytics" +const apiVersion = "v3" +const basePath = "https://www.googleapis.com/analytics/v3/" + +// OAuth2 scopes used by this API. +const ( + // View and manage your Google Analytics data + AnalyticsScope = "https://www.googleapis.com/auth/analytics" + + // Edit Google Analytics management entities + AnalyticsEditScope = "https://www.googleapis.com/auth/analytics.edit" + + // Manage Google Analytics Account users by email address + AnalyticsManageUsersScope = "https://www.googleapis.com/auth/analytics.manage.users" + + // View Google Analytics user permissions + AnalyticsManageUsersReadonlyScope = "https://www.googleapis.com/auth/analytics.manage.users.readonly" + + // Create a new Google Analytics account along with its default property + // and view + AnalyticsProvisionScope = "https://www.googleapis.com/auth/analytics.provision" + + // View your Google Analytics data + AnalyticsReadonlyScope = "https://www.googleapis.com/auth/analytics.readonly" + + // Manage Google Analytics user deletion requests + AnalyticsUserDeletionScope = "https://www.googleapis.com/auth/analytics.user.deletion" +) + +// NewService creates a new Service. +func NewService(ctx context.Context, opts ...option.ClientOption) (*Service, error) { + scopesOption := option.WithScopes( + "https://www.googleapis.com/auth/analytics", + "https://www.googleapis.com/auth/analytics.edit", + "https://www.googleapis.com/auth/analytics.manage.users", + "https://www.googleapis.com/auth/analytics.manage.users.readonly", + "https://www.googleapis.com/auth/analytics.provision", + "https://www.googleapis.com/auth/analytics.readonly", + "https://www.googleapis.com/auth/analytics.user.deletion", + ) + // NOTE: prepend, so we don't override user-specified scopes. + opts = append([]option.ClientOption{scopesOption}, opts...) + client, endpoint, err := htransport.NewClient(ctx, opts...) + if err != nil { + return nil, err + } + s, err := New(client) + if err != nil { + return nil, err + } + if endpoint != "" { + s.BasePath = endpoint + } + return s, nil +} + +// New creates a new Service. It uses the provided http.Client for requests. +// +// Deprecated: please use NewService instead. +// To provide a custom HTTP client, use option.WithHTTPClient. +// If you are using google.golang.org/api/googleapis/transport.APIKey, use option.WithAPIKey with NewService instead. +func New(client *http.Client) (*Service, error) { + if client == nil { + return nil, errors.New("client is nil") + } + s := &Service{client: client, BasePath: basePath} + s.Data = NewDataService(s) + s.Management = NewManagementService(s) + s.Metadata = NewMetadataService(s) + s.Provisioning = NewProvisioningService(s) + s.UserDeletion = NewUserDeletionService(s) + return s, nil +} + +type Service struct { + client *http.Client + BasePath string // API endpoint base URL + UserAgent string // optional additional User-Agent fragment + + Data *DataService + + Management *ManagementService + + Metadata *MetadataService + + Provisioning *ProvisioningService + + UserDeletion *UserDeletionService +} + +func (s *Service) userAgent() string { + if s.UserAgent == "" { + return googleapi.UserAgent + } + return googleapi.UserAgent + " " + s.UserAgent +} + +func NewDataService(s *Service) *DataService { + rs := &DataService{s: s} + rs.Ga = NewDataGaService(s) + rs.Mcf = NewDataMcfService(s) + rs.Realtime = NewDataRealtimeService(s) + return rs +} + +type DataService struct { + s *Service + + Ga *DataGaService + + Mcf *DataMcfService + + Realtime *DataRealtimeService +} + +func NewDataGaService(s *Service) *DataGaService { + rs := &DataGaService{s: s} + return rs +} + +type DataGaService struct { + s *Service +} + +func NewDataMcfService(s *Service) *DataMcfService { + rs := &DataMcfService{s: s} + return rs +} + +type DataMcfService struct { + s *Service +} + +func NewDataRealtimeService(s *Service) *DataRealtimeService { + rs := &DataRealtimeService{s: s} + return rs +} + +type DataRealtimeService struct { + s *Service +} + +func NewManagementService(s *Service) *ManagementService { + rs := &ManagementService{s: s} + rs.AccountSummaries = NewManagementAccountSummariesService(s) + rs.AccountUserLinks = NewManagementAccountUserLinksService(s) + rs.Accounts = NewManagementAccountsService(s) + rs.ClientId = NewManagementClientIdService(s) + rs.CustomDataSources = NewManagementCustomDataSourcesService(s) + rs.CustomDimensions = NewManagementCustomDimensionsService(s) + rs.CustomMetrics = NewManagementCustomMetricsService(s) + rs.Experiments = NewManagementExperimentsService(s) + rs.Filters = NewManagementFiltersService(s) + rs.Goals = NewManagementGoalsService(s) + rs.ProfileFilterLinks = NewManagementProfileFilterLinksService(s) + rs.ProfileUserLinks = NewManagementProfileUserLinksService(s) + rs.Profiles = NewManagementProfilesService(s) + rs.RemarketingAudience = NewManagementRemarketingAudienceService(s) + rs.Segments = NewManagementSegmentsService(s) + rs.UnsampledReports = NewManagementUnsampledReportsService(s) + rs.Uploads = NewManagementUploadsService(s) + rs.WebPropertyAdWordsLinks = NewManagementWebPropertyAdWordsLinksService(s) + rs.Webproperties = NewManagementWebpropertiesService(s) + rs.WebpropertyUserLinks = NewManagementWebpropertyUserLinksService(s) + return rs +} + +type ManagementService struct { + s *Service + + AccountSummaries *ManagementAccountSummariesService + + AccountUserLinks *ManagementAccountUserLinksService + + Accounts *ManagementAccountsService + + ClientId *ManagementClientIdService + + CustomDataSources *ManagementCustomDataSourcesService + + CustomDimensions *ManagementCustomDimensionsService + + CustomMetrics *ManagementCustomMetricsService + + Experiments *ManagementExperimentsService + + Filters *ManagementFiltersService + + Goals *ManagementGoalsService + + ProfileFilterLinks *ManagementProfileFilterLinksService + + ProfileUserLinks *ManagementProfileUserLinksService + + Profiles *ManagementProfilesService + + RemarketingAudience *ManagementRemarketingAudienceService + + Segments *ManagementSegmentsService + + UnsampledReports *ManagementUnsampledReportsService + + Uploads *ManagementUploadsService + + WebPropertyAdWordsLinks *ManagementWebPropertyAdWordsLinksService + + Webproperties *ManagementWebpropertiesService + + WebpropertyUserLinks *ManagementWebpropertyUserLinksService +} + +func NewManagementAccountSummariesService(s *Service) *ManagementAccountSummariesService { + rs := &ManagementAccountSummariesService{s: s} + return rs +} + +type ManagementAccountSummariesService struct { + s *Service +} + +func NewManagementAccountUserLinksService(s *Service) *ManagementAccountUserLinksService { + rs := &ManagementAccountUserLinksService{s: s} + return rs +} + +type ManagementAccountUserLinksService struct { + s *Service +} + +func NewManagementAccountsService(s *Service) *ManagementAccountsService { + rs := &ManagementAccountsService{s: s} + return rs +} + +type ManagementAccountsService struct { + s *Service +} + +func NewManagementClientIdService(s *Service) *ManagementClientIdService { + rs := &ManagementClientIdService{s: s} + return rs +} + +type ManagementClientIdService struct { + s *Service +} + +func NewManagementCustomDataSourcesService(s *Service) *ManagementCustomDataSourcesService { + rs := &ManagementCustomDataSourcesService{s: s} + return rs +} + +type ManagementCustomDataSourcesService struct { + s *Service +} + +func NewManagementCustomDimensionsService(s *Service) *ManagementCustomDimensionsService { + rs := &ManagementCustomDimensionsService{s: s} + return rs +} + +type ManagementCustomDimensionsService struct { + s *Service +} + +func NewManagementCustomMetricsService(s *Service) *ManagementCustomMetricsService { + rs := &ManagementCustomMetricsService{s: s} + return rs +} + +type ManagementCustomMetricsService struct { + s *Service +} + +func NewManagementExperimentsService(s *Service) *ManagementExperimentsService { + rs := &ManagementExperimentsService{s: s} + return rs +} + +type ManagementExperimentsService struct { + s *Service +} + +func NewManagementFiltersService(s *Service) *ManagementFiltersService { + rs := &ManagementFiltersService{s: s} + return rs +} + +type ManagementFiltersService struct { + s *Service +} + +func NewManagementGoalsService(s *Service) *ManagementGoalsService { + rs := &ManagementGoalsService{s: s} + return rs +} + +type ManagementGoalsService struct { + s *Service +} + +func NewManagementProfileFilterLinksService(s *Service) *ManagementProfileFilterLinksService { + rs := &ManagementProfileFilterLinksService{s: s} + return rs +} + +type ManagementProfileFilterLinksService struct { + s *Service +} + +func NewManagementProfileUserLinksService(s *Service) *ManagementProfileUserLinksService { + rs := &ManagementProfileUserLinksService{s: s} + return rs +} + +type ManagementProfileUserLinksService struct { + s *Service +} + +func NewManagementProfilesService(s *Service) *ManagementProfilesService { + rs := &ManagementProfilesService{s: s} + return rs +} + +type ManagementProfilesService struct { + s *Service +} + +func NewManagementRemarketingAudienceService(s *Service) *ManagementRemarketingAudienceService { + rs := &ManagementRemarketingAudienceService{s: s} + return rs +} + +type ManagementRemarketingAudienceService struct { + s *Service +} + +func NewManagementSegmentsService(s *Service) *ManagementSegmentsService { + rs := &ManagementSegmentsService{s: s} + return rs +} + +type ManagementSegmentsService struct { + s *Service +} + +func NewManagementUnsampledReportsService(s *Service) *ManagementUnsampledReportsService { + rs := &ManagementUnsampledReportsService{s: s} + return rs +} + +type ManagementUnsampledReportsService struct { + s *Service +} + +func NewManagementUploadsService(s *Service) *ManagementUploadsService { + rs := &ManagementUploadsService{s: s} + return rs +} + +type ManagementUploadsService struct { + s *Service +} + +func NewManagementWebPropertyAdWordsLinksService(s *Service) *ManagementWebPropertyAdWordsLinksService { + rs := &ManagementWebPropertyAdWordsLinksService{s: s} + return rs +} + +type ManagementWebPropertyAdWordsLinksService struct { + s *Service +} + +func NewManagementWebpropertiesService(s *Service) *ManagementWebpropertiesService { + rs := &ManagementWebpropertiesService{s: s} + return rs +} + +type ManagementWebpropertiesService struct { + s *Service +} + +func NewManagementWebpropertyUserLinksService(s *Service) *ManagementWebpropertyUserLinksService { + rs := &ManagementWebpropertyUserLinksService{s: s} + return rs +} + +type ManagementWebpropertyUserLinksService struct { + s *Service +} + +func NewMetadataService(s *Service) *MetadataService { + rs := &MetadataService{s: s} + rs.Columns = NewMetadataColumnsService(s) + return rs +} + +type MetadataService struct { + s *Service + + Columns *MetadataColumnsService +} + +func NewMetadataColumnsService(s *Service) *MetadataColumnsService { + rs := &MetadataColumnsService{s: s} + return rs +} + +type MetadataColumnsService struct { + s *Service +} + +func NewProvisioningService(s *Service) *ProvisioningService { + rs := &ProvisioningService{s: s} + return rs +} + +type ProvisioningService struct { + s *Service +} + +func NewUserDeletionService(s *Service) *UserDeletionService { + rs := &UserDeletionService{s: s} + rs.UserDeletionRequest = NewUserDeletionUserDeletionRequestService(s) + return rs +} + +type UserDeletionService struct { + s *Service + + UserDeletionRequest *UserDeletionUserDeletionRequestService +} + +func NewUserDeletionUserDeletionRequestService(s *Service) *UserDeletionUserDeletionRequestService { + rs := &UserDeletionUserDeletionRequestService{s: s} + return rs +} + +type UserDeletionUserDeletionRequestService struct { + s *Service +} + +// Account: JSON template for Analytics account entry. +type Account struct { + // ChildLink: Child link for an account entry. Points to the list of web + // properties for this account. + ChildLink *AccountChildLink `json:"childLink,omitempty"` + + // Created: Time the account was created. + Created string `json:"created,omitempty"` + + // Id: Account ID. + Id string `json:"id,omitempty"` + + // Kind: Resource type for Analytics account. + Kind string `json:"kind,omitempty"` + + // Name: Account name. + Name string `json:"name,omitempty"` + + // Permissions: Permissions the user has for this account. + Permissions *AccountPermissions `json:"permissions,omitempty"` + + // SelfLink: Link for this account. + SelfLink string `json:"selfLink,omitempty"` + + // Starred: Indicates whether this account is starred or not. + Starred bool `json:"starred,omitempty"` + + // Updated: Time the account was last modified. + Updated string `json:"updated,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ChildLink") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ChildLink") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Account) MarshalJSON() ([]byte, error) { + type NoMethod Account + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AccountChildLink: Child link for an account entry. Points to the list +// of web properties for this account. +type AccountChildLink struct { + // Href: Link to the list of web properties for this account. + Href string `json:"href,omitempty"` + + // Type: Type of the child link. Its value is "analytics#webproperties". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AccountChildLink) MarshalJSON() ([]byte, error) { + type NoMethod AccountChildLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AccountPermissions: Permissions the user has for this account. +type AccountPermissions struct { + // Effective: All the permissions that the user has for this account. + // These include any implied permissions (e.g., EDIT implies VIEW). + Effective []string `json:"effective,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Effective") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Effective") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AccountPermissions) MarshalJSON() ([]byte, error) { + type NoMethod AccountPermissions + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AccountRef: JSON template for a linked account. +type AccountRef struct { + // Href: Link for this account. + Href string `json:"href,omitempty"` + + // Id: Account ID. + Id string `json:"id,omitempty"` + + // Kind: Analytics account reference. + Kind string `json:"kind,omitempty"` + + // Name: Account name. + Name string `json:"name,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AccountRef) MarshalJSON() ([]byte, error) { + type NoMethod AccountRef + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AccountSummaries: An AccountSummary collection lists a summary of +// accounts, properties and views (profiles) to which the user has +// access. Each resource in the collection corresponds to a single +// AccountSummary. +type AccountSummaries struct { + // Items: A list of AccountSummaries. + Items []*AccountSummary `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this AccountSummary collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this AccountSummary + // collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AccountSummaries) MarshalJSON() ([]byte, error) { + type NoMethod AccountSummaries + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AccountSummary: JSON template for an Analytics AccountSummary. An +// AccountSummary is a lightweight tree comprised of +// properties/profiles. +type AccountSummary struct { + // Id: Account ID. + Id string `json:"id,omitempty"` + + // Kind: Resource type for Analytics AccountSummary. + Kind string `json:"kind,omitempty"` + + // Name: Account name. + Name string `json:"name,omitempty"` + + // Starred: Indicates whether this account is starred or not. + Starred bool `json:"starred,omitempty"` + + // WebProperties: List of web properties under this account. + WebProperties []*WebPropertySummary `json:"webProperties,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AccountSummary) MarshalJSON() ([]byte, error) { + type NoMethod AccountSummary + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AccountTicket: JSON template for an Analytics account ticket. The +// account ticket consists of the ticket ID and the basic information +// for the account, property and profile. +type AccountTicket struct { + // Account: Account for this ticket. + Account *Account `json:"account,omitempty"` + + // Id: Account ticket ID used to access the account ticket. + Id string `json:"id,omitempty"` + + // Kind: Resource type for account ticket. + Kind string `json:"kind,omitempty"` + + // Profile: View (Profile) for the account. + Profile *Profile `json:"profile,omitempty"` + + // RedirectUri: Redirect URI where the user will be sent after accepting + // Terms of Service. Must be configured in APIs console as a callback + // URL. + RedirectUri string `json:"redirectUri,omitempty"` + + // Webproperty: Web property for the account. + Webproperty *Webproperty `json:"webproperty,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Account") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Account") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AccountTicket) MarshalJSON() ([]byte, error) { + type NoMethod AccountTicket + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AccountTreeRequest: JSON template for an Analytics account tree +// requests. The account tree request is used in the provisioning api to +// create an account, property, and view (profile). It contains the +// basic information required to make these fields. +type AccountTreeRequest struct { + AccountName string `json:"accountName,omitempty"` + + // Kind: Resource type for account ticket. + Kind string `json:"kind,omitempty"` + + ProfileName string `json:"profileName,omitempty"` + + Timezone string `json:"timezone,omitempty"` + + WebpropertyName string `json:"webpropertyName,omitempty"` + + WebsiteUrl string `json:"websiteUrl,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AccountName") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountName") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AccountTreeRequest) MarshalJSON() ([]byte, error) { + type NoMethod AccountTreeRequest + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AccountTreeResponse: JSON template for an Analytics account tree +// response. The account tree response is used in the provisioning api +// to return the result of creating an account, property, and view +// (profile). +type AccountTreeResponse struct { + // Account: The account created. + Account *Account `json:"account,omitempty"` + + // Kind: Resource type for account ticket. + Kind string `json:"kind,omitempty"` + + // Profile: View (Profile) for the account. + Profile *Profile `json:"profile,omitempty"` + + // Webproperty: Web property for the account. + Webproperty *Webproperty `json:"webproperty,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Account") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Account") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AccountTreeResponse) MarshalJSON() ([]byte, error) { + type NoMethod AccountTreeResponse + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Accounts: An account collection provides a list of Analytics accounts +// to which a user has access. The account collection is the entry point +// to all management information. Each resource in the collection +// corresponds to a single Analytics account. +type Accounts struct { + // Items: A list of accounts. + Items []*Account `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of entries the response can contain, + // regardless of the actual number of entries returned. Its value ranges + // from 1 to 1000 with a value of 1000 by default, or otherwise + // specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Next link for this account collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Previous link for this account collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the entries, which is 1 by default + // or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Accounts) MarshalJSON() ([]byte, error) { + type NoMethod Accounts + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AdWordsAccount: JSON template for an Google Ads account. +type AdWordsAccount struct { + // AutoTaggingEnabled: True if auto-tagging is enabled on the Google Ads + // account. Read-only after the insert operation. + AutoTaggingEnabled bool `json:"autoTaggingEnabled,omitempty"` + + // CustomerId: Customer ID. This field is required when creating a + // Google Ads link. + CustomerId string `json:"customerId,omitempty"` + + // Kind: Resource type for Google Ads account. + Kind string `json:"kind,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AutoTaggingEnabled") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AutoTaggingEnabled") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *AdWordsAccount) MarshalJSON() ([]byte, error) { + type NoMethod AdWordsAccount + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AnalyticsDataimportDeleteUploadDataRequest: Request template for the +// delete upload data request. +type AnalyticsDataimportDeleteUploadDataRequest struct { + // CustomDataImportUids: A list of upload UIDs. + CustomDataImportUids []string `json:"customDataImportUids,omitempty"` + + // ForceSendFields is a list of field names (e.g. + // "CustomDataImportUids") to unconditionally include in API requests. + // By default, fields with empty values are omitted from API requests. + // However, any non-pointer, non-interface field appearing in + // ForceSendFields will be sent to the server regardless of whether the + // field is empty or not. This may be used to include empty fields in + // Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CustomDataImportUids") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *AnalyticsDataimportDeleteUploadDataRequest) MarshalJSON() ([]byte, error) { + type NoMethod AnalyticsDataimportDeleteUploadDataRequest + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Column: JSON template for a metadata column. +type Column struct { + // Attributes: Map of attribute name and value for this column. + Attributes map[string]string `json:"attributes,omitempty"` + + // Id: Column id. + Id string `json:"id,omitempty"` + + // Kind: Resource type for Analytics column. + Kind string `json:"kind,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Attributes") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Attributes") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Column) MarshalJSON() ([]byte, error) { + type NoMethod Column + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Columns: Lists columns (dimensions and metrics) for a particular +// report type. +type Columns struct { + // AttributeNames: List of attributes names returned by columns. + AttributeNames []string `json:"attributeNames,omitempty"` + + // Etag: Etag of collection. This etag can be compared with the last + // response etag to check if response has changed. + Etag string `json:"etag,omitempty"` + + // Items: List of columns for a report type. + Items []*Column `json:"items,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // TotalResults: Total number of columns returned in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AttributeNames") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AttributeNames") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *Columns) MarshalJSON() ([]byte, error) { + type NoMethod Columns + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CustomDataSource: JSON template for an Analytics custom data source. +type CustomDataSource struct { + // AccountId: Account ID to which this custom data source belongs. + AccountId string `json:"accountId,omitempty"` + + ChildLink *CustomDataSourceChildLink `json:"childLink,omitempty"` + + // Created: Time this custom data source was created. + Created string `json:"created,omitempty"` + + // Description: Description of custom data source. + Description string `json:"description,omitempty"` + + // Id: Custom data source ID. + Id string `json:"id,omitempty"` + + ImportBehavior string `json:"importBehavior,omitempty"` + + // Kind: Resource type for Analytics custom data source. + Kind string `json:"kind,omitempty"` + + // Name: Name of this custom data source. + Name string `json:"name,omitempty"` + + // ParentLink: Parent link for this custom data source. Points to the + // web property to which this custom data source belongs. + ParentLink *CustomDataSourceParentLink `json:"parentLink,omitempty"` + + // ProfilesLinked: IDs of views (profiles) linked to the custom data + // source. + ProfilesLinked []string `json:"profilesLinked,omitempty"` + + // Schema: Collection of schema headers of the custom data source. + Schema []string `json:"schema,omitempty"` + + // SelfLink: Link for this Analytics custom data source. + SelfLink string `json:"selfLink,omitempty"` + + // Type: Type of the custom data source. + Type string `json:"type,omitempty"` + + // Updated: Time this custom data source was last modified. + Updated string `json:"updated,omitempty"` + + // UploadType: Upload type of the custom data source. + UploadType string `json:"uploadType,omitempty"` + + // WebPropertyId: Web property ID of the form UA-XXXXX-YY to which this + // custom data source belongs. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CustomDataSource) MarshalJSON() ([]byte, error) { + type NoMethod CustomDataSource + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type CustomDataSourceChildLink struct { + // Href: Link to the list of daily uploads for this custom data source. + // Link to the list of uploads for this custom data source. + Href string `json:"href,omitempty"` + + // Type: Value is "analytics#dailyUploads". Value is + // "analytics#uploads". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CustomDataSourceChildLink) MarshalJSON() ([]byte, error) { + type NoMethod CustomDataSourceChildLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CustomDataSourceParentLink: Parent link for this custom data source. +// Points to the web property to which this custom data source belongs. +type CustomDataSourceParentLink struct { + // Href: Link to the web property to which this custom data source + // belongs. + Href string `json:"href,omitempty"` + + // Type: Value is "analytics#webproperty". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CustomDataSourceParentLink) MarshalJSON() ([]byte, error) { + type NoMethod CustomDataSourceParentLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CustomDataSources: Lists Analytics custom data sources to which the +// user has access. Each resource in the collection corresponds to a +// single Analytics custom data source. +type CustomDataSources struct { + // Items: Collection of custom data sources. + Items []*CustomDataSource `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this custom data source collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this custom data source + // collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CustomDataSources) MarshalJSON() ([]byte, error) { + type NoMethod CustomDataSources + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CustomDimension: JSON template for Analytics Custom Dimension. +type CustomDimension struct { + // AccountId: Account ID. + AccountId string `json:"accountId,omitempty"` + + // Active: Boolean indicating whether the custom dimension is active. + Active bool `json:"active,omitempty"` + + // Created: Time the custom dimension was created. + Created string `json:"created,omitempty"` + + // Id: Custom dimension ID. + Id string `json:"id,omitempty"` + + // Index: Index of the custom dimension. + Index int64 `json:"index,omitempty"` + + // Kind: Kind value for a custom dimension. Set to + // "analytics#customDimension". It is a read-only field. + Kind string `json:"kind,omitempty"` + + // Name: Name of the custom dimension. + Name string `json:"name,omitempty"` + + // ParentLink: Parent link for the custom dimension. Points to the + // property to which the custom dimension belongs. + ParentLink *CustomDimensionParentLink `json:"parentLink,omitempty"` + + // Scope: Scope of the custom dimension: HIT, SESSION, USER or PRODUCT. + Scope string `json:"scope,omitempty"` + + // SelfLink: Link for the custom dimension + SelfLink string `json:"selfLink,omitempty"` + + // Updated: Time the custom dimension was last modified. + Updated string `json:"updated,omitempty"` + + // WebPropertyId: Property ID. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CustomDimension) MarshalJSON() ([]byte, error) { + type NoMethod CustomDimension + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CustomDimensionParentLink: Parent link for the custom dimension. +// Points to the property to which the custom dimension belongs. +type CustomDimensionParentLink struct { + // Href: Link to the property to which the custom dimension belongs. + Href string `json:"href,omitempty"` + + // Type: Type of the parent link. Set to "analytics#webproperty". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CustomDimensionParentLink) MarshalJSON() ([]byte, error) { + type NoMethod CustomDimensionParentLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CustomDimensions: A custom dimension collection lists Analytics +// custom dimensions to which the user has access. Each resource in the +// collection corresponds to a single Analytics custom dimension. +type CustomDimensions struct { + // Items: Collection of custom dimensions. + Items []*CustomDimension `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this custom dimension collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this custom dimension + // collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CustomDimensions) MarshalJSON() ([]byte, error) { + type NoMethod CustomDimensions + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CustomMetric: JSON template for Analytics Custom Metric. +type CustomMetric struct { + // AccountId: Account ID. + AccountId string `json:"accountId,omitempty"` + + // Active: Boolean indicating whether the custom metric is active. + Active bool `json:"active,omitempty"` + + // Created: Time the custom metric was created. + Created string `json:"created,omitempty"` + + // Id: Custom metric ID. + Id string `json:"id,omitempty"` + + // Index: Index of the custom metric. + Index int64 `json:"index,omitempty"` + + // Kind: Kind value for a custom metric. Set to + // "analytics#customMetric". It is a read-only field. + Kind string `json:"kind,omitempty"` + + // MaxValue: Max value of custom metric. + MaxValue string `json:"max_value,omitempty"` + + // MinValue: Min value of custom metric. + MinValue string `json:"min_value,omitempty"` + + // Name: Name of the custom metric. + Name string `json:"name,omitempty"` + + // ParentLink: Parent link for the custom metric. Points to the property + // to which the custom metric belongs. + ParentLink *CustomMetricParentLink `json:"parentLink,omitempty"` + + // Scope: Scope of the custom metric: HIT or PRODUCT. + Scope string `json:"scope,omitempty"` + + // SelfLink: Link for the custom metric + SelfLink string `json:"selfLink,omitempty"` + + // Type: Data type of custom metric. + Type string `json:"type,omitempty"` + + // Updated: Time the custom metric was last modified. + Updated string `json:"updated,omitempty"` + + // WebPropertyId: Property ID. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CustomMetric) MarshalJSON() ([]byte, error) { + type NoMethod CustomMetric + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CustomMetricParentLink: Parent link for the custom metric. Points to +// the property to which the custom metric belongs. +type CustomMetricParentLink struct { + // Href: Link to the property to which the custom metric belongs. + Href string `json:"href,omitempty"` + + // Type: Type of the parent link. Set to "analytics#webproperty". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CustomMetricParentLink) MarshalJSON() ([]byte, error) { + type NoMethod CustomMetricParentLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CustomMetrics: A custom metric collection lists Analytics custom +// metrics to which the user has access. Each resource in the collection +// corresponds to a single Analytics custom metric. +type CustomMetrics struct { + // Items: Collection of custom metrics. + Items []*CustomMetric `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this custom metric collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this custom metric + // collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CustomMetrics) MarshalJSON() ([]byte, error) { + type NoMethod CustomMetrics + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// EntityAdWordsLink: JSON template for Analytics Entity Google Ads +// Link. +type EntityAdWordsLink struct { + // AdWordsAccounts: A list of Google Ads client accounts. These cannot + // be MCC accounts. This field is required when creating a Google Ads + // link. It cannot be empty. + AdWordsAccounts []*AdWordsAccount `json:"adWordsAccounts,omitempty"` + + // Entity: Web property being linked. + Entity *EntityAdWordsLinkEntity `json:"entity,omitempty"` + + // Id: Entity Google Ads link ID + Id string `json:"id,omitempty"` + + // Kind: Resource type for entity Google Ads link. + Kind string `json:"kind,omitempty"` + + // Name: Name of the link. This field is required when creating a Google + // Ads link. + Name string `json:"name,omitempty"` + + // ProfileIds: IDs of linked Views (Profiles) represented as strings. + ProfileIds []string `json:"profileIds,omitempty"` + + // SelfLink: URL link for this Google Analytics - Google Ads link. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AdWordsAccounts") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AdWordsAccounts") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *EntityAdWordsLink) MarshalJSON() ([]byte, error) { + type NoMethod EntityAdWordsLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// EntityAdWordsLinkEntity: Web property being linked. +type EntityAdWordsLinkEntity struct { + WebPropertyRef *WebPropertyRef `json:"webPropertyRef,omitempty"` + + // ForceSendFields is a list of field names (e.g. "WebPropertyRef") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "WebPropertyRef") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *EntityAdWordsLinkEntity) MarshalJSON() ([]byte, error) { + type NoMethod EntityAdWordsLinkEntity + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// EntityAdWordsLinks: An entity Google Ads link collection provides a +// list of GA-Google Ads links Each resource in this collection +// corresponds to a single link. +type EntityAdWordsLinks struct { + // Items: A list of entity Google Ads links. + Items []*EntityAdWordsLink `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of entries the response can contain, + // regardless of the actual number of entries returned. Its value ranges + // from 1 to 1000 with a value of 1000 by default, or otherwise + // specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Next link for this Google Ads link collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Previous link for this Google Ads link collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the entries, which is 1 by default + // or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *EntityAdWordsLinks) MarshalJSON() ([]byte, error) { + type NoMethod EntityAdWordsLinks + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// EntityUserLink: JSON template for an Analytics Entity-User Link. +// Returns permissions that a user has for an entity. +type EntityUserLink struct { + // Entity: Entity for this link. It can be an account, a web property, + // or a view (profile). + Entity *EntityUserLinkEntity `json:"entity,omitempty"` + + // Id: Entity user link ID + Id string `json:"id,omitempty"` + + // Kind: Resource type for entity user link. + Kind string `json:"kind,omitempty"` + + // Permissions: Permissions the user has for this entity. + Permissions *EntityUserLinkPermissions `json:"permissions,omitempty"` + + // SelfLink: Self link for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // UserRef: User reference. + UserRef *UserRef `json:"userRef,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Entity") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Entity") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *EntityUserLink) MarshalJSON() ([]byte, error) { + type NoMethod EntityUserLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// EntityUserLinkEntity: Entity for this link. It can be an account, a +// web property, or a view (profile). +type EntityUserLinkEntity struct { + // AccountRef: Account for this link. + AccountRef *AccountRef `json:"accountRef,omitempty"` + + // ProfileRef: View (Profile) for this link. + ProfileRef *ProfileRef `json:"profileRef,omitempty"` + + // WebPropertyRef: Web property for this link. + WebPropertyRef *WebPropertyRef `json:"webPropertyRef,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AccountRef") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountRef") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *EntityUserLinkEntity) MarshalJSON() ([]byte, error) { + type NoMethod EntityUserLinkEntity + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// EntityUserLinkPermissions: Permissions the user has for this entity. +type EntityUserLinkPermissions struct { + // Effective: Effective permissions represent all the permissions that a + // user has for this entity. These include any implied permissions + // (e.g., EDIT implies VIEW) or inherited permissions from the parent + // entity. Effective permissions are read-only. + Effective []string `json:"effective,omitempty"` + + // Local: Permissions that a user has been assigned at this very level. + // Does not include any implied or inherited permissions. Local + // permissions are modifiable. + Local []string `json:"local,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Effective") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Effective") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *EntityUserLinkPermissions) MarshalJSON() ([]byte, error) { + type NoMethod EntityUserLinkPermissions + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// EntityUserLinks: An entity user link collection provides a list of +// Analytics ACL links Each resource in this collection corresponds to a +// single link. +type EntityUserLinks struct { + // Items: A list of entity user links. + Items []*EntityUserLink `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of entries the response can contain, + // regardless of the actual number of entries returned. Its value ranges + // from 1 to 1000 with a value of 1000 by default, or otherwise + // specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Next link for this account collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Previous link for this account collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the entries, which is 1 by default + // or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *EntityUserLinks) MarshalJSON() ([]byte, error) { + type NoMethod EntityUserLinks + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Experiment: JSON template for Analytics experiment resource. +type Experiment struct { + // AccountId: Account ID to which this experiment belongs. This field is + // read-only. + AccountId string `json:"accountId,omitempty"` + + // Created: Time the experiment was created. This field is read-only. + Created string `json:"created,omitempty"` + + // Description: Notes about this experiment. + Description string `json:"description,omitempty"` + + // EditableInGaUi: If true, the end user will be able to edit the + // experiment via the Google Analytics user interface. + EditableInGaUi bool `json:"editableInGaUi,omitempty"` + + // EndTime: The ending time of the experiment (the time the status + // changed from RUNNING to ENDED). This field is present only if the + // experiment has ended. This field is read-only. + EndTime string `json:"endTime,omitempty"` + + // EqualWeighting: Boolean specifying whether to distribute traffic + // evenly across all variations. If the value is False, content + // experiments follows the default behavior of adjusting traffic + // dynamically based on variation performance. Optional -- defaults to + // False. This field may not be changed for an experiment whose status + // is ENDED. + EqualWeighting bool `json:"equalWeighting,omitempty"` + + // Id: Experiment ID. Required for patch and update. Disallowed for + // create. + Id string `json:"id,omitempty"` + + // InternalWebPropertyId: Internal ID for the web property to which this + // experiment belongs. This field is read-only. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // Kind: Resource type for an Analytics experiment. This field is + // read-only. + Kind string `json:"kind,omitempty"` + + // MinimumExperimentLengthInDays: An integer number in [3, 90]. + // Specifies the minimum length of the experiment. Can be changed for a + // running experiment. This field may not be changed for an experiments + // whose status is ENDED. + MinimumExperimentLengthInDays int64 `json:"minimumExperimentLengthInDays,omitempty"` + + // Name: Experiment name. This field may not be changed for an + // experiment whose status is ENDED. This field is required when + // creating an experiment. + Name string `json:"name,omitempty"` + + // ObjectiveMetric: The metric that the experiment is optimizing. Valid + // values: "ga:goal(n)Completions", "ga:adsenseAdsClicks", + // "ga:adsenseAdsViewed", "ga:adsenseRevenue", "ga:bounces", + // "ga:pageviews", "ga:sessionDuration", "ga:transactions", + // "ga:transactionRevenue". This field is required if status is + // "RUNNING" and servingFramework is one of "REDIRECT" or "API". + ObjectiveMetric string `json:"objectiveMetric,omitempty"` + + // OptimizationType: Whether the objectiveMetric should be minimized or + // maximized. Possible values: "MAXIMUM", "MINIMUM". Optional--defaults + // to "MAXIMUM". Cannot be specified without objectiveMetric. Cannot be + // modified when status is "RUNNING" or "ENDED". + OptimizationType string `json:"optimizationType,omitempty"` + + // ParentLink: Parent link for an experiment. Points to the view + // (profile) to which this experiment belongs. + ParentLink *ExperimentParentLink `json:"parentLink,omitempty"` + + // ProfileId: View (Profile) ID to which this experiment belongs. This + // field is read-only. + ProfileId string `json:"profileId,omitempty"` + + // ReasonExperimentEnded: Why the experiment ended. Possible values: + // "STOPPED_BY_USER", "WINNER_FOUND", "EXPERIMENT_EXPIRED", + // "ENDED_WITH_NO_WINNER", "GOAL_OBJECTIVE_CHANGED". + // "ENDED_WITH_NO_WINNER" means that the experiment didn't expire but no + // winner was projected to be found. If the experiment status is changed + // via the API to ENDED this field is set to STOPPED_BY_USER. This field + // is read-only. + ReasonExperimentEnded string `json:"reasonExperimentEnded,omitempty"` + + // RewriteVariationUrlsAsOriginal: Boolean specifying whether variations + // URLS are rewritten to match those of the original. This field may not + // be changed for an experiments whose status is ENDED. + RewriteVariationUrlsAsOriginal bool `json:"rewriteVariationUrlsAsOriginal,omitempty"` + + // SelfLink: Link for this experiment. This field is read-only. + SelfLink string `json:"selfLink,omitempty"` + + // ServingFramework: The framework used to serve the experiment + // variations and evaluate the results. One of: + // - REDIRECT: Google Analytics redirects traffic to different variation + // pages, reports the chosen variation and evaluates the results. + // - API: Google Analytics chooses and reports the variation to serve + // and evaluates the results; the caller is responsible for serving the + // selected variation. + // - EXTERNAL: The variations will be served externally and the chosen + // variation reported to Google Analytics. The caller is responsible for + // serving the selected variation and evaluating the results. + ServingFramework string `json:"servingFramework,omitempty"` + + // Snippet: The snippet of code to include on the control page(s). This + // field is read-only. + Snippet string `json:"snippet,omitempty"` + + // StartTime: The starting time of the experiment (the time the status + // changed from READY_TO_RUN to RUNNING). This field is present only if + // the experiment has started. This field is read-only. + StartTime string `json:"startTime,omitempty"` + + // Status: Experiment status. Possible values: "DRAFT", "READY_TO_RUN", + // "RUNNING", "ENDED". Experiments can be created in the "DRAFT", + // "READY_TO_RUN" or "RUNNING" state. This field is required when + // creating an experiment. + Status string `json:"status,omitempty"` + + // TrafficCoverage: A floating-point number in (0, 1]. Specifies the + // fraction of the traffic that participates in the experiment. Can be + // changed for a running experiment. This field may not be changed for + // an experiments whose status is ENDED. + TrafficCoverage float64 `json:"trafficCoverage,omitempty"` + + // Updated: Time the experiment was last modified. This field is + // read-only. + Updated string `json:"updated,omitempty"` + + // Variations: Array of variations. The first variation in the array is + // the original. The number of variations may not change once an + // experiment is in the RUNNING state. At least two variations are + // required before status can be set to RUNNING. + Variations []*ExperimentVariations `json:"variations,omitempty"` + + // WebPropertyId: Web property ID to which this experiment belongs. The + // web property ID is of the form UA-XXXXX-YY. This field is read-only. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // WinnerConfidenceLevel: A floating-point number in (0, 1). Specifies + // the necessary confidence level to choose a winner. This field may not + // be changed for an experiments whose status is ENDED. + WinnerConfidenceLevel float64 `json:"winnerConfidenceLevel,omitempty"` + + // WinnerFound: Boolean specifying whether a winner has been found for + // this experiment. This field is read-only. + WinnerFound bool `json:"winnerFound,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Experiment) MarshalJSON() ([]byte, error) { + type NoMethod Experiment + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +func (s *Experiment) UnmarshalJSON(data []byte) error { + type NoMethod Experiment + var s1 struct { + TrafficCoverage gensupport.JSONFloat64 `json:"trafficCoverage"` + WinnerConfidenceLevel gensupport.JSONFloat64 `json:"winnerConfidenceLevel"` + *NoMethod + } + s1.NoMethod = (*NoMethod)(s) + if err := json.Unmarshal(data, &s1); err != nil { + return err + } + s.TrafficCoverage = float64(s1.TrafficCoverage) + s.WinnerConfidenceLevel = float64(s1.WinnerConfidenceLevel) + return nil +} + +// ExperimentParentLink: Parent link for an experiment. Points to the +// view (profile) to which this experiment belongs. +type ExperimentParentLink struct { + // Href: Link to the view (profile) to which this experiment belongs. + // This field is read-only. + Href string `json:"href,omitempty"` + + // Type: Value is "analytics#profile". This field is read-only. + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ExperimentParentLink) MarshalJSON() ([]byte, error) { + type NoMethod ExperimentParentLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type ExperimentVariations struct { + // Name: The name of the variation. This field is required when creating + // an experiment. This field may not be changed for an experiment whose + // status is ENDED. + Name string `json:"name,omitempty"` + + // Status: Status of the variation. Possible values: "ACTIVE", + // "INACTIVE". INACTIVE variations are not served. This field may not be + // changed for an experiment whose status is ENDED. + Status string `json:"status,omitempty"` + + // Url: The URL of the variation. This field may not be changed for an + // experiment whose status is RUNNING or ENDED. + Url string `json:"url,omitempty"` + + // Weight: Weight that this variation should receive. Only present if + // the experiment is running. This field is read-only. + Weight float64 `json:"weight,omitempty"` + + // Won: True if the experiment has ended and this variation performed + // (statistically) significantly better than the original. This field is + // read-only. + Won bool `json:"won,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Name") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Name") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ExperimentVariations) MarshalJSON() ([]byte, error) { + type NoMethod ExperimentVariations + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +func (s *ExperimentVariations) UnmarshalJSON(data []byte) error { + type NoMethod ExperimentVariations + var s1 struct { + Weight gensupport.JSONFloat64 `json:"weight"` + *NoMethod + } + s1.NoMethod = (*NoMethod)(s) + if err := json.Unmarshal(data, &s1); err != nil { + return err + } + s.Weight = float64(s1.Weight) + return nil +} + +// Experiments: An experiment collection lists Analytics experiments to +// which the user has access. Each view (profile) can have a set of +// experiments. Each resource in the Experiment collection corresponds +// to a single Analytics experiment. +type Experiments struct { + // Items: A list of experiments. + Items []*Experiment `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this experiment collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this experiment collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of resources in the result. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Experiments) MarshalJSON() ([]byte, error) { + type NoMethod Experiments + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Filter: JSON template for an Analytics account filter. +type Filter struct { + // AccountId: Account ID to which this filter belongs. + AccountId string `json:"accountId,omitempty"` + + // AdvancedDetails: Details for the filter of the type ADVANCED. + AdvancedDetails *FilterAdvancedDetails `json:"advancedDetails,omitempty"` + + // Created: Time this filter was created. + Created string `json:"created,omitempty"` + + // ExcludeDetails: Details for the filter of the type EXCLUDE. + ExcludeDetails *FilterExpression `json:"excludeDetails,omitempty"` + + // Id: Filter ID. + Id string `json:"id,omitempty"` + + // IncludeDetails: Details for the filter of the type INCLUDE. + IncludeDetails *FilterExpression `json:"includeDetails,omitempty"` + + // Kind: Resource type for Analytics filter. + Kind string `json:"kind,omitempty"` + + // LowercaseDetails: Details for the filter of the type LOWER. + LowercaseDetails *FilterLowercaseDetails `json:"lowercaseDetails,omitempty"` + + // Name: Name of this filter. + Name string `json:"name,omitempty"` + + // ParentLink: Parent link for this filter. Points to the account to + // which this filter belongs. + ParentLink *FilterParentLink `json:"parentLink,omitempty"` + + // SearchAndReplaceDetails: Details for the filter of the type + // SEARCH_AND_REPLACE. + SearchAndReplaceDetails *FilterSearchAndReplaceDetails `json:"searchAndReplaceDetails,omitempty"` + + // SelfLink: Link for this filter. + SelfLink string `json:"selfLink,omitempty"` + + // Type: Type of this filter. Possible values are INCLUDE, EXCLUDE, + // LOWERCASE, UPPERCASE, SEARCH_AND_REPLACE and ADVANCED. + Type string `json:"type,omitempty"` + + // Updated: Time this filter was last modified. + Updated string `json:"updated,omitempty"` + + // UppercaseDetails: Details for the filter of the type UPPER. + UppercaseDetails *FilterUppercaseDetails `json:"uppercaseDetails,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Filter) MarshalJSON() ([]byte, error) { + type NoMethod Filter + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// FilterAdvancedDetails: Details for the filter of the type ADVANCED. +type FilterAdvancedDetails struct { + // CaseSensitive: Indicates if the filter expressions are case + // sensitive. + CaseSensitive bool `json:"caseSensitive,omitempty"` + + // ExtractA: Expression to extract from field A. + ExtractA string `json:"extractA,omitempty"` + + // ExtractB: Expression to extract from field B. + ExtractB string `json:"extractB,omitempty"` + + // FieldA: Field A. + FieldA string `json:"fieldA,omitempty"` + + // FieldAIndex: The Index of the custom dimension. Required if field is + // a CUSTOM_DIMENSION. + FieldAIndex int64 `json:"fieldAIndex,omitempty"` + + // FieldARequired: Indicates if field A is required to match. + FieldARequired bool `json:"fieldARequired,omitempty"` + + // FieldB: Field B. + FieldB string `json:"fieldB,omitempty"` + + // FieldBIndex: The Index of the custom dimension. Required if field is + // a CUSTOM_DIMENSION. + FieldBIndex int64 `json:"fieldBIndex,omitempty"` + + // FieldBRequired: Indicates if field B is required to match. + FieldBRequired bool `json:"fieldBRequired,omitempty"` + + // OutputConstructor: Expression used to construct the output value. + OutputConstructor string `json:"outputConstructor,omitempty"` + + // OutputToField: Output field. + OutputToField string `json:"outputToField,omitempty"` + + // OutputToFieldIndex: The Index of the custom dimension. Required if + // field is a CUSTOM_DIMENSION. + OutputToFieldIndex int64 `json:"outputToFieldIndex,omitempty"` + + // OverrideOutputField: Indicates if the existing value of the output + // field, if any, should be overridden by the output expression. + OverrideOutputField bool `json:"overrideOutputField,omitempty"` + + // ForceSendFields is a list of field names (e.g. "CaseSensitive") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CaseSensitive") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *FilterAdvancedDetails) MarshalJSON() ([]byte, error) { + type NoMethod FilterAdvancedDetails + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// FilterLowercaseDetails: Details for the filter of the type LOWER. +type FilterLowercaseDetails struct { + // Field: Field to use in the filter. + Field string `json:"field,omitempty"` + + // FieldIndex: The Index of the custom dimension. Required if field is a + // CUSTOM_DIMENSION. + FieldIndex int64 `json:"fieldIndex,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Field") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Field") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *FilterLowercaseDetails) MarshalJSON() ([]byte, error) { + type NoMethod FilterLowercaseDetails + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// FilterParentLink: Parent link for this filter. Points to the account +// to which this filter belongs. +type FilterParentLink struct { + // Href: Link to the account to which this filter belongs. + Href string `json:"href,omitempty"` + + // Type: Value is "analytics#account". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *FilterParentLink) MarshalJSON() ([]byte, error) { + type NoMethod FilterParentLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// FilterSearchAndReplaceDetails: Details for the filter of the type +// SEARCH_AND_REPLACE. +type FilterSearchAndReplaceDetails struct { + // CaseSensitive: Determines if the filter is case sensitive. + CaseSensitive bool `json:"caseSensitive,omitempty"` + + // Field: Field to use in the filter. + Field string `json:"field,omitempty"` + + // FieldIndex: The Index of the custom dimension. Required if field is a + // CUSTOM_DIMENSION. + FieldIndex int64 `json:"fieldIndex,omitempty"` + + // ReplaceString: Term to replace the search term with. + ReplaceString string `json:"replaceString,omitempty"` + + // SearchString: Term to search. + SearchString string `json:"searchString,omitempty"` + + // ForceSendFields is a list of field names (e.g. "CaseSensitive") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CaseSensitive") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *FilterSearchAndReplaceDetails) MarshalJSON() ([]byte, error) { + type NoMethod FilterSearchAndReplaceDetails + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// FilterUppercaseDetails: Details for the filter of the type UPPER. +type FilterUppercaseDetails struct { + // Field: Field to use in the filter. + Field string `json:"field,omitempty"` + + // FieldIndex: The Index of the custom dimension. Required if field is a + // CUSTOM_DIMENSION. + FieldIndex int64 `json:"fieldIndex,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Field") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Field") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *FilterUppercaseDetails) MarshalJSON() ([]byte, error) { + type NoMethod FilterUppercaseDetails + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// FilterExpression: JSON template for an Analytics filter expression. +type FilterExpression struct { + // CaseSensitive: Determines if the filter is case sensitive. + CaseSensitive bool `json:"caseSensitive,omitempty"` + + // ExpressionValue: Filter expression value + ExpressionValue string `json:"expressionValue,omitempty"` + + // Field: Field to filter. Possible values: + // - Content and Traffic + // - PAGE_REQUEST_URI, + // - PAGE_HOSTNAME, + // - PAGE_TITLE, + // - REFERRAL, + // - COST_DATA_URI (Campaign target URL), + // - HIT_TYPE, + // - INTERNAL_SEARCH_TERM, + // - INTERNAL_SEARCH_TYPE, + // - SOURCE_PROPERTY_TRACKING_ID, + // - Campaign or AdGroup + // - CAMPAIGN_SOURCE, + // - CAMPAIGN_MEDIUM, + // - CAMPAIGN_NAME, + // - CAMPAIGN_AD_GROUP, + // - CAMPAIGN_TERM, + // - CAMPAIGN_CONTENT, + // - CAMPAIGN_CODE, + // - CAMPAIGN_REFERRAL_PATH, + // - E-Commerce + // - TRANSACTION_COUNTRY, + // - TRANSACTION_REGION, + // - TRANSACTION_CITY, + // - TRANSACTION_AFFILIATION (Store or order location), + // - ITEM_NAME, + // - ITEM_CODE, + // - ITEM_VARIATION, + // - TRANSACTION_ID, + // - TRANSACTION_CURRENCY_CODE, + // - PRODUCT_ACTION_TYPE, + // - Audience/Users + // - BROWSER, + // - BROWSER_VERSION, + // - BROWSER_SIZE, + // - PLATFORM, + // - PLATFORM_VERSION, + // - LANGUAGE, + // - SCREEN_RESOLUTION, + // - SCREEN_COLORS, + // - JAVA_ENABLED (Boolean Field), + // - FLASH_VERSION, + // - GEO_SPEED (Connection speed), + // - VISITOR_TYPE, + // - GEO_ORGANIZATION (ISP organization), + // - GEO_DOMAIN, + // - GEO_IP_ADDRESS, + // - GEO_IP_VERSION, + // - Location + // - GEO_COUNTRY, + // - GEO_REGION, + // - GEO_CITY, + // - Event + // - EVENT_CATEGORY, + // - EVENT_ACTION, + // - EVENT_LABEL, + // - Other + // - CUSTOM_FIELD_1, + // - CUSTOM_FIELD_2, + // - USER_DEFINED_VALUE, + // - Application + // - APP_ID, + // - APP_INSTALLER_ID, + // - APP_NAME, + // - APP_VERSION, + // - SCREEN, + // - IS_APP (Boolean Field), + // - IS_FATAL_EXCEPTION (Boolean Field), + // - EXCEPTION_DESCRIPTION, + // - Mobile device + // - IS_MOBILE (Boolean Field, Deprecated. Use DEVICE_CATEGORY=mobile), + // + // - IS_TABLET (Boolean Field, Deprecated. Use DEVICE_CATEGORY=tablet), + // + // - DEVICE_CATEGORY, + // - MOBILE_HAS_QWERTY_KEYBOARD (Boolean Field), + // - MOBILE_HAS_NFC_SUPPORT (Boolean Field), + // - MOBILE_HAS_CELLULAR_RADIO (Boolean Field), + // - MOBILE_HAS_WIFI_SUPPORT (Boolean Field), + // - MOBILE_BRAND_NAME, + // - MOBILE_MODEL_NAME, + // - MOBILE_MARKETING_NAME, + // - MOBILE_POINTING_METHOD, + // - Social + // - SOCIAL_NETWORK, + // - SOCIAL_ACTION, + // - SOCIAL_ACTION_TARGET, + // - Custom dimension + // - CUSTOM_DIMENSION (See accompanying field index), + Field string `json:"field,omitempty"` + + // FieldIndex: The Index of the custom dimension. Set only if the field + // is a is CUSTOM_DIMENSION. + FieldIndex int64 `json:"fieldIndex,omitempty"` + + // Kind: Kind value for filter expression + Kind string `json:"kind,omitempty"` + + // MatchType: Match type for this filter. Possible values are + // BEGINS_WITH, EQUAL, ENDS_WITH, CONTAINS, or MATCHES. GEO_DOMAIN, + // GEO_IP_ADDRESS, PAGE_REQUEST_URI, or PAGE_HOSTNAME filters can use + // any match type; all other filters must use MATCHES. + MatchType string `json:"matchType,omitempty"` + + // ForceSendFields is a list of field names (e.g. "CaseSensitive") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CaseSensitive") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *FilterExpression) MarshalJSON() ([]byte, error) { + type NoMethod FilterExpression + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// FilterRef: JSON template for a profile filter link. +type FilterRef struct { + // AccountId: Account ID to which this filter belongs. + AccountId string `json:"accountId,omitempty"` + + // Href: Link for this filter. + Href string `json:"href,omitempty"` + + // Id: Filter ID. + Id string `json:"id,omitempty"` + + // Kind: Kind value for filter reference. + Kind string `json:"kind,omitempty"` + + // Name: Name of this filter. + Name string `json:"name,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *FilterRef) MarshalJSON() ([]byte, error) { + type NoMethod FilterRef + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Filters: A filter collection lists filters created by users in an +// Analytics account. Each resource in the collection corresponds to a +// filter. +type Filters struct { + // Items: A list of filters. + Items []*Filter `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1,000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this filter collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this filter collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Filters) MarshalJSON() ([]byte, error) { + type NoMethod Filters + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// GaData: Analytics data for a given view (profile). +type GaData struct { + // ColumnHeaders: Column headers that list dimension names followed by + // the metric names. The order of dimensions and metrics is same as + // specified in the request. + ColumnHeaders []*GaDataColumnHeaders `json:"columnHeaders,omitempty"` + + // ContainsSampledData: Determines if Analytics data contains samples. + ContainsSampledData bool `json:"containsSampledData,omitempty"` + + // DataLastRefreshed: The last refreshed time in seconds for Analytics + // data. + DataLastRefreshed int64 `json:"dataLastRefreshed,omitempty,string"` + + DataTable *GaDataDataTable `json:"dataTable,omitempty"` + + // Id: Unique ID for this data response. + Id string `json:"id,omitempty"` + + // ItemsPerPage: The maximum number of rows the response can contain, + // regardless of the actual number of rows returned. Its value ranges + // from 1 to 10,000 with a value of 1000 by default, or otherwise + // specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Resource type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this Analytics data query. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this Analytics data query. + PreviousLink string `json:"previousLink,omitempty"` + + // ProfileInfo: Information for the view (profile), for which the + // Analytics data was requested. + ProfileInfo *GaDataProfileInfo `json:"profileInfo,omitempty"` + + // Query: Analytics data request query parameters. + Query *GaDataQuery `json:"query,omitempty"` + + // Rows: Analytics data rows, where each row contains a list of + // dimension values followed by the metric values. The order of + // dimensions and metrics is same as specified in the request. + Rows [][]string `json:"rows,omitempty"` + + // SampleSize: The number of samples used to calculate the result. + SampleSize int64 `json:"sampleSize,omitempty,string"` + + // SampleSpace: Total size of the sample space from which the samples + // were selected. + SampleSpace int64 `json:"sampleSpace,omitempty,string"` + + // SelfLink: Link to this page. + SelfLink string `json:"selfLink,omitempty"` + + // TotalResults: The total number of rows for the query, regardless of + // the number of rows in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // TotalsForAllResults: Total values for the requested metrics over all + // the results, not just the results returned in this response. The + // order of the metric totals is same as the metric order specified in + // the request. + TotalsForAllResults map[string]string `json:"totalsForAllResults,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "ColumnHeaders") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ColumnHeaders") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GaData) MarshalJSON() ([]byte, error) { + type NoMethod GaData + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type GaDataColumnHeaders struct { + // ColumnType: Column Type. Either DIMENSION or METRIC. + ColumnType string `json:"columnType,omitempty"` + + // DataType: Data type. Dimension column headers have only STRING as the + // data type. Metric column headers have data types for metric values + // such as INTEGER, DOUBLE, CURRENCY etc. + DataType string `json:"dataType,omitempty"` + + // Name: Column name. + Name string `json:"name,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ColumnType") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ColumnType") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GaDataColumnHeaders) MarshalJSON() ([]byte, error) { + type NoMethod GaDataColumnHeaders + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type GaDataDataTable struct { + Cols []*GaDataDataTableCols `json:"cols,omitempty"` + + Rows []*GaDataDataTableRows `json:"rows,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Cols") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Cols") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GaDataDataTable) MarshalJSON() ([]byte, error) { + type NoMethod GaDataDataTable + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type GaDataDataTableCols struct { + Id string `json:"id,omitempty"` + + Label string `json:"label,omitempty"` + + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GaDataDataTableCols) MarshalJSON() ([]byte, error) { + type NoMethod GaDataDataTableCols + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type GaDataDataTableRows struct { + C []*GaDataDataTableRowsC `json:"c,omitempty"` + + // ForceSendFields is a list of field names (e.g. "C") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "C") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GaDataDataTableRows) MarshalJSON() ([]byte, error) { + type NoMethod GaDataDataTableRows + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type GaDataDataTableRowsC struct { + V string `json:"v,omitempty"` + + // ForceSendFields is a list of field names (e.g. "V") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "V") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GaDataDataTableRowsC) MarshalJSON() ([]byte, error) { + type NoMethod GaDataDataTableRowsC + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// GaDataProfileInfo: Information for the view (profile), for which the +// Analytics data was requested. +type GaDataProfileInfo struct { + // AccountId: Account ID to which this view (profile) belongs. + AccountId string `json:"accountId,omitempty"` + + // InternalWebPropertyId: Internal ID for the web property to which this + // view (profile) belongs. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // ProfileId: View (Profile) ID. + ProfileId string `json:"profileId,omitempty"` + + // ProfileName: View (Profile) name. + ProfileName string `json:"profileName,omitempty"` + + // TableId: Table ID for view (profile). + TableId string `json:"tableId,omitempty"` + + // WebPropertyId: Web Property ID to which this view (profile) belongs. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GaDataProfileInfo) MarshalJSON() ([]byte, error) { + type NoMethod GaDataProfileInfo + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// GaDataQuery: Analytics data request query parameters. +type GaDataQuery struct { + // Dimensions: List of analytics dimensions. + Dimensions string `json:"dimensions,omitempty"` + + // EndDate: End date. + EndDate string `json:"end-date,omitempty"` + + // Filters: Comma-separated list of dimension or metric filters. + Filters string `json:"filters,omitempty"` + + // Ids: Unique table ID. + Ids string `json:"ids,omitempty"` + + // MaxResults: Maximum results per page. + MaxResults int64 `json:"max-results,omitempty"` + + // Metrics: List of analytics metrics. + Metrics []string `json:"metrics,omitempty"` + + // SamplingLevel: Desired sampling level + SamplingLevel string `json:"samplingLevel,omitempty"` + + // Segment: Analytics advanced segment. + Segment string `json:"segment,omitempty"` + + // Sort: List of dimensions or metrics based on which Analytics data is + // sorted. + Sort []string `json:"sort,omitempty"` + + // StartDate: Start date. + StartDate string `json:"start-date,omitempty"` + + // StartIndex: Start index. + StartIndex int64 `json:"start-index,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Dimensions") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Dimensions") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GaDataQuery) MarshalJSON() ([]byte, error) { + type NoMethod GaDataQuery + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Goal: JSON template for Analytics goal resource. +type Goal struct { + // AccountId: Account ID to which this goal belongs. + AccountId string `json:"accountId,omitempty"` + + // Active: Determines whether this goal is active. + Active bool `json:"active,omitempty"` + + // Created: Time this goal was created. + Created string `json:"created,omitempty"` + + // EventDetails: Details for the goal of the type EVENT. + EventDetails *GoalEventDetails `json:"eventDetails,omitempty"` + + // Id: Goal ID. + Id string `json:"id,omitempty"` + + // InternalWebPropertyId: Internal ID for the web property to which this + // goal belongs. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // Kind: Resource type for an Analytics goal. + Kind string `json:"kind,omitempty"` + + // Name: Goal name. + Name string `json:"name,omitempty"` + + // ParentLink: Parent link for a goal. Points to the view (profile) to + // which this goal belongs. + ParentLink *GoalParentLink `json:"parentLink,omitempty"` + + // ProfileId: View (Profile) ID to which this goal belongs. + ProfileId string `json:"profileId,omitempty"` + + // SelfLink: Link for this goal. + SelfLink string `json:"selfLink,omitempty"` + + // Type: Goal type. Possible values are URL_DESTINATION, + // VISIT_TIME_ON_SITE, VISIT_NUM_PAGES, AND EVENT. + Type string `json:"type,omitempty"` + + // Updated: Time this goal was last modified. + Updated string `json:"updated,omitempty"` + + // UrlDestinationDetails: Details for the goal of the type + // URL_DESTINATION. + UrlDestinationDetails *GoalUrlDestinationDetails `json:"urlDestinationDetails,omitempty"` + + // Value: Goal value. + Value float64 `json:"value,omitempty"` + + // VisitNumPagesDetails: Details for the goal of the type + // VISIT_NUM_PAGES. + VisitNumPagesDetails *GoalVisitNumPagesDetails `json:"visitNumPagesDetails,omitempty"` + + // VisitTimeOnSiteDetails: Details for the goal of the type + // VISIT_TIME_ON_SITE. + VisitTimeOnSiteDetails *GoalVisitTimeOnSiteDetails `json:"visitTimeOnSiteDetails,omitempty"` + + // WebPropertyId: Web property ID to which this goal belongs. The web + // property ID is of the form UA-XXXXX-YY. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Goal) MarshalJSON() ([]byte, error) { + type NoMethod Goal + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +func (s *Goal) UnmarshalJSON(data []byte) error { + type NoMethod Goal + var s1 struct { + Value gensupport.JSONFloat64 `json:"value"` + *NoMethod + } + s1.NoMethod = (*NoMethod)(s) + if err := json.Unmarshal(data, &s1); err != nil { + return err + } + s.Value = float64(s1.Value) + return nil +} + +// GoalEventDetails: Details for the goal of the type EVENT. +type GoalEventDetails struct { + // EventConditions: List of event conditions. + EventConditions []*GoalEventDetailsEventConditions `json:"eventConditions,omitempty"` + + // UseEventValue: Determines if the event value should be used as the + // value for this goal. + UseEventValue bool `json:"useEventValue,omitempty"` + + // ForceSendFields is a list of field names (e.g. "EventConditions") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "EventConditions") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *GoalEventDetails) MarshalJSON() ([]byte, error) { + type NoMethod GoalEventDetails + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type GoalEventDetailsEventConditions struct { + // ComparisonType: Type of comparison. Possible values are LESS_THAN, + // GREATER_THAN or EQUAL. + ComparisonType string `json:"comparisonType,omitempty"` + + // ComparisonValue: Value used for this comparison. + ComparisonValue int64 `json:"comparisonValue,omitempty,string"` + + // Expression: Expression used for this match. + Expression string `json:"expression,omitempty"` + + // MatchType: Type of the match to be performed. Possible values are + // REGEXP, BEGINS_WITH, or EXACT. + MatchType string `json:"matchType,omitempty"` + + // Type: Type of this event condition. Possible values are CATEGORY, + // ACTION, LABEL, or VALUE. + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ComparisonType") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ComparisonType") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *GoalEventDetailsEventConditions) MarshalJSON() ([]byte, error) { + type NoMethod GoalEventDetailsEventConditions + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// GoalParentLink: Parent link for a goal. Points to the view (profile) +// to which this goal belongs. +type GoalParentLink struct { + // Href: Link to the view (profile) to which this goal belongs. + Href string `json:"href,omitempty"` + + // Type: Value is "analytics#profile". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GoalParentLink) MarshalJSON() ([]byte, error) { + type NoMethod GoalParentLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// GoalUrlDestinationDetails: Details for the goal of the type +// URL_DESTINATION. +type GoalUrlDestinationDetails struct { + // CaseSensitive: Determines if the goal URL must exactly match the + // capitalization of visited URLs. + CaseSensitive bool `json:"caseSensitive,omitempty"` + + // FirstStepRequired: Determines if the first step in this goal is + // required. + FirstStepRequired bool `json:"firstStepRequired,omitempty"` + + // MatchType: Match type for the goal URL. Possible values are HEAD, + // EXACT, or REGEX. + MatchType string `json:"matchType,omitempty"` + + // Steps: List of steps configured for this goal funnel. + Steps []*GoalUrlDestinationDetailsSteps `json:"steps,omitempty"` + + // Url: URL for this goal. + Url string `json:"url,omitempty"` + + // ForceSendFields is a list of field names (e.g. "CaseSensitive") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CaseSensitive") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GoalUrlDestinationDetails) MarshalJSON() ([]byte, error) { + type NoMethod GoalUrlDestinationDetails + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type GoalUrlDestinationDetailsSteps struct { + // Name: Step name. + Name string `json:"name,omitempty"` + + // Number: Step number. + Number int64 `json:"number,omitempty"` + + // Url: URL for this step. + Url string `json:"url,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Name") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Name") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GoalUrlDestinationDetailsSteps) MarshalJSON() ([]byte, error) { + type NoMethod GoalUrlDestinationDetailsSteps + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// GoalVisitNumPagesDetails: Details for the goal of the type +// VISIT_NUM_PAGES. +type GoalVisitNumPagesDetails struct { + // ComparisonType: Type of comparison. Possible values are LESS_THAN, + // GREATER_THAN, or EQUAL. + ComparisonType string `json:"comparisonType,omitempty"` + + // ComparisonValue: Value used for this comparison. + ComparisonValue int64 `json:"comparisonValue,omitempty,string"` + + // ForceSendFields is a list of field names (e.g. "ComparisonType") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ComparisonType") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *GoalVisitNumPagesDetails) MarshalJSON() ([]byte, error) { + type NoMethod GoalVisitNumPagesDetails + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// GoalVisitTimeOnSiteDetails: Details for the goal of the type +// VISIT_TIME_ON_SITE. +type GoalVisitTimeOnSiteDetails struct { + // ComparisonType: Type of comparison. Possible values are LESS_THAN or + // GREATER_THAN. + ComparisonType string `json:"comparisonType,omitempty"` + + // ComparisonValue: Value used for this comparison. + ComparisonValue int64 `json:"comparisonValue,omitempty,string"` + + // ForceSendFields is a list of field names (e.g. "ComparisonType") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ComparisonType") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *GoalVisitTimeOnSiteDetails) MarshalJSON() ([]byte, error) { + type NoMethod GoalVisitTimeOnSiteDetails + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Goals: A goal collection lists Analytics goals to which the user has +// access. Each view (profile) can have a set of goals. Each resource in +// the Goal collection corresponds to a single Analytics goal. +type Goals struct { + // Items: A list of goals. + Items []*Goal `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this goal collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this goal collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of resources in the result. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Goals) MarshalJSON() ([]byte, error) { + type NoMethod Goals + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// HashClientIdRequest: JSON template for a hash Client Id request +// resource. +type HashClientIdRequest struct { + ClientId string `json:"clientId,omitempty"` + + Kind string `json:"kind,omitempty"` + + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ClientId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ClientId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *HashClientIdRequest) MarshalJSON() ([]byte, error) { + type NoMethod HashClientIdRequest + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// HashClientIdResponse: JSON template for a hash Client Id response +// resource. +type HashClientIdResponse struct { + ClientId string `json:"clientId,omitempty"` + + HashedClientId string `json:"hashedClientId,omitempty"` + + Kind string `json:"kind,omitempty"` + + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "ClientId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ClientId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *HashClientIdResponse) MarshalJSON() ([]byte, error) { + type NoMethod HashClientIdResponse + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// IncludeConditions: JSON template for an Analytics Remarketing Include +// Conditions. +type IncludeConditions struct { + // DaysToLookBack: The look-back window lets you specify a time frame + // for evaluating the behavior that qualifies users for your audience. + // For example, if your filters include users from Central Asia, and + // Transactions Greater than 2, and you set the look-back window to 14 + // days, then any user from Central Asia whose cumulative transactions + // exceed 2 during the last 14 days is added to the audience. + DaysToLookBack int64 `json:"daysToLookBack,omitempty"` + + // IsSmartList: Boolean indicating whether this segment is a smart list. + // https://support.google.com/analytics/answer/4628577 + IsSmartList bool `json:"isSmartList,omitempty"` + + // Kind: Resource type for include conditions. + Kind string `json:"kind,omitempty"` + + // MembershipDurationDays: Number of days (in the range 1 to 540) a user + // remains in the audience. + MembershipDurationDays int64 `json:"membershipDurationDays,omitempty"` + + // Segment: The segment condition that will cause a user to be added to + // an audience. + Segment string `json:"segment,omitempty"` + + // ForceSendFields is a list of field names (e.g. "DaysToLookBack") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "DaysToLookBack") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *IncludeConditions) MarshalJSON() ([]byte, error) { + type NoMethod IncludeConditions + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// LinkedForeignAccount: JSON template for an Analytics Remarketing +// Audience Foreign Link. +type LinkedForeignAccount struct { + // AccountId: Account ID to which this linked foreign account belongs. + AccountId string `json:"accountId,omitempty"` + + // EligibleForSearch: Boolean indicating whether this is eligible for + // search. + EligibleForSearch bool `json:"eligibleForSearch,omitempty"` + + // Id: Entity ad account link ID. + Id string `json:"id,omitempty"` + + // InternalWebPropertyId: Internal ID for the web property to which this + // linked foreign account belongs. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // Kind: Resource type for linked foreign account. + Kind string `json:"kind,omitempty"` + + // LinkedAccountId: The foreign account ID. For example the an Google + // Ads `linkedAccountId` has the following format XXX-XXX-XXXX. + LinkedAccountId string `json:"linkedAccountId,omitempty"` + + // RemarketingAudienceId: Remarketing audience ID to which this linked + // foreign account belongs. + RemarketingAudienceId string `json:"remarketingAudienceId,omitempty"` + + // Status: The status of this foreign account link. + Status string `json:"status,omitempty"` + + // Type: The type of the foreign account. For example, `ADWORDS_LINKS`, + // `DBM_LINKS`, `MCC_LINKS` or `OPTIMIZE`. + Type string `json:"type,omitempty"` + + // WebPropertyId: Web property ID of the form UA-XXXXX-YY to which this + // linked foreign account belongs. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *LinkedForeignAccount) MarshalJSON() ([]byte, error) { + type NoMethod LinkedForeignAccount + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// McfData: Multi-Channel Funnels data for a given view (profile). +type McfData struct { + // ColumnHeaders: Column headers that list dimension names followed by + // the metric names. The order of dimensions and metrics is same as + // specified in the request. + ColumnHeaders []*McfDataColumnHeaders `json:"columnHeaders,omitempty"` + + // ContainsSampledData: Determines if the Analytics data contains + // sampled data. + ContainsSampledData bool `json:"containsSampledData,omitempty"` + + // Id: Unique ID for this data response. + Id string `json:"id,omitempty"` + + // ItemsPerPage: The maximum number of rows the response can contain, + // regardless of the actual number of rows returned. Its value ranges + // from 1 to 10,000 with a value of 1000 by default, or otherwise + // specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Resource type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this Analytics data query. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this Analytics data query. + PreviousLink string `json:"previousLink,omitempty"` + + // ProfileInfo: Information for the view (profile), for which the + // Analytics data was requested. + ProfileInfo *McfDataProfileInfo `json:"profileInfo,omitempty"` + + // Query: Analytics data request query parameters. + Query *McfDataQuery `json:"query,omitempty"` + + // Rows: Analytics data rows, where each row contains a list of + // dimension values followed by the metric values. The order of + // dimensions and metrics is same as specified in the request. + Rows [][]*McfDataRowsItem `json:"rows,omitempty"` + + // SampleSize: The number of samples used to calculate the result. + SampleSize int64 `json:"sampleSize,omitempty,string"` + + // SampleSpace: Total size of the sample space from which the samples + // were selected. + SampleSpace int64 `json:"sampleSpace,omitempty,string"` + + // SelfLink: Link to this page. + SelfLink string `json:"selfLink,omitempty"` + + // TotalResults: The total number of rows for the query, regardless of + // the number of rows in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // TotalsForAllResults: Total values for the requested metrics over all + // the results, not just the results returned in this response. The + // order of the metric totals is same as the metric order specified in + // the request. + TotalsForAllResults map[string]string `json:"totalsForAllResults,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "ColumnHeaders") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ColumnHeaders") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *McfData) MarshalJSON() ([]byte, error) { + type NoMethod McfData + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type McfDataColumnHeaders struct { + // ColumnType: Column Type. Either DIMENSION or METRIC. + ColumnType string `json:"columnType,omitempty"` + + // DataType: Data type. Dimension and metric values data types such as + // INTEGER, DOUBLE, CURRENCY, MCF_SEQUENCE etc. + DataType string `json:"dataType,omitempty"` + + // Name: Column name. + Name string `json:"name,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ColumnType") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ColumnType") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *McfDataColumnHeaders) MarshalJSON() ([]byte, error) { + type NoMethod McfDataColumnHeaders + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// McfDataProfileInfo: Information for the view (profile), for which the +// Analytics data was requested. +type McfDataProfileInfo struct { + // AccountId: Account ID to which this view (profile) belongs. + AccountId string `json:"accountId,omitempty"` + + // InternalWebPropertyId: Internal ID for the web property to which this + // view (profile) belongs. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // ProfileId: View (Profile) ID. + ProfileId string `json:"profileId,omitempty"` + + // ProfileName: View (Profile) name. + ProfileName string `json:"profileName,omitempty"` + + // TableId: Table ID for view (profile). + TableId string `json:"tableId,omitempty"` + + // WebPropertyId: Web Property ID to which this view (profile) belongs. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *McfDataProfileInfo) MarshalJSON() ([]byte, error) { + type NoMethod McfDataProfileInfo + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// McfDataQuery: Analytics data request query parameters. +type McfDataQuery struct { + // Dimensions: List of analytics dimensions. + Dimensions string `json:"dimensions,omitempty"` + + // EndDate: End date. + EndDate string `json:"end-date,omitempty"` + + // Filters: Comma-separated list of dimension or metric filters. + Filters string `json:"filters,omitempty"` + + // Ids: Unique table ID. + Ids string `json:"ids,omitempty"` + + // MaxResults: Maximum results per page. + MaxResults int64 `json:"max-results,omitempty"` + + // Metrics: List of analytics metrics. + Metrics []string `json:"metrics,omitempty"` + + // SamplingLevel: Desired sampling level + SamplingLevel string `json:"samplingLevel,omitempty"` + + // Segment: Analytics advanced segment. + Segment string `json:"segment,omitempty"` + + // Sort: List of dimensions or metrics based on which Analytics data is + // sorted. + Sort []string `json:"sort,omitempty"` + + // StartDate: Start date. + StartDate string `json:"start-date,omitempty"` + + // StartIndex: Start index. + StartIndex int64 `json:"start-index,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Dimensions") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Dimensions") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *McfDataQuery) MarshalJSON() ([]byte, error) { + type NoMethod McfDataQuery + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// McfDataRowsItem: A union object representing a dimension or metric +// value. Only one of "primitiveValue" or "conversionPathValue" +// attribute will be populated. +type McfDataRowsItem struct { + // ConversionPathValue: A conversion path dimension value, containing a + // list of interactions with their attributes. + ConversionPathValue []*McfDataRowsItemConversionPathValue `json:"conversionPathValue,omitempty"` + + // PrimitiveValue: A primitive dimension value. A primitive metric + // value. + PrimitiveValue string `json:"primitiveValue,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ConversionPathValue") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ConversionPathValue") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *McfDataRowsItem) MarshalJSON() ([]byte, error) { + type NoMethod McfDataRowsItem + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type McfDataRowsItemConversionPathValue struct { + // InteractionType: Type of an interaction on conversion path. Such as + // CLICK, IMPRESSION etc. + InteractionType string `json:"interactionType,omitempty"` + + // NodeValue: Node value of an interaction on conversion path. Such as + // source, medium etc. + NodeValue string `json:"nodeValue,omitempty"` + + // ForceSendFields is a list of field names (e.g. "InteractionType") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "InteractionType") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *McfDataRowsItemConversionPathValue) MarshalJSON() ([]byte, error) { + type NoMethod McfDataRowsItemConversionPathValue + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Profile: JSON template for an Analytics view (profile). +type Profile struct { + // AccountId: Account ID to which this view (profile) belongs. + AccountId string `json:"accountId,omitempty"` + + // BotFilteringEnabled: Indicates whether bot filtering is enabled for + // this view (profile). + BotFilteringEnabled bool `json:"botFilteringEnabled,omitempty"` + + // ChildLink: Child link for this view (profile). Points to the list of + // goals for this view (profile). + ChildLink *ProfileChildLink `json:"childLink,omitempty"` + + // Created: Time this view (profile) was created. + Created string `json:"created,omitempty"` + + // Currency: The currency type associated with this view (profile), + // defaults to USD. The supported values are: + // USD, JPY, EUR, GBP, AUD, KRW, BRL, CNY, DKK, RUB, SEK, NOK, PLN, TRY, + // TWD, HKD, THB, IDR, ARS, MXN, VND, PHP, INR, CHF, CAD, CZK, NZD, HUF, + // BGN, LTL, ZAR, UAH, AED, BOB, CLP, COP, EGP, HRK, ILS, MAD, MYR, PEN, + // PKR, RON, RSD, SAR, SGD, VEF, LVL + Currency string `json:"currency,omitempty"` + + // DefaultPage: Default page for this view (profile). + DefaultPage string `json:"defaultPage,omitempty"` + + // ECommerceTracking: Indicates whether ecommerce tracking is enabled + // for this view (profile). + ECommerceTracking bool `json:"eCommerceTracking,omitempty"` + + // EnhancedECommerceTracking: Indicates whether enhanced ecommerce + // tracking is enabled for this view (profile). This property can only + // be enabled if ecommerce tracking is enabled. + EnhancedECommerceTracking bool `json:"enhancedECommerceTracking,omitempty"` + + // ExcludeQueryParameters: The query parameters that are excluded from + // this view (profile). + ExcludeQueryParameters string `json:"excludeQueryParameters,omitempty"` + + // Id: View (Profile) ID. + Id string `json:"id,omitempty"` + + // InternalWebPropertyId: Internal ID for the web property to which this + // view (profile) belongs. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // Kind: Resource type for Analytics view (profile). + Kind string `json:"kind,omitempty"` + + // Name: Name of this view (profile). + Name string `json:"name,omitempty"` + + // ParentLink: Parent link for this view (profile). Points to the web + // property to which this view (profile) belongs. + ParentLink *ProfileParentLink `json:"parentLink,omitempty"` + + // Permissions: Permissions the user has for this view (profile). + Permissions *ProfilePermissions `json:"permissions,omitempty"` + + // SelfLink: Link for this view (profile). + SelfLink string `json:"selfLink,omitempty"` + + // SiteSearchCategoryParameters: Site search category parameters for + // this view (profile). + SiteSearchCategoryParameters string `json:"siteSearchCategoryParameters,omitempty"` + + // SiteSearchQueryParameters: The site search query parameters for this + // view (profile). + SiteSearchQueryParameters string `json:"siteSearchQueryParameters,omitempty"` + + // Starred: Indicates whether this view (profile) is starred or not. + Starred bool `json:"starred,omitempty"` + + // StripSiteSearchCategoryParameters: Whether or not Analytics will + // strip search category parameters from the URLs in your reports. + StripSiteSearchCategoryParameters bool `json:"stripSiteSearchCategoryParameters,omitempty"` + + // StripSiteSearchQueryParameters: Whether or not Analytics will strip + // search query parameters from the URLs in your reports. + StripSiteSearchQueryParameters bool `json:"stripSiteSearchQueryParameters,omitempty"` + + // Timezone: Time zone for which this view (profile) has been + // configured. Time zones are identified by strings from the TZ + // database. + Timezone string `json:"timezone,omitempty"` + + // Type: View (Profile) type. Supported types: WEB or APP. + Type string `json:"type,omitempty"` + + // Updated: Time this view (profile) was last modified. + Updated string `json:"updated,omitempty"` + + // WebPropertyId: Web property ID of the form UA-XXXXX-YY to which this + // view (profile) belongs. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // WebsiteUrl: Website URL for this view (profile). + WebsiteUrl string `json:"websiteUrl,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Profile) MarshalJSON() ([]byte, error) { + type NoMethod Profile + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// ProfileChildLink: Child link for this view (profile). Points to the +// list of goals for this view (profile). +type ProfileChildLink struct { + // Href: Link to the list of goals for this view (profile). + Href string `json:"href,omitempty"` + + // Type: Value is "analytics#goals". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProfileChildLink) MarshalJSON() ([]byte, error) { + type NoMethod ProfileChildLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// ProfileParentLink: Parent link for this view (profile). Points to the +// web property to which this view (profile) belongs. +type ProfileParentLink struct { + // Href: Link to the web property to which this view (profile) belongs. + Href string `json:"href,omitempty"` + + // Type: Value is "analytics#webproperty". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProfileParentLink) MarshalJSON() ([]byte, error) { + type NoMethod ProfileParentLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// ProfilePermissions: Permissions the user has for this view (profile). +type ProfilePermissions struct { + // Effective: All the permissions that the user has for this view + // (profile). These include any implied permissions (e.g., EDIT implies + // VIEW) or inherited permissions from the parent web property. + Effective []string `json:"effective,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Effective") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Effective") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProfilePermissions) MarshalJSON() ([]byte, error) { + type NoMethod ProfilePermissions + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// ProfileFilterLink: JSON template for an Analytics profile filter +// link. +type ProfileFilterLink struct { + // FilterRef: Filter for this link. + FilterRef *FilterRef `json:"filterRef,omitempty"` + + // Id: Profile filter link ID. + Id string `json:"id,omitempty"` + + // Kind: Resource type for Analytics filter. + Kind string `json:"kind,omitempty"` + + // ProfileRef: View (Profile) for this link. + ProfileRef *ProfileRef `json:"profileRef,omitempty"` + + // Rank: The rank of this profile filter link relative to the other + // filters linked to the same profile. + // For readonly (i.e., list and get) operations, the rank always starts + // at 1. + // For write (i.e., create, update, or delete) operations, you may + // specify a value between 0 and 255 inclusively, [0, 255]. In order to + // insert a link at the end of the list, either don't specify a rank or + // set a rank to a number greater than the largest rank in the list. In + // order to insert a link to the beginning of the list specify a rank + // that is less than or equal to 1. The new link will move all existing + // filters with the same or lower rank down the list. After the link is + // inserted/updated/deleted all profile filter links will be renumbered + // starting at 1. + Rank int64 `json:"rank,omitempty"` + + // SelfLink: Link for this profile filter link. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "FilterRef") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "FilterRef") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProfileFilterLink) MarshalJSON() ([]byte, error) { + type NoMethod ProfileFilterLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// ProfileFilterLinks: A profile filter link collection lists profile +// filter links between profiles and filters. Each resource in the +// collection corresponds to a profile filter link. +type ProfileFilterLinks struct { + // Items: A list of profile filter links. + Items []*ProfileFilterLink `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1,000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this profile filter link collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this profile filter link + // collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProfileFilterLinks) MarshalJSON() ([]byte, error) { + type NoMethod ProfileFilterLinks + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// ProfileRef: JSON template for a linked view (profile). +type ProfileRef struct { + // AccountId: Account ID to which this view (profile) belongs. + AccountId string `json:"accountId,omitempty"` + + // Href: Link for this view (profile). + Href string `json:"href,omitempty"` + + // Id: View (Profile) ID. + Id string `json:"id,omitempty"` + + // InternalWebPropertyId: Internal ID for the web property to which this + // view (profile) belongs. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // Kind: Analytics view (profile) reference. + Kind string `json:"kind,omitempty"` + + // Name: Name of this view (profile). + Name string `json:"name,omitempty"` + + // WebPropertyId: Web property ID of the form UA-XXXXX-YY to which this + // view (profile) belongs. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProfileRef) MarshalJSON() ([]byte, error) { + type NoMethod ProfileRef + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// ProfileSummary: JSON template for an Analytics ProfileSummary. +// ProfileSummary returns basic information (i.e., summary) for a +// profile. +type ProfileSummary struct { + // Id: View (profile) ID. + Id string `json:"id,omitempty"` + + // Kind: Resource type for Analytics ProfileSummary. + Kind string `json:"kind,omitempty"` + + // Name: View (profile) name. + Name string `json:"name,omitempty"` + + // Starred: Indicates whether this view (profile) is starred or not. + Starred bool `json:"starred,omitempty"` + + // Type: View (Profile) type. Supported types: WEB or APP. + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProfileSummary) MarshalJSON() ([]byte, error) { + type NoMethod ProfileSummary + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Profiles: A view (profile) collection lists Analytics views +// (profiles) to which the user has access. Each resource in the +// collection corresponds to a single Analytics view (profile). +type Profiles struct { + // Items: A list of views (profiles). + Items []*Profile `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this view (profile) collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this view (profile) + // collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Profiles) MarshalJSON() ([]byte, error) { + type NoMethod Profiles + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// RealtimeData: Real time data for a given view (profile). +type RealtimeData struct { + // ColumnHeaders: Column headers that list dimension names followed by + // the metric names. The order of dimensions and metrics is same as + // specified in the request. + ColumnHeaders []*RealtimeDataColumnHeaders `json:"columnHeaders,omitempty"` + + // Id: Unique ID for this data response. + Id string `json:"id,omitempty"` + + // Kind: Resource type. + Kind string `json:"kind,omitempty"` + + // ProfileInfo: Information for the view (profile), for which the real + // time data was requested. + ProfileInfo *RealtimeDataProfileInfo `json:"profileInfo,omitempty"` + + // Query: Real time data request query parameters. + Query *RealtimeDataQuery `json:"query,omitempty"` + + // Rows: Real time data rows, where each row contains a list of + // dimension values followed by the metric values. The order of + // dimensions and metrics is same as specified in the request. + Rows [][]string `json:"rows,omitempty"` + + // SelfLink: Link to this page. + SelfLink string `json:"selfLink,omitempty"` + + // TotalResults: The total number of rows for the query, regardless of + // the number of rows in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // TotalsForAllResults: Total values for the requested metrics over all + // the results, not just the results returned in this response. The + // order of the metric totals is same as the metric order specified in + // the request. + TotalsForAllResults map[string]string `json:"totalsForAllResults,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "ColumnHeaders") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ColumnHeaders") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *RealtimeData) MarshalJSON() ([]byte, error) { + type NoMethod RealtimeData + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type RealtimeDataColumnHeaders struct { + // ColumnType: Column Type. Either DIMENSION or METRIC. + ColumnType string `json:"columnType,omitempty"` + + // DataType: Data type. Dimension column headers have only STRING as the + // data type. Metric column headers have data types for metric values + // such as INTEGER, DOUBLE, CURRENCY etc. + DataType string `json:"dataType,omitempty"` + + // Name: Column name. + Name string `json:"name,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ColumnType") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ColumnType") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *RealtimeDataColumnHeaders) MarshalJSON() ([]byte, error) { + type NoMethod RealtimeDataColumnHeaders + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// RealtimeDataProfileInfo: Information for the view (profile), for +// which the real time data was requested. +type RealtimeDataProfileInfo struct { + // AccountId: Account ID to which this view (profile) belongs. + AccountId string `json:"accountId,omitempty"` + + // InternalWebPropertyId: Internal ID for the web property to which this + // view (profile) belongs. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // ProfileId: View (Profile) ID. + ProfileId string `json:"profileId,omitempty"` + + // ProfileName: View (Profile) name. + ProfileName string `json:"profileName,omitempty"` + + // TableId: Table ID for view (profile). + TableId string `json:"tableId,omitempty"` + + // WebPropertyId: Web Property ID to which this view (profile) belongs. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *RealtimeDataProfileInfo) MarshalJSON() ([]byte, error) { + type NoMethod RealtimeDataProfileInfo + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// RealtimeDataQuery: Real time data request query parameters. +type RealtimeDataQuery struct { + // Dimensions: List of real time dimensions. + Dimensions string `json:"dimensions,omitempty"` + + // Filters: Comma-separated list of dimension or metric filters. + Filters string `json:"filters,omitempty"` + + // Ids: Unique table ID. + Ids string `json:"ids,omitempty"` + + // MaxResults: Maximum results per page. + MaxResults int64 `json:"max-results,omitempty"` + + // Metrics: List of real time metrics. + Metrics []string `json:"metrics,omitempty"` + + // Sort: List of dimensions or metrics based on which real time data is + // sorted. + Sort []string `json:"sort,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Dimensions") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Dimensions") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *RealtimeDataQuery) MarshalJSON() ([]byte, error) { + type NoMethod RealtimeDataQuery + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// RemarketingAudience: JSON template for an Analytics remarketing +// audience. +type RemarketingAudience struct { + // AccountId: Account ID to which this remarketing audience belongs. + AccountId string `json:"accountId,omitempty"` + + // AudienceDefinition: The simple audience definition that will cause a + // user to be added to an audience. + AudienceDefinition *RemarketingAudienceAudienceDefinition `json:"audienceDefinition,omitempty"` + + // AudienceType: The type of audience, either SIMPLE or STATE_BASED. + AudienceType string `json:"audienceType,omitempty"` + + // Created: Time this remarketing audience was created. + Created string `json:"created,omitempty"` + + // Description: The description of this remarketing audience. + Description string `json:"description,omitempty"` + + // Id: Remarketing Audience ID. + Id string `json:"id,omitempty"` + + // InternalWebPropertyId: Internal ID for the web property to which this + // remarketing audience belongs. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // LinkedAdAccounts: The linked ad accounts associated with this + // remarketing audience. A remarketing audience can have only one + // linkedAdAccount currently. + LinkedAdAccounts []*LinkedForeignAccount `json:"linkedAdAccounts,omitempty"` + + // LinkedViews: The views (profiles) that this remarketing audience is + // linked to. + LinkedViews []string `json:"linkedViews,omitempty"` + + // Name: The name of this remarketing audience. + Name string `json:"name,omitempty"` + + // StateBasedAudienceDefinition: A state based audience definition that + // will cause a user to be added or removed from an audience. + StateBasedAudienceDefinition *RemarketingAudienceStateBasedAudienceDefinition `json:"stateBasedAudienceDefinition,omitempty"` + + // Updated: Time this remarketing audience was last modified. + Updated string `json:"updated,omitempty"` + + // WebPropertyId: Web property ID of the form UA-XXXXX-YY to which this + // remarketing audience belongs. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *RemarketingAudience) MarshalJSON() ([]byte, error) { + type NoMethod RemarketingAudience + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// RemarketingAudienceAudienceDefinition: The simple audience definition +// that will cause a user to be added to an audience. +type RemarketingAudienceAudienceDefinition struct { + // IncludeConditions: Defines the conditions to include users to the + // audience. + IncludeConditions *IncludeConditions `json:"includeConditions,omitempty"` + + // ForceSendFields is a list of field names (e.g. "IncludeConditions") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "IncludeConditions") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *RemarketingAudienceAudienceDefinition) MarshalJSON() ([]byte, error) { + type NoMethod RemarketingAudienceAudienceDefinition + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// RemarketingAudienceStateBasedAudienceDefinition: A state based +// audience definition that will cause a user to be added or removed +// from an audience. +type RemarketingAudienceStateBasedAudienceDefinition struct { + // ExcludeConditions: Defines the conditions to exclude users from the + // audience. + ExcludeConditions *RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions `json:"excludeConditions,omitempty"` + + // IncludeConditions: Defines the conditions to include users to the + // audience. + IncludeConditions *IncludeConditions `json:"includeConditions,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ExcludeConditions") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ExcludeConditions") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *RemarketingAudienceStateBasedAudienceDefinition) MarshalJSON() ([]byte, error) { + type NoMethod RemarketingAudienceStateBasedAudienceDefinition + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions: +// Defines the conditions to exclude users from the audience. +type RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions struct { + // ExclusionDuration: Whether to make the exclusion TEMPORARY or + // PERMANENT. + ExclusionDuration string `json:"exclusionDuration,omitempty"` + + // Segment: The segment condition that will cause a user to be removed + // from an audience. + Segment string `json:"segment,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ExclusionDuration") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ExclusionDuration") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions) MarshalJSON() ([]byte, error) { + type NoMethod RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// RemarketingAudiences: A remarketing audience collection lists +// Analytics remarketing audiences to which the user has access. Each +// resource in the collection corresponds to a single Analytics +// remarketing audience. +type RemarketingAudiences struct { + // Items: A list of remarketing audiences. + Items []*RemarketingAudience `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this remarketing audience collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this view (profile) + // collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *RemarketingAudiences) MarshalJSON() ([]byte, error) { + type NoMethod RemarketingAudiences + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Segment: JSON template for an Analytics segment. +type Segment struct { + // Created: Time the segment was created. + Created string `json:"created,omitempty"` + + // Definition: Segment definition. + Definition string `json:"definition,omitempty"` + + // Id: Segment ID. + Id string `json:"id,omitempty"` + + // Kind: Resource type for Analytics segment. + Kind string `json:"kind,omitempty"` + + // Name: Segment name. + Name string `json:"name,omitempty"` + + // SegmentId: Segment ID. Can be used with the 'segment' parameter in + // Core Reporting API. + SegmentId string `json:"segmentId,omitempty"` + + // SelfLink: Link for this segment. + SelfLink string `json:"selfLink,omitempty"` + + // Type: Type for a segment. Possible values are "BUILT_IN" or "CUSTOM". + Type string `json:"type,omitempty"` + + // Updated: Time the segment was last modified. + Updated string `json:"updated,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Created") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Created") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Segment) MarshalJSON() ([]byte, error) { + type NoMethod Segment + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Segments: An segment collection lists Analytics segments that the +// user has access to. Each resource in the collection corresponds to a +// single Analytics segment. +type Segments struct { + // Items: A list of segments. + Items []*Segment `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type for segments. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this segment collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this segment collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Segments) MarshalJSON() ([]byte, error) { + type NoMethod Segments + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// UnsampledReport: JSON template for Analytics unsampled report +// resource. +type UnsampledReport struct { + // AccountId: Account ID to which this unsampled report belongs. + AccountId string `json:"accountId,omitempty"` + + // CloudStorageDownloadDetails: Download details for a file stored in + // Google Cloud Storage. + CloudStorageDownloadDetails *UnsampledReportCloudStorageDownloadDetails `json:"cloudStorageDownloadDetails,omitempty"` + + // Created: Time this unsampled report was created. + Created string `json:"created,omitempty"` + + // Dimensions: The dimensions for the unsampled report. + Dimensions string `json:"dimensions,omitempty"` + + // DownloadType: The type of download you need to use for the report + // data file. Possible values include `GOOGLE_DRIVE` and + // `GOOGLE_CLOUD_STORAGE`. If the value is `GOOGLE_DRIVE`, see the + // `driveDownloadDetails` field. If the value is `GOOGLE_CLOUD_STORAGE`, + // see the `cloudStorageDownloadDetails` field. + DownloadType string `json:"downloadType,omitempty"` + + // DriveDownloadDetails: Download details for a file stored in Google + // Drive. + DriveDownloadDetails *UnsampledReportDriveDownloadDetails `json:"driveDownloadDetails,omitempty"` + + // EndDate: The end date for the unsampled report. + EndDate string `json:"end-date,omitempty"` + + // Filters: The filters for the unsampled report. + Filters string `json:"filters,omitempty"` + + // Id: Unsampled report ID. + Id string `json:"id,omitempty"` + + // Kind: Resource type for an Analytics unsampled report. + Kind string `json:"kind,omitempty"` + + // Metrics: The metrics for the unsampled report. + Metrics string `json:"metrics,omitempty"` + + // ProfileId: View (Profile) ID to which this unsampled report belongs. + ProfileId string `json:"profileId,omitempty"` + + // Segment: The segment for the unsampled report. + Segment string `json:"segment,omitempty"` + + // SelfLink: Link for this unsampled report. + SelfLink string `json:"selfLink,omitempty"` + + // StartDate: The start date for the unsampled report. + StartDate string `json:"start-date,omitempty"` + + // Status: Status of this unsampled report. Possible values are PENDING, + // COMPLETED, or FAILED. + Status string `json:"status,omitempty"` + + // Title: Title of the unsampled report. + Title string `json:"title,omitempty"` + + // Updated: Time this unsampled report was last modified. + Updated string `json:"updated,omitempty"` + + // WebPropertyId: Web property ID to which this unsampled report + // belongs. The web property ID is of the form UA-XXXXX-YY. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *UnsampledReport) MarshalJSON() ([]byte, error) { + type NoMethod UnsampledReport + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// UnsampledReportCloudStorageDownloadDetails: Download details for a +// file stored in Google Cloud Storage. +type UnsampledReportCloudStorageDownloadDetails struct { + // BucketId: Id of the bucket the file object is stored in. + BucketId string `json:"bucketId,omitempty"` + + // ObjectId: Id of the file object containing the report data. + ObjectId string `json:"objectId,omitempty"` + + // ForceSendFields is a list of field names (e.g. "BucketId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "BucketId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *UnsampledReportCloudStorageDownloadDetails) MarshalJSON() ([]byte, error) { + type NoMethod UnsampledReportCloudStorageDownloadDetails + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// UnsampledReportDriveDownloadDetails: Download details for a file +// stored in Google Drive. +type UnsampledReportDriveDownloadDetails struct { + // DocumentId: Id of the document/file containing the report data. + DocumentId string `json:"documentId,omitempty"` + + // ForceSendFields is a list of field names (e.g. "DocumentId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "DocumentId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *UnsampledReportDriveDownloadDetails) MarshalJSON() ([]byte, error) { + type NoMethod UnsampledReportDriveDownloadDetails + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// UnsampledReports: An unsampled report collection lists Analytics +// unsampled reports to which the user has access. Each view (profile) +// can have a set of unsampled reports. Each resource in the unsampled +// report collection corresponds to a single Analytics unsampled report. +type UnsampledReports struct { + // Items: A list of unsampled reports. + Items []*UnsampledReport `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this unsampled report collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this unsampled report + // collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of resources in the result. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *UnsampledReports) MarshalJSON() ([]byte, error) { + type NoMethod UnsampledReports + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Upload: Metadata returned for an upload operation. +type Upload struct { + // AccountId: Account Id to which this upload belongs. + AccountId int64 `json:"accountId,omitempty,string"` + + // CustomDataSourceId: Custom data source Id to which this data import + // belongs. + CustomDataSourceId string `json:"customDataSourceId,omitempty"` + + // Errors: Data import errors collection. + Errors []string `json:"errors,omitempty"` + + // Id: A unique ID for this upload. + Id string `json:"id,omitempty"` + + // Kind: Resource type for Analytics upload. + Kind string `json:"kind,omitempty"` + + // Status: Upload status. Possible values: PENDING, COMPLETED, FAILED, + // DELETING, DELETED. + Status string `json:"status,omitempty"` + + // UploadTime: Time this file is uploaded. + UploadTime string `json:"uploadTime,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Upload) MarshalJSON() ([]byte, error) { + type NoMethod Upload + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Uploads: Upload collection lists Analytics uploads to which the user +// has access. Each custom data source can have a set of uploads. Each +// resource in the upload collection corresponds to a single Analytics +// data upload. +type Uploads struct { + // Items: A list of uploads. + Items []*Upload `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this upload collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this upload collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of resources in the result. + TotalResults int64 `json:"totalResults,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Uploads) MarshalJSON() ([]byte, error) { + type NoMethod Uploads + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// UserDeletionRequest: JSON template for a user deletion request +// resource. +type UserDeletionRequest struct { + // DeletionRequestTime: This marks the point in time for which all user + // data before should be deleted + DeletionRequestTime string `json:"deletionRequestTime,omitempty"` + + // FirebaseProjectId: Firebase Project Id + FirebaseProjectId string `json:"firebaseProjectId,omitempty"` + + // Id: User ID. + Id *UserDeletionRequestId `json:"id,omitempty"` + + // Kind: Value is "analytics#userDeletionRequest". + Kind string `json:"kind,omitempty"` + + // PropertyId: Property ID + PropertyId string `json:"propertyId,omitempty"` + + // WebPropertyId: Web property ID of the form UA-XXXXX-YY. + WebPropertyId string `json:"webPropertyId,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "DeletionRequestTime") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "DeletionRequestTime") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *UserDeletionRequest) MarshalJSON() ([]byte, error) { + type NoMethod UserDeletionRequest + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// UserDeletionRequestId: User ID. +type UserDeletionRequestId struct { + // Type: Type of user + Type string `json:"type,omitempty"` + + // UserId: The User's id + UserId string `json:"userId,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Type") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Type") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *UserDeletionRequestId) MarshalJSON() ([]byte, error) { + type NoMethod UserDeletionRequestId + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// UserRef: JSON template for a user reference. +type UserRef struct { + // Email: Email ID of this user. + Email string `json:"email,omitempty"` + + // Id: User ID. + Id string `json:"id,omitempty"` + + Kind string `json:"kind,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Email") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Email") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *UserRef) MarshalJSON() ([]byte, error) { + type NoMethod UserRef + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// WebPropertyRef: JSON template for a web property reference. +type WebPropertyRef struct { + // AccountId: Account ID to which this web property belongs. + AccountId string `json:"accountId,omitempty"` + + // Href: Link for this web property. + Href string `json:"href,omitempty"` + + // Id: Web property ID of the form UA-XXXXX-YY. + Id string `json:"id,omitempty"` + + // InternalWebPropertyId: Internal ID for this web property. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // Kind: Analytics web property reference. + Kind string `json:"kind,omitempty"` + + // Name: Name of this web property. + Name string `json:"name,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *WebPropertyRef) MarshalJSON() ([]byte, error) { + type NoMethod WebPropertyRef + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// WebPropertySummary: JSON template for an Analytics +// WebPropertySummary. WebPropertySummary returns basic information +// (i.e., summary) for a web property. +type WebPropertySummary struct { + // Id: Web property ID of the form UA-XXXXX-YY. + Id string `json:"id,omitempty"` + + // InternalWebPropertyId: Internal ID for this web property. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // Kind: Resource type for Analytics WebPropertySummary. + Kind string `json:"kind,omitempty"` + + // Level: Level for this web property. Possible values are STANDARD or + // PREMIUM. + Level string `json:"level,omitempty"` + + // Name: Web property name. + Name string `json:"name,omitempty"` + + // Profiles: List of profiles under this web property. + Profiles []*ProfileSummary `json:"profiles,omitempty"` + + // Starred: Indicates whether this web property is starred or not. + Starred bool `json:"starred,omitempty"` + + // WebsiteUrl: Website url for this web property. + WebsiteUrl string `json:"websiteUrl,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *WebPropertySummary) MarshalJSON() ([]byte, error) { + type NoMethod WebPropertySummary + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Webproperties: A web property collection lists Analytics web +// properties to which the user has access. Each resource in the +// collection corresponds to a single Analytics web property. +type Webproperties struct { + // Items: A list of web properties. + Items []*Webproperty `json:"items,omitempty"` + + // ItemsPerPage: The maximum number of resources the response can + // contain, regardless of the actual number of resources returned. Its + // value ranges from 1 to 1000 with a value of 1000 by default, or + // otherwise specified by the max-results query parameter. + ItemsPerPage int64 `json:"itemsPerPage,omitempty"` + + // Kind: Collection type. + Kind string `json:"kind,omitempty"` + + // NextLink: Link to next page for this web property collection. + NextLink string `json:"nextLink,omitempty"` + + // PreviousLink: Link to previous page for this web property collection. + PreviousLink string `json:"previousLink,omitempty"` + + // StartIndex: The starting index of the resources, which is 1 by + // default or otherwise specified by the start-index query parameter. + StartIndex int64 `json:"startIndex,omitempty"` + + // TotalResults: The total number of results for the query, regardless + // of the number of results in the response. + TotalResults int64 `json:"totalResults,omitempty"` + + // Username: Email ID of the authenticated user + Username string `json:"username,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Webproperties) MarshalJSON() ([]byte, error) { + type NoMethod Webproperties + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// Webproperty: JSON template for an Analytics web property. +type Webproperty struct { + // AccountId: Account ID to which this web property belongs. + AccountId string `json:"accountId,omitempty"` + + // ChildLink: Child link for this web property. Points to the list of + // views (profiles) for this web property. + ChildLink *WebpropertyChildLink `json:"childLink,omitempty"` + + // Created: Time this web property was created. + Created string `json:"created,omitempty"` + + // DataRetentionResetOnNewActivity: Set to true to reset the retention + // period of the user identifier with each new event from that user + // (thus setting the expiration date to current time plus retention + // period). + // Set to false to delete data associated with the user identifier + // automatically after the rentention period. + // This property cannot be set on insert. + DataRetentionResetOnNewActivity bool `json:"dataRetentionResetOnNewActivity,omitempty"` + + // DataRetentionTtl: The length of time for which user and event data is + // retained. + // This property cannot be set on insert. + DataRetentionTtl string `json:"dataRetentionTtl,omitempty"` + + // DefaultProfileId: Default view (profile) ID. + DefaultProfileId int64 `json:"defaultProfileId,omitempty,string"` + + // Id: Web property ID of the form UA-XXXXX-YY. + Id string `json:"id,omitempty"` + + // IndustryVertical: The industry vertical/category selected for this + // web property. + IndustryVertical string `json:"industryVertical,omitempty"` + + // InternalWebPropertyId: Internal ID for this web property. + InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"` + + // Kind: Resource type for Analytics WebProperty. + Kind string `json:"kind,omitempty"` + + // Level: Level for this web property. Possible values are STANDARD or + // PREMIUM. + Level string `json:"level,omitempty"` + + // Name: Name of this web property. + Name string `json:"name,omitempty"` + + // ParentLink: Parent link for this web property. Points to the account + // to which this web property belongs. + ParentLink *WebpropertyParentLink `json:"parentLink,omitempty"` + + // Permissions: Permissions the user has for this web property. + Permissions *WebpropertyPermissions `json:"permissions,omitempty"` + + // ProfileCount: View (Profile) count for this web property. + ProfileCount int64 `json:"profileCount,omitempty"` + + // SelfLink: Link for this web property. + SelfLink string `json:"selfLink,omitempty"` + + // Starred: Indicates whether this web property is starred or not. + Starred bool `json:"starred,omitempty"` + + // Updated: Time this web property was last modified. + Updated string `json:"updated,omitempty"` + + // WebsiteUrl: Website url for this web property. + WebsiteUrl string `json:"websiteUrl,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "AccountId") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AccountId") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Webproperty) MarshalJSON() ([]byte, error) { + type NoMethod Webproperty + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// WebpropertyChildLink: Child link for this web property. Points to the +// list of views (profiles) for this web property. +type WebpropertyChildLink struct { + // Href: Link to the list of views (profiles) for this web property. + Href string `json:"href,omitempty"` + + // Type: Type of the parent link. Its value is "analytics#profiles". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *WebpropertyChildLink) MarshalJSON() ([]byte, error) { + type NoMethod WebpropertyChildLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// WebpropertyParentLink: Parent link for this web property. Points to +// the account to which this web property belongs. +type WebpropertyParentLink struct { + // Href: Link to the account for this web property. + Href string `json:"href,omitempty"` + + // Type: Type of the parent link. Its value is "analytics#account". + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Href") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Href") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *WebpropertyParentLink) MarshalJSON() ([]byte, error) { + type NoMethod WebpropertyParentLink + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// WebpropertyPermissions: Permissions the user has for this web +// property. +type WebpropertyPermissions struct { + // Effective: All the permissions that the user has for this web + // property. These include any implied permissions (e.g., EDIT implies + // VIEW) or inherited permissions from the parent account. + Effective []string `json:"effective,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Effective") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Effective") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *WebpropertyPermissions) MarshalJSON() ([]byte, error) { + type NoMethod WebpropertyPermissions + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// method id "analytics.data.ga.get": + +type DataGaGetCall struct { + s *Service + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns Analytics data for a view (profile). +func (r *DataGaService) Get(ids string, startDate string, endDate string, metrics string) *DataGaGetCall { + c := &DataGaGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.urlParams_.Set("ids", ids) + c.urlParams_.Set("start-date", startDate) + c.urlParams_.Set("end-date", endDate) + c.urlParams_.Set("metrics", metrics) + return c +} + +// Dimensions sets the optional parameter "dimensions": A +// comma-separated list of Analytics dimensions. E.g., +// 'ga:browser,ga:city'. +func (c *DataGaGetCall) Dimensions(dimensions string) *DataGaGetCall { + c.urlParams_.Set("dimensions", dimensions) + return c +} + +// Filters sets the optional parameter "filters": A comma-separated list +// of dimension or metric filters to be applied to Analytics data. +func (c *DataGaGetCall) Filters(filters string) *DataGaGetCall { + c.urlParams_.Set("filters", filters) + return c +} + +// IncludeEmptyRows sets the optional parameter "include-empty-rows": +// The response will include empty rows if this parameter is set to +// true, the default is true +func (c *DataGaGetCall) IncludeEmptyRows(includeEmptyRows bool) *DataGaGetCall { + c.urlParams_.Set("include-empty-rows", fmt.Sprint(includeEmptyRows)) + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of entries to include in this feed. +func (c *DataGaGetCall) MaxResults(maxResults int64) *DataGaGetCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// Output sets the optional parameter "output": The selected format for +// the response. Default format is JSON. +// +// Possible values: +// "dataTable" - Returns the response in Google Charts Data Table +// format. This is useful in creating visualization using Google Charts. +// "json" - Returns the response in standard JSON format. +func (c *DataGaGetCall) Output(output string) *DataGaGetCall { + c.urlParams_.Set("output", output) + return c +} + +// SamplingLevel sets the optional parameter "samplingLevel": The +// desired sampling level. +// +// Possible values: +// "DEFAULT" - Returns response with a sample size that balances speed +// and accuracy. +// "FASTER" - Returns a fast response with a smaller sample size. +// "HIGHER_PRECISION" - Returns a more accurate response using a large +// sample size, but this may result in the response being slower. +func (c *DataGaGetCall) SamplingLevel(samplingLevel string) *DataGaGetCall { + c.urlParams_.Set("samplingLevel", samplingLevel) + return c +} + +// Segment sets the optional parameter "segment": An Analytics segment +// to be applied to data. +func (c *DataGaGetCall) Segment(segment string) *DataGaGetCall { + c.urlParams_.Set("segment", segment) + return c +} + +// Sort sets the optional parameter "sort": A comma-separated list of +// dimensions or metrics that determine the sort order for Analytics +// data. +func (c *DataGaGetCall) Sort(sort string) *DataGaGetCall { + c.urlParams_.Set("sort", sort) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first entity to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *DataGaGetCall) StartIndex(startIndex int64) *DataGaGetCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *DataGaGetCall) Fields(s ...googleapi.Field) *DataGaGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *DataGaGetCall) IfNoneMatch(entityTag string) *DataGaGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *DataGaGetCall) Context(ctx context.Context) *DataGaGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *DataGaGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *DataGaGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "data/ga") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.data.ga.get" call. +// Exactly one of *GaData or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *GaData.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *DataGaGetCall) Do(opts ...googleapi.CallOption) (*GaData, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &GaData{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns Analytics data for a view (profile).", + // "httpMethod": "GET", + // "id": "analytics.data.ga.get", + // "parameterOrder": [ + // "ids", + // "start-date", + // "end-date", + // "metrics" + // ], + // "parameters": { + // "dimensions": { + // "description": "A comma-separated list of Analytics dimensions. E.g., 'ga:browser,ga:city'.", + // "location": "query", + // "pattern": "(ga:.+)?", + // "type": "string" + // }, + // "end-date": { + // "description": "End date for fetching Analytics data. Request can should specify an end date formatted as YYYY-MM-DD, or as a relative date (e.g., today, yesterday, or 7daysAgo). The default value is yesterday.", + // "location": "query", + // "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}|today|yesterday|[0-9]+(daysAgo)", + // "required": true, + // "type": "string" + // }, + // "filters": { + // "description": "A comma-separated list of dimension or metric filters to be applied to Analytics data.", + // "location": "query", + // "pattern": "ga:.+", + // "type": "string" + // }, + // "ids": { + // "description": "Unique table ID for retrieving Analytics data. Table ID is of the form ga:XXXX, where XXXX is the Analytics view (profile) ID.", + // "location": "query", + // "pattern": "ga:[0-9]+", + // "required": true, + // "type": "string" + // }, + // "include-empty-rows": { + // "description": "The response will include empty rows if this parameter is set to true, the default is true", + // "location": "query", + // "type": "boolean" + // }, + // "max-results": { + // "description": "The maximum number of entries to include in this feed.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "metrics": { + // "description": "A comma-separated list of Analytics metrics. E.g., 'ga:sessions,ga:pageviews'. At least one metric must be specified.", + // "location": "query", + // "pattern": "ga:.+", + // "required": true, + // "type": "string" + // }, + // "output": { + // "description": "The selected format for the response. Default format is JSON.", + // "enum": [ + // "dataTable", + // "json" + // ], + // "enumDescriptions": [ + // "Returns the response in Google Charts Data Table format. This is useful in creating visualization using Google Charts.", + // "Returns the response in standard JSON format." + // ], + // "location": "query", + // "type": "string" + // }, + // "samplingLevel": { + // "description": "The desired sampling level.", + // "enum": [ + // "DEFAULT", + // "FASTER", + // "HIGHER_PRECISION" + // ], + // "enumDescriptions": [ + // "Returns response with a sample size that balances speed and accuracy.", + // "Returns a fast response with a smaller sample size.", + // "Returns a more accurate response using a large sample size, but this may result in the response being slower." + // ], + // "location": "query", + // "type": "string" + // }, + // "segment": { + // "description": "An Analytics segment to be applied to data.", + // "location": "query", + // "type": "string" + // }, + // "sort": { + // "description": "A comma-separated list of dimensions or metrics that determine the sort order for Analytics data.", + // "location": "query", + // "pattern": "(-)?ga:.+", + // "type": "string" + // }, + // "start-date": { + // "description": "Start date for fetching Analytics data. Requests can specify a start date formatted as YYYY-MM-DD, or as a relative date (e.g., today, yesterday, or 7daysAgo). The default value is 7daysAgo.", + // "location": "query", + // "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}|today|yesterday|[0-9]+(daysAgo)", + // "required": true, + // "type": "string" + // }, + // "start-index": { + // "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // } + // }, + // "path": "data/ga", + // "response": { + // "$ref": "GaData" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.data.mcf.get": + +type DataMcfGetCall struct { + s *Service + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns Analytics Multi-Channel Funnels data for a view +// (profile). +func (r *DataMcfService) Get(ids string, startDate string, endDate string, metrics string) *DataMcfGetCall { + c := &DataMcfGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.urlParams_.Set("ids", ids) + c.urlParams_.Set("start-date", startDate) + c.urlParams_.Set("end-date", endDate) + c.urlParams_.Set("metrics", metrics) + return c +} + +// Dimensions sets the optional parameter "dimensions": A +// comma-separated list of Multi-Channel Funnels dimensions. E.g., +// 'mcf:source,mcf:medium'. +func (c *DataMcfGetCall) Dimensions(dimensions string) *DataMcfGetCall { + c.urlParams_.Set("dimensions", dimensions) + return c +} + +// Filters sets the optional parameter "filters": A comma-separated list +// of dimension or metric filters to be applied to the Analytics data. +func (c *DataMcfGetCall) Filters(filters string) *DataMcfGetCall { + c.urlParams_.Set("filters", filters) + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of entries to include in this feed. +func (c *DataMcfGetCall) MaxResults(maxResults int64) *DataMcfGetCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// SamplingLevel sets the optional parameter "samplingLevel": The +// desired sampling level. +// +// Possible values: +// "DEFAULT" - Returns response with a sample size that balances speed +// and accuracy. +// "FASTER" - Returns a fast response with a smaller sample size. +// "HIGHER_PRECISION" - Returns a more accurate response using a large +// sample size, but this may result in the response being slower. +func (c *DataMcfGetCall) SamplingLevel(samplingLevel string) *DataMcfGetCall { + c.urlParams_.Set("samplingLevel", samplingLevel) + return c +} + +// Sort sets the optional parameter "sort": A comma-separated list of +// dimensions or metrics that determine the sort order for the Analytics +// data. +func (c *DataMcfGetCall) Sort(sort string) *DataMcfGetCall { + c.urlParams_.Set("sort", sort) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first entity to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *DataMcfGetCall) StartIndex(startIndex int64) *DataMcfGetCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *DataMcfGetCall) Fields(s ...googleapi.Field) *DataMcfGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *DataMcfGetCall) IfNoneMatch(entityTag string) *DataMcfGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *DataMcfGetCall) Context(ctx context.Context) *DataMcfGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *DataMcfGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *DataMcfGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "data/mcf") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.data.mcf.get" call. +// Exactly one of *McfData or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *McfData.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *DataMcfGetCall) Do(opts ...googleapi.CallOption) (*McfData, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &McfData{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns Analytics Multi-Channel Funnels data for a view (profile).", + // "httpMethod": "GET", + // "id": "analytics.data.mcf.get", + // "parameterOrder": [ + // "ids", + // "start-date", + // "end-date", + // "metrics" + // ], + // "parameters": { + // "dimensions": { + // "description": "A comma-separated list of Multi-Channel Funnels dimensions. E.g., 'mcf:source,mcf:medium'.", + // "location": "query", + // "pattern": "(mcf:.+)?", + // "type": "string" + // }, + // "end-date": { + // "description": "End date for fetching Analytics data. Requests can specify a start date formatted as YYYY-MM-DD, or as a relative date (e.g., today, yesterday, or 7daysAgo). The default value is 7daysAgo.", + // "location": "query", + // "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}|today|yesterday|[0-9]+(daysAgo)", + // "required": true, + // "type": "string" + // }, + // "filters": { + // "description": "A comma-separated list of dimension or metric filters to be applied to the Analytics data.", + // "location": "query", + // "pattern": "mcf:.+", + // "type": "string" + // }, + // "ids": { + // "description": "Unique table ID for retrieving Analytics data. Table ID is of the form ga:XXXX, where XXXX is the Analytics view (profile) ID.", + // "location": "query", + // "pattern": "ga:[0-9]+", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of entries to include in this feed.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "metrics": { + // "description": "A comma-separated list of Multi-Channel Funnels metrics. E.g., 'mcf:totalConversions,mcf:totalConversionValue'. At least one metric must be specified.", + // "location": "query", + // "pattern": "mcf:.+", + // "required": true, + // "type": "string" + // }, + // "samplingLevel": { + // "description": "The desired sampling level.", + // "enum": [ + // "DEFAULT", + // "FASTER", + // "HIGHER_PRECISION" + // ], + // "enumDescriptions": [ + // "Returns response with a sample size that balances speed and accuracy.", + // "Returns a fast response with a smaller sample size.", + // "Returns a more accurate response using a large sample size, but this may result in the response being slower." + // ], + // "location": "query", + // "type": "string" + // }, + // "sort": { + // "description": "A comma-separated list of dimensions or metrics that determine the sort order for the Analytics data.", + // "location": "query", + // "pattern": "(-)?mcf:.+", + // "type": "string" + // }, + // "start-date": { + // "description": "Start date for fetching Analytics data. Requests can specify a start date formatted as YYYY-MM-DD, or as a relative date (e.g., today, yesterday, or 7daysAgo). The default value is 7daysAgo.", + // "location": "query", + // "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}|today|yesterday|[0-9]+(daysAgo)", + // "required": true, + // "type": "string" + // }, + // "start-index": { + // "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // } + // }, + // "path": "data/mcf", + // "response": { + // "$ref": "McfData" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.data.realtime.get": + +type DataRealtimeGetCall struct { + s *Service + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns real time data for a view (profile). +func (r *DataRealtimeService) Get(ids string, metrics string) *DataRealtimeGetCall { + c := &DataRealtimeGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.urlParams_.Set("ids", ids) + c.urlParams_.Set("metrics", metrics) + return c +} + +// Dimensions sets the optional parameter "dimensions": A +// comma-separated list of real time dimensions. E.g., +// 'rt:medium,rt:city'. +func (c *DataRealtimeGetCall) Dimensions(dimensions string) *DataRealtimeGetCall { + c.urlParams_.Set("dimensions", dimensions) + return c +} + +// Filters sets the optional parameter "filters": A comma-separated list +// of dimension or metric filters to be applied to real time data. +func (c *DataRealtimeGetCall) Filters(filters string) *DataRealtimeGetCall { + c.urlParams_.Set("filters", filters) + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of entries to include in this feed. +func (c *DataRealtimeGetCall) MaxResults(maxResults int64) *DataRealtimeGetCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// Sort sets the optional parameter "sort": A comma-separated list of +// dimensions or metrics that determine the sort order for real time +// data. +func (c *DataRealtimeGetCall) Sort(sort string) *DataRealtimeGetCall { + c.urlParams_.Set("sort", sort) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *DataRealtimeGetCall) Fields(s ...googleapi.Field) *DataRealtimeGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *DataRealtimeGetCall) IfNoneMatch(entityTag string) *DataRealtimeGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *DataRealtimeGetCall) Context(ctx context.Context) *DataRealtimeGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *DataRealtimeGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *DataRealtimeGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "data/realtime") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.data.realtime.get" call. +// Exactly one of *RealtimeData or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *RealtimeData.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *DataRealtimeGetCall) Do(opts ...googleapi.CallOption) (*RealtimeData, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RealtimeData{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns real time data for a view (profile).", + // "httpMethod": "GET", + // "id": "analytics.data.realtime.get", + // "parameterOrder": [ + // "ids", + // "metrics" + // ], + // "parameters": { + // "dimensions": { + // "description": "A comma-separated list of real time dimensions. E.g., 'rt:medium,rt:city'.", + // "location": "query", + // "pattern": "(ga:.+)|(rt:.+)", + // "type": "string" + // }, + // "filters": { + // "description": "A comma-separated list of dimension or metric filters to be applied to real time data.", + // "location": "query", + // "pattern": "(ga:.+)|(rt:.+)", + // "type": "string" + // }, + // "ids": { + // "description": "Unique table ID for retrieving real time data. Table ID is of the form ga:XXXX, where XXXX is the Analytics view (profile) ID.", + // "location": "query", + // "pattern": "ga:[0-9]+", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of entries to include in this feed.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "metrics": { + // "description": "A comma-separated list of real time metrics. E.g., 'rt:activeUsers'. At least one metric must be specified.", + // "location": "query", + // "pattern": "(ga:.+)|(rt:.+)", + // "required": true, + // "type": "string" + // }, + // "sort": { + // "description": "A comma-separated list of dimensions or metrics that determine the sort order for real time data.", + // "location": "query", + // "pattern": "(-)?((ga:.+)|(rt:.+))", + // "type": "string" + // } + // }, + // "path": "data/realtime", + // "response": { + // "$ref": "RealtimeData" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.accountSummaries.list": + +type ManagementAccountSummariesListCall struct { + s *Service + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists account summaries (lightweight tree comprised of +// accounts/properties/profiles) to which the user has access. +func (r *ManagementAccountSummariesService) List() *ManagementAccountSummariesListCall { + c := &ManagementAccountSummariesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of account summaries to include in this response, where the +// largest acceptable value is 1000. +func (c *ManagementAccountSummariesListCall) MaxResults(maxResults int64) *ManagementAccountSummariesListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first entity to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementAccountSummariesListCall) StartIndex(startIndex int64) *ManagementAccountSummariesListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementAccountSummariesListCall) Fields(s ...googleapi.Field) *ManagementAccountSummariesListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementAccountSummariesListCall) IfNoneMatch(entityTag string) *ManagementAccountSummariesListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementAccountSummariesListCall) Context(ctx context.Context) *ManagementAccountSummariesListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementAccountSummariesListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementAccountSummariesListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accountSummaries") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.accountSummaries.list" call. +// Exactly one of *AccountSummaries or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *AccountSummaries.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementAccountSummariesListCall) Do(opts ...googleapi.CallOption) (*AccountSummaries, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &AccountSummaries{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists account summaries (lightweight tree comprised of accounts/properties/profiles) to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.accountSummaries.list", + // "parameters": { + // "max-results": { + // "description": "The maximum number of account summaries to include in this response, where the largest acceptable value is 1000.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // } + // }, + // "path": "management/accountSummaries", + // "response": { + // "$ref": "AccountSummaries" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.accountUserLinks.delete": + +type ManagementAccountUserLinksDeleteCall struct { + s *Service + accountId string + linkId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Removes a user from the given account. +func (r *ManagementAccountUserLinksService) Delete(accountId string, linkId string) *ManagementAccountUserLinksDeleteCall { + c := &ManagementAccountUserLinksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.linkId = linkId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementAccountUserLinksDeleteCall) Fields(s ...googleapi.Field) *ManagementAccountUserLinksDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementAccountUserLinksDeleteCall) Context(ctx context.Context) *ManagementAccountUserLinksDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementAccountUserLinksDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementAccountUserLinksDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/entityUserLinks/{linkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("DELETE", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "linkId": c.linkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.accountUserLinks.delete" call. +func (c *ManagementAccountUserLinksDeleteCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Removes a user from the given account.", + // "httpMethod": "DELETE", + // "id": "analytics.management.accountUserLinks.delete", + // "parameterOrder": [ + // "accountId", + // "linkId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to delete the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "linkId": { + // "description": "Link ID to delete the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/entityUserLinks/{linkId}", + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users" + // ] + // } + +} + +// method id "analytics.management.accountUserLinks.insert": + +type ManagementAccountUserLinksInsertCall struct { + s *Service + accountId string + entityuserlink *EntityUserLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Adds a new user to the given account. +func (r *ManagementAccountUserLinksService) Insert(accountId string, entityuserlink *EntityUserLink) *ManagementAccountUserLinksInsertCall { + c := &ManagementAccountUserLinksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.entityuserlink = entityuserlink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementAccountUserLinksInsertCall) Fields(s ...googleapi.Field) *ManagementAccountUserLinksInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementAccountUserLinksInsertCall) Context(ctx context.Context) *ManagementAccountUserLinksInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementAccountUserLinksInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementAccountUserLinksInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/entityUserLinks") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.accountUserLinks.insert" call. +// Exactly one of *EntityUserLink or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *EntityUserLink.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementAccountUserLinksInsertCall) Do(opts ...googleapi.CallOption) (*EntityUserLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityUserLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Adds a new user to the given account.", + // "httpMethod": "POST", + // "id": "analytics.management.accountUserLinks.insert", + // "parameterOrder": [ + // "accountId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to create the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/entityUserLinks", + // "request": { + // "$ref": "EntityUserLink" + // }, + // "response": { + // "$ref": "EntityUserLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users" + // ] + // } + +} + +// method id "analytics.management.accountUserLinks.list": + +type ManagementAccountUserLinksListCall struct { + s *Service + accountId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists account-user links for a given account. +func (r *ManagementAccountUserLinksService) List(accountId string) *ManagementAccountUserLinksListCall { + c := &ManagementAccountUserLinksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of account-user links to include in this response. +func (c *ManagementAccountUserLinksListCall) MaxResults(maxResults int64) *ManagementAccountUserLinksListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first account-user link to retrieve. Use this parameter as a +// pagination mechanism along with the max-results parameter. +func (c *ManagementAccountUserLinksListCall) StartIndex(startIndex int64) *ManagementAccountUserLinksListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementAccountUserLinksListCall) Fields(s ...googleapi.Field) *ManagementAccountUserLinksListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementAccountUserLinksListCall) IfNoneMatch(entityTag string) *ManagementAccountUserLinksListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementAccountUserLinksListCall) Context(ctx context.Context) *ManagementAccountUserLinksListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementAccountUserLinksListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementAccountUserLinksListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/entityUserLinks") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.accountUserLinks.list" call. +// Exactly one of *EntityUserLinks or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *EntityUserLinks.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementAccountUserLinksListCall) Do(opts ...googleapi.CallOption) (*EntityUserLinks, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityUserLinks{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists account-user links for a given account.", + // "httpMethod": "GET", + // "id": "analytics.management.accountUserLinks.list", + // "parameterOrder": [ + // "accountId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve the user links for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of account-user links to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first account-user link to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // } + // }, + // "path": "management/accounts/{accountId}/entityUserLinks", + // "response": { + // "$ref": "EntityUserLinks" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users", + // "https://www.googleapis.com/auth/analytics.manage.users.readonly" + // ] + // } + +} + +// method id "analytics.management.accountUserLinks.update": + +type ManagementAccountUserLinksUpdateCall struct { + s *Service + accountId string + linkId string + entityuserlink *EntityUserLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates permissions for an existing user on the given +// account. +func (r *ManagementAccountUserLinksService) Update(accountId string, linkId string, entityuserlink *EntityUserLink) *ManagementAccountUserLinksUpdateCall { + c := &ManagementAccountUserLinksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.linkId = linkId + c.entityuserlink = entityuserlink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementAccountUserLinksUpdateCall) Fields(s ...googleapi.Field) *ManagementAccountUserLinksUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementAccountUserLinksUpdateCall) Context(ctx context.Context) *ManagementAccountUserLinksUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementAccountUserLinksUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementAccountUserLinksUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/entityUserLinks/{linkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "linkId": c.linkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.accountUserLinks.update" call. +// Exactly one of *EntityUserLink or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *EntityUserLink.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementAccountUserLinksUpdateCall) Do(opts ...googleapi.CallOption) (*EntityUserLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityUserLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates permissions for an existing user on the given account.", + // "httpMethod": "PUT", + // "id": "analytics.management.accountUserLinks.update", + // "parameterOrder": [ + // "accountId", + // "linkId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to update the account-user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "linkId": { + // "description": "Link ID to update the account-user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/entityUserLinks/{linkId}", + // "request": { + // "$ref": "EntityUserLink" + // }, + // "response": { + // "$ref": "EntityUserLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users" + // ] + // } + +} + +// method id "analytics.management.accounts.list": + +type ManagementAccountsListCall struct { + s *Service + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists all accounts to which the user has access. +func (r *ManagementAccountsService) List() *ManagementAccountsListCall { + c := &ManagementAccountsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of accounts to include in this response. +func (c *ManagementAccountsListCall) MaxResults(maxResults int64) *ManagementAccountsListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first account to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementAccountsListCall) StartIndex(startIndex int64) *ManagementAccountsListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementAccountsListCall) Fields(s ...googleapi.Field) *ManagementAccountsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementAccountsListCall) IfNoneMatch(entityTag string) *ManagementAccountsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementAccountsListCall) Context(ctx context.Context) *ManagementAccountsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementAccountsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementAccountsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.accounts.list" call. +// Exactly one of *Accounts or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Accounts.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementAccountsListCall) Do(opts ...googleapi.CallOption) (*Accounts, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Accounts{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists all accounts to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.accounts.list", + // "parameters": { + // "max-results": { + // "description": "The maximum number of accounts to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first account to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // } + // }, + // "path": "management/accounts", + // "response": { + // "$ref": "Accounts" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.clientId.hashClientId": + +type ManagementClientIdHashClientIdCall struct { + s *Service + hashclientidrequest *HashClientIdRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// HashClientId: Hashes the given Client ID. +func (r *ManagementClientIdService) HashClientId(hashclientidrequest *HashClientIdRequest) *ManagementClientIdHashClientIdCall { + c := &ManagementClientIdHashClientIdCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.hashclientidrequest = hashclientidrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementClientIdHashClientIdCall) Fields(s ...googleapi.Field) *ManagementClientIdHashClientIdCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementClientIdHashClientIdCall) Context(ctx context.Context) *ManagementClientIdHashClientIdCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementClientIdHashClientIdCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementClientIdHashClientIdCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.hashclientidrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/clientId:hashClientId") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.clientId.hashClientId" call. +// Exactly one of *HashClientIdResponse or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *HashClientIdResponse.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementClientIdHashClientIdCall) Do(opts ...googleapi.CallOption) (*HashClientIdResponse, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &HashClientIdResponse{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Hashes the given Client ID.", + // "httpMethod": "POST", + // "id": "analytics.management.clientId.hashClientId", + // "path": "management/clientId:hashClientId", + // "request": { + // "$ref": "HashClientIdRequest" + // }, + // "response": { + // "$ref": "HashClientIdResponse" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.customDataSources.list": + +type ManagementCustomDataSourcesListCall struct { + s *Service + accountId string + webPropertyId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: List custom data sources to which the user has access. +func (r *ManagementCustomDataSourcesService) List(accountId string, webPropertyId string) *ManagementCustomDataSourcesListCall { + c := &ManagementCustomDataSourcesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of custom data sources to include in this response. +func (c *ManagementCustomDataSourcesListCall) MaxResults(maxResults int64) *ManagementCustomDataSourcesListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": A 1-based index +// of the first custom data source to retrieve. Use this parameter as a +// pagination mechanism along with the max-results parameter. +func (c *ManagementCustomDataSourcesListCall) StartIndex(startIndex int64) *ManagementCustomDataSourcesListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomDataSourcesListCall) Fields(s ...googleapi.Field) *ManagementCustomDataSourcesListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementCustomDataSourcesListCall) IfNoneMatch(entityTag string) *ManagementCustomDataSourcesListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomDataSourcesListCall) Context(ctx context.Context) *ManagementCustomDataSourcesListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomDataSourcesListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomDataSourcesListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customDataSources.list" call. +// Exactly one of *CustomDataSources or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *CustomDataSources.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementCustomDataSourcesListCall) Do(opts ...googleapi.CallOption) (*CustomDataSources, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomDataSources{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "List custom data sources to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.customDataSources.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account Id for the custom data sources to retrieve.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of custom data sources to include in this response.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "start-index": { + // "description": "A 1-based index of the first custom data source to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web property Id for the custom data sources to retrieve.", + // "location": "path", + // "pattern": "UA-(\\d+)-(\\d+)", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources", + // "response": { + // "$ref": "CustomDataSources" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.customDimensions.get": + +type ManagementCustomDimensionsGetCall struct { + s *Service + accountId string + webPropertyId string + customDimensionId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Get a custom dimension to which the user has access. +func (r *ManagementCustomDimensionsService) Get(accountId string, webPropertyId string, customDimensionId string) *ManagementCustomDimensionsGetCall { + c := &ManagementCustomDimensionsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customDimensionId = customDimensionId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomDimensionsGetCall) Fields(s ...googleapi.Field) *ManagementCustomDimensionsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementCustomDimensionsGetCall) IfNoneMatch(entityTag string) *ManagementCustomDimensionsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomDimensionsGetCall) Context(ctx context.Context) *ManagementCustomDimensionsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomDimensionsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomDimensionsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "customDimensionId": c.customDimensionId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customDimensions.get" call. +// Exactly one of *CustomDimension or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *CustomDimension.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementCustomDimensionsGetCall) Do(opts ...googleapi.CallOption) (*CustomDimension, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomDimension{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Get a custom dimension to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.customDimensions.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "customDimensionId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the custom dimension to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "customDimensionId": { + // "description": "The ID of the custom dimension to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID for the custom dimension to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}", + // "response": { + // "$ref": "CustomDimension" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.customDimensions.insert": + +type ManagementCustomDimensionsInsertCall struct { + s *Service + accountId string + webPropertyId string + customdimension *CustomDimension + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Create a new custom dimension. +func (r *ManagementCustomDimensionsService) Insert(accountId string, webPropertyId string, customdimension *CustomDimension) *ManagementCustomDimensionsInsertCall { + c := &ManagementCustomDimensionsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customdimension = customdimension + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomDimensionsInsertCall) Fields(s ...googleapi.Field) *ManagementCustomDimensionsInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomDimensionsInsertCall) Context(ctx context.Context) *ManagementCustomDimensionsInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomDimensionsInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomDimensionsInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.customdimension) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customDimensions.insert" call. +// Exactly one of *CustomDimension or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *CustomDimension.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementCustomDimensionsInsertCall) Do(opts ...googleapi.CallOption) (*CustomDimension, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomDimension{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Create a new custom dimension.", + // "httpMethod": "POST", + // "id": "analytics.management.customDimensions.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the custom dimension to create.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID for the custom dimension to create.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions", + // "request": { + // "$ref": "CustomDimension" + // }, + // "response": { + // "$ref": "CustomDimension" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.customDimensions.list": + +type ManagementCustomDimensionsListCall struct { + s *Service + accountId string + webPropertyId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists custom dimensions to which the user has access. +func (r *ManagementCustomDimensionsService) List(accountId string, webPropertyId string) *ManagementCustomDimensionsListCall { + c := &ManagementCustomDimensionsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of custom dimensions to include in this response. +func (c *ManagementCustomDimensionsListCall) MaxResults(maxResults int64) *ManagementCustomDimensionsListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first entity to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementCustomDimensionsListCall) StartIndex(startIndex int64) *ManagementCustomDimensionsListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomDimensionsListCall) Fields(s ...googleapi.Field) *ManagementCustomDimensionsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementCustomDimensionsListCall) IfNoneMatch(entityTag string) *ManagementCustomDimensionsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomDimensionsListCall) Context(ctx context.Context) *ManagementCustomDimensionsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomDimensionsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomDimensionsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customDimensions.list" call. +// Exactly one of *CustomDimensions or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *CustomDimensions.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementCustomDimensionsListCall) Do(opts ...googleapi.CallOption) (*CustomDimensions, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomDimensions{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists custom dimensions to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.customDimensions.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the custom dimensions to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of custom dimensions to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web property ID for the custom dimensions to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions", + // "response": { + // "$ref": "CustomDimensions" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.customDimensions.patch": + +type ManagementCustomDimensionsPatchCall struct { + s *Service + accountId string + webPropertyId string + customDimensionId string + customdimension *CustomDimension + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Updates an existing custom dimension. This method supports +// patch semantics. +func (r *ManagementCustomDimensionsService) Patch(accountId string, webPropertyId string, customDimensionId string, customdimension *CustomDimension) *ManagementCustomDimensionsPatchCall { + c := &ManagementCustomDimensionsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customDimensionId = customDimensionId + c.customdimension = customdimension + return c +} + +// IgnoreCustomDataSourceLinks sets the optional parameter +// "ignoreCustomDataSourceLinks": Force the update and ignore any +// warnings related to the custom dimension being linked to a custom +// data source / data set. +func (c *ManagementCustomDimensionsPatchCall) IgnoreCustomDataSourceLinks(ignoreCustomDataSourceLinks bool) *ManagementCustomDimensionsPatchCall { + c.urlParams_.Set("ignoreCustomDataSourceLinks", fmt.Sprint(ignoreCustomDataSourceLinks)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomDimensionsPatchCall) Fields(s ...googleapi.Field) *ManagementCustomDimensionsPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomDimensionsPatchCall) Context(ctx context.Context) *ManagementCustomDimensionsPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomDimensionsPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomDimensionsPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.customdimension) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "customDimensionId": c.customDimensionId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customDimensions.patch" call. +// Exactly one of *CustomDimension or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *CustomDimension.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementCustomDimensionsPatchCall) Do(opts ...googleapi.CallOption) (*CustomDimension, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomDimension{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing custom dimension. This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "analytics.management.customDimensions.patch", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "customDimensionId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the custom dimension to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "customDimensionId": { + // "description": "Custom dimension ID for the custom dimension to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "ignoreCustomDataSourceLinks": { + // "default": "false", + // "description": "Force the update and ignore any warnings related to the custom dimension being linked to a custom data source / data set.", + // "location": "query", + // "type": "boolean" + // }, + // "webPropertyId": { + // "description": "Web property ID for the custom dimension to update.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}", + // "request": { + // "$ref": "CustomDimension" + // }, + // "response": { + // "$ref": "CustomDimension" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.customDimensions.update": + +type ManagementCustomDimensionsUpdateCall struct { + s *Service + accountId string + webPropertyId string + customDimensionId string + customdimension *CustomDimension + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates an existing custom dimension. +func (r *ManagementCustomDimensionsService) Update(accountId string, webPropertyId string, customDimensionId string, customdimension *CustomDimension) *ManagementCustomDimensionsUpdateCall { + c := &ManagementCustomDimensionsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customDimensionId = customDimensionId + c.customdimension = customdimension + return c +} + +// IgnoreCustomDataSourceLinks sets the optional parameter +// "ignoreCustomDataSourceLinks": Force the update and ignore any +// warnings related to the custom dimension being linked to a custom +// data source / data set. +func (c *ManagementCustomDimensionsUpdateCall) IgnoreCustomDataSourceLinks(ignoreCustomDataSourceLinks bool) *ManagementCustomDimensionsUpdateCall { + c.urlParams_.Set("ignoreCustomDataSourceLinks", fmt.Sprint(ignoreCustomDataSourceLinks)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomDimensionsUpdateCall) Fields(s ...googleapi.Field) *ManagementCustomDimensionsUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomDimensionsUpdateCall) Context(ctx context.Context) *ManagementCustomDimensionsUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomDimensionsUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomDimensionsUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.customdimension) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "customDimensionId": c.customDimensionId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customDimensions.update" call. +// Exactly one of *CustomDimension or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *CustomDimension.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementCustomDimensionsUpdateCall) Do(opts ...googleapi.CallOption) (*CustomDimension, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomDimension{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing custom dimension.", + // "httpMethod": "PUT", + // "id": "analytics.management.customDimensions.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "customDimensionId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the custom dimension to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "customDimensionId": { + // "description": "Custom dimension ID for the custom dimension to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "ignoreCustomDataSourceLinks": { + // "default": "false", + // "description": "Force the update and ignore any warnings related to the custom dimension being linked to a custom data source / data set.", + // "location": "query", + // "type": "boolean" + // }, + // "webPropertyId": { + // "description": "Web property ID for the custom dimension to update.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}", + // "request": { + // "$ref": "CustomDimension" + // }, + // "response": { + // "$ref": "CustomDimension" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.customMetrics.get": + +type ManagementCustomMetricsGetCall struct { + s *Service + accountId string + webPropertyId string + customMetricId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Get a custom metric to which the user has access. +func (r *ManagementCustomMetricsService) Get(accountId string, webPropertyId string, customMetricId string) *ManagementCustomMetricsGetCall { + c := &ManagementCustomMetricsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customMetricId = customMetricId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomMetricsGetCall) Fields(s ...googleapi.Field) *ManagementCustomMetricsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementCustomMetricsGetCall) IfNoneMatch(entityTag string) *ManagementCustomMetricsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomMetricsGetCall) Context(ctx context.Context) *ManagementCustomMetricsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomMetricsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomMetricsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "customMetricId": c.customMetricId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customMetrics.get" call. +// Exactly one of *CustomMetric or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *CustomMetric.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementCustomMetricsGetCall) Do(opts ...googleapi.CallOption) (*CustomMetric, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomMetric{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Get a custom metric to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.customMetrics.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "customMetricId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the custom metric to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "customMetricId": { + // "description": "The ID of the custom metric to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID for the custom metric to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}", + // "response": { + // "$ref": "CustomMetric" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.customMetrics.insert": + +type ManagementCustomMetricsInsertCall struct { + s *Service + accountId string + webPropertyId string + custommetric *CustomMetric + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Create a new custom metric. +func (r *ManagementCustomMetricsService) Insert(accountId string, webPropertyId string, custommetric *CustomMetric) *ManagementCustomMetricsInsertCall { + c := &ManagementCustomMetricsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.custommetric = custommetric + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomMetricsInsertCall) Fields(s ...googleapi.Field) *ManagementCustomMetricsInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomMetricsInsertCall) Context(ctx context.Context) *ManagementCustomMetricsInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomMetricsInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomMetricsInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.custommetric) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customMetrics.insert" call. +// Exactly one of *CustomMetric or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *CustomMetric.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementCustomMetricsInsertCall) Do(opts ...googleapi.CallOption) (*CustomMetric, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomMetric{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Create a new custom metric.", + // "httpMethod": "POST", + // "id": "analytics.management.customMetrics.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the custom metric to create.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID for the custom dimension to create.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics", + // "request": { + // "$ref": "CustomMetric" + // }, + // "response": { + // "$ref": "CustomMetric" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.customMetrics.list": + +type ManagementCustomMetricsListCall struct { + s *Service + accountId string + webPropertyId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists custom metrics to which the user has access. +func (r *ManagementCustomMetricsService) List(accountId string, webPropertyId string) *ManagementCustomMetricsListCall { + c := &ManagementCustomMetricsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of custom metrics to include in this response. +func (c *ManagementCustomMetricsListCall) MaxResults(maxResults int64) *ManagementCustomMetricsListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first entity to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementCustomMetricsListCall) StartIndex(startIndex int64) *ManagementCustomMetricsListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomMetricsListCall) Fields(s ...googleapi.Field) *ManagementCustomMetricsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementCustomMetricsListCall) IfNoneMatch(entityTag string) *ManagementCustomMetricsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomMetricsListCall) Context(ctx context.Context) *ManagementCustomMetricsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomMetricsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomMetricsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customMetrics.list" call. +// Exactly one of *CustomMetrics or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *CustomMetrics.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementCustomMetricsListCall) Do(opts ...googleapi.CallOption) (*CustomMetrics, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomMetrics{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists custom metrics to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.customMetrics.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the custom metrics to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of custom metrics to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web property ID for the custom metrics to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics", + // "response": { + // "$ref": "CustomMetrics" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.customMetrics.patch": + +type ManagementCustomMetricsPatchCall struct { + s *Service + accountId string + webPropertyId string + customMetricId string + custommetric *CustomMetric + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Updates an existing custom metric. This method supports patch +// semantics. +func (r *ManagementCustomMetricsService) Patch(accountId string, webPropertyId string, customMetricId string, custommetric *CustomMetric) *ManagementCustomMetricsPatchCall { + c := &ManagementCustomMetricsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customMetricId = customMetricId + c.custommetric = custommetric + return c +} + +// IgnoreCustomDataSourceLinks sets the optional parameter +// "ignoreCustomDataSourceLinks": Force the update and ignore any +// warnings related to the custom metric being linked to a custom data +// source / data set. +func (c *ManagementCustomMetricsPatchCall) IgnoreCustomDataSourceLinks(ignoreCustomDataSourceLinks bool) *ManagementCustomMetricsPatchCall { + c.urlParams_.Set("ignoreCustomDataSourceLinks", fmt.Sprint(ignoreCustomDataSourceLinks)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomMetricsPatchCall) Fields(s ...googleapi.Field) *ManagementCustomMetricsPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomMetricsPatchCall) Context(ctx context.Context) *ManagementCustomMetricsPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomMetricsPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomMetricsPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.custommetric) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "customMetricId": c.customMetricId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customMetrics.patch" call. +// Exactly one of *CustomMetric or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *CustomMetric.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementCustomMetricsPatchCall) Do(opts ...googleapi.CallOption) (*CustomMetric, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomMetric{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing custom metric. This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "analytics.management.customMetrics.patch", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "customMetricId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the custom metric to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "customMetricId": { + // "description": "Custom metric ID for the custom metric to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "ignoreCustomDataSourceLinks": { + // "default": "false", + // "description": "Force the update and ignore any warnings related to the custom metric being linked to a custom data source / data set.", + // "location": "query", + // "type": "boolean" + // }, + // "webPropertyId": { + // "description": "Web property ID for the custom metric to update.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}", + // "request": { + // "$ref": "CustomMetric" + // }, + // "response": { + // "$ref": "CustomMetric" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.customMetrics.update": + +type ManagementCustomMetricsUpdateCall struct { + s *Service + accountId string + webPropertyId string + customMetricId string + custommetric *CustomMetric + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates an existing custom metric. +func (r *ManagementCustomMetricsService) Update(accountId string, webPropertyId string, customMetricId string, custommetric *CustomMetric) *ManagementCustomMetricsUpdateCall { + c := &ManagementCustomMetricsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customMetricId = customMetricId + c.custommetric = custommetric + return c +} + +// IgnoreCustomDataSourceLinks sets the optional parameter +// "ignoreCustomDataSourceLinks": Force the update and ignore any +// warnings related to the custom metric being linked to a custom data +// source / data set. +func (c *ManagementCustomMetricsUpdateCall) IgnoreCustomDataSourceLinks(ignoreCustomDataSourceLinks bool) *ManagementCustomMetricsUpdateCall { + c.urlParams_.Set("ignoreCustomDataSourceLinks", fmt.Sprint(ignoreCustomDataSourceLinks)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementCustomMetricsUpdateCall) Fields(s ...googleapi.Field) *ManagementCustomMetricsUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementCustomMetricsUpdateCall) Context(ctx context.Context) *ManagementCustomMetricsUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementCustomMetricsUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementCustomMetricsUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.custommetric) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "customMetricId": c.customMetricId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.customMetrics.update" call. +// Exactly one of *CustomMetric or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *CustomMetric.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementCustomMetricsUpdateCall) Do(opts ...googleapi.CallOption) (*CustomMetric, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CustomMetric{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing custom metric.", + // "httpMethod": "PUT", + // "id": "analytics.management.customMetrics.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "customMetricId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the custom metric to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "customMetricId": { + // "description": "Custom metric ID for the custom metric to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "ignoreCustomDataSourceLinks": { + // "default": "false", + // "description": "Force the update and ignore any warnings related to the custom metric being linked to a custom data source / data set.", + // "location": "query", + // "type": "boolean" + // }, + // "webPropertyId": { + // "description": "Web property ID for the custom metric to update.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}", + // "request": { + // "$ref": "CustomMetric" + // }, + // "response": { + // "$ref": "CustomMetric" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.experiments.delete": + +type ManagementExperimentsDeleteCall struct { + s *Service + accountId string + webPropertyId string + profileId string + experimentId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Delete an experiment. +func (r *ManagementExperimentsService) Delete(accountId string, webPropertyId string, profileId string, experimentId string) *ManagementExperimentsDeleteCall { + c := &ManagementExperimentsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.experimentId = experimentId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementExperimentsDeleteCall) Fields(s ...googleapi.Field) *ManagementExperimentsDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementExperimentsDeleteCall) Context(ctx context.Context) *ManagementExperimentsDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementExperimentsDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementExperimentsDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("DELETE", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "experimentId": c.experimentId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.experiments.delete" call. +func (c *ManagementExperimentsDeleteCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Delete an experiment.", + // "httpMethod": "DELETE", + // "id": "analytics.management.experiments.delete", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "experimentId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which the experiment belongs", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "experimentId": { + // "description": "ID of the experiment to delete", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to which the experiment belongs", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to which the experiment belongs", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}", + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.experiments.get": + +type ManagementExperimentsGetCall struct { + s *Service + accountId string + webPropertyId string + profileId string + experimentId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns an experiment to which the user has access. +func (r *ManagementExperimentsService) Get(accountId string, webPropertyId string, profileId string, experimentId string) *ManagementExperimentsGetCall { + c := &ManagementExperimentsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.experimentId = experimentId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementExperimentsGetCall) Fields(s ...googleapi.Field) *ManagementExperimentsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementExperimentsGetCall) IfNoneMatch(entityTag string) *ManagementExperimentsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementExperimentsGetCall) Context(ctx context.Context) *ManagementExperimentsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementExperimentsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementExperimentsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "experimentId": c.experimentId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.experiments.get" call. +// Exactly one of *Experiment or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Experiment.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementExperimentsGetCall) Do(opts ...googleapi.CallOption) (*Experiment, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Experiment{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns an experiment to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.experiments.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "experimentId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve the experiment for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "experimentId": { + // "description": "Experiment ID to retrieve the experiment for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to retrieve the experiment for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve the experiment for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}", + // "response": { + // "$ref": "Experiment" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.experiments.insert": + +type ManagementExperimentsInsertCall struct { + s *Service + accountId string + webPropertyId string + profileId string + experiment *Experiment + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Create a new experiment. +func (r *ManagementExperimentsService) Insert(accountId string, webPropertyId string, profileId string, experiment *Experiment) *ManagementExperimentsInsertCall { + c := &ManagementExperimentsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.experiment = experiment + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementExperimentsInsertCall) Fields(s ...googleapi.Field) *ManagementExperimentsInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementExperimentsInsertCall) Context(ctx context.Context) *ManagementExperimentsInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementExperimentsInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementExperimentsInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.experiment) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.experiments.insert" call. +// Exactly one of *Experiment or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Experiment.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementExperimentsInsertCall) Do(opts ...googleapi.CallOption) (*Experiment, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Experiment{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Create a new experiment.", + // "httpMethod": "POST", + // "id": "analytics.management.experiments.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to create the experiment for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to create the experiment for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to create the experiment for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments", + // "request": { + // "$ref": "Experiment" + // }, + // "response": { + // "$ref": "Experiment" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.experiments.list": + +type ManagementExperimentsListCall struct { + s *Service + accountId string + webPropertyId string + profileId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists experiments to which the user has access. +func (r *ManagementExperimentsService) List(accountId string, webPropertyId string, profileId string) *ManagementExperimentsListCall { + c := &ManagementExperimentsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of experiments to include in this response. +func (c *ManagementExperimentsListCall) MaxResults(maxResults int64) *ManagementExperimentsListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first experiment to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementExperimentsListCall) StartIndex(startIndex int64) *ManagementExperimentsListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementExperimentsListCall) Fields(s ...googleapi.Field) *ManagementExperimentsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementExperimentsListCall) IfNoneMatch(entityTag string) *ManagementExperimentsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementExperimentsListCall) Context(ctx context.Context) *ManagementExperimentsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementExperimentsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementExperimentsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.experiments.list" call. +// Exactly one of *Experiments or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Experiments.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementExperimentsListCall) Do(opts ...googleapi.CallOption) (*Experiments, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Experiments{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists experiments to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.experiments.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve experiments for.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of experiments to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "profileId": { + // "description": "View (Profile) ID to retrieve experiments for.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "start-index": { + // "description": "An index of the first experiment to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve experiments for.", + // "location": "path", + // "pattern": "UA-(\\d+)-(\\d+)", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments", + // "response": { + // "$ref": "Experiments" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.experiments.patch": + +type ManagementExperimentsPatchCall struct { + s *Service + accountId string + webPropertyId string + profileId string + experimentId string + experiment *Experiment + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Update an existing experiment. This method supports patch +// semantics. +func (r *ManagementExperimentsService) Patch(accountId string, webPropertyId string, profileId string, experimentId string, experiment *Experiment) *ManagementExperimentsPatchCall { + c := &ManagementExperimentsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.experimentId = experimentId + c.experiment = experiment + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementExperimentsPatchCall) Fields(s ...googleapi.Field) *ManagementExperimentsPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementExperimentsPatchCall) Context(ctx context.Context) *ManagementExperimentsPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementExperimentsPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementExperimentsPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.experiment) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "experimentId": c.experimentId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.experiments.patch" call. +// Exactly one of *Experiment or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Experiment.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementExperimentsPatchCall) Do(opts ...googleapi.CallOption) (*Experiment, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Experiment{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Update an existing experiment. This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "analytics.management.experiments.patch", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "experimentId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID of the experiment to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "experimentId": { + // "description": "Experiment ID of the experiment to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID of the experiment to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID of the experiment to update.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}", + // "request": { + // "$ref": "Experiment" + // }, + // "response": { + // "$ref": "Experiment" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.experiments.update": + +type ManagementExperimentsUpdateCall struct { + s *Service + accountId string + webPropertyId string + profileId string + experimentId string + experiment *Experiment + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Update an existing experiment. +func (r *ManagementExperimentsService) Update(accountId string, webPropertyId string, profileId string, experimentId string, experiment *Experiment) *ManagementExperimentsUpdateCall { + c := &ManagementExperimentsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.experimentId = experimentId + c.experiment = experiment + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementExperimentsUpdateCall) Fields(s ...googleapi.Field) *ManagementExperimentsUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementExperimentsUpdateCall) Context(ctx context.Context) *ManagementExperimentsUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementExperimentsUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementExperimentsUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.experiment) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "experimentId": c.experimentId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.experiments.update" call. +// Exactly one of *Experiment or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Experiment.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementExperimentsUpdateCall) Do(opts ...googleapi.CallOption) (*Experiment, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Experiment{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Update an existing experiment.", + // "httpMethod": "PUT", + // "id": "analytics.management.experiments.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "experimentId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID of the experiment to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "experimentId": { + // "description": "Experiment ID of the experiment to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID of the experiment to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID of the experiment to update.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}", + // "request": { + // "$ref": "Experiment" + // }, + // "response": { + // "$ref": "Experiment" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.filters.delete": + +type ManagementFiltersDeleteCall struct { + s *Service + accountId string + filterId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Delete a filter. +func (r *ManagementFiltersService) Delete(accountId string, filterId string) *ManagementFiltersDeleteCall { + c := &ManagementFiltersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.filterId = filterId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementFiltersDeleteCall) Fields(s ...googleapi.Field) *ManagementFiltersDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementFiltersDeleteCall) Context(ctx context.Context) *ManagementFiltersDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementFiltersDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementFiltersDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/filters/{filterId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("DELETE", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "filterId": c.filterId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.filters.delete" call. +// Exactly one of *Filter or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Filter.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementFiltersDeleteCall) Do(opts ...googleapi.CallOption) (*Filter, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Filter{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Delete a filter.", + // "httpMethod": "DELETE", + // "id": "analytics.management.filters.delete", + // "parameterOrder": [ + // "accountId", + // "filterId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to delete the filter for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "filterId": { + // "description": "ID of the filter to be deleted.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/filters/{filterId}", + // "response": { + // "$ref": "Filter" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.filters.get": + +type ManagementFiltersGetCall struct { + s *Service + accountId string + filterId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns filters to which the user has access. +func (r *ManagementFiltersService) Get(accountId string, filterId string) *ManagementFiltersGetCall { + c := &ManagementFiltersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.filterId = filterId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementFiltersGetCall) Fields(s ...googleapi.Field) *ManagementFiltersGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementFiltersGetCall) IfNoneMatch(entityTag string) *ManagementFiltersGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementFiltersGetCall) Context(ctx context.Context) *ManagementFiltersGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementFiltersGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementFiltersGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/filters/{filterId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "filterId": c.filterId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.filters.get" call. +// Exactly one of *Filter or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Filter.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementFiltersGetCall) Do(opts ...googleapi.CallOption) (*Filter, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Filter{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns filters to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.filters.get", + // "parameterOrder": [ + // "accountId", + // "filterId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve filters for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "filterId": { + // "description": "Filter ID to retrieve filters for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/filters/{filterId}", + // "response": { + // "$ref": "Filter" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.filters.insert": + +type ManagementFiltersInsertCall struct { + s *Service + accountId string + filter *Filter + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Create a new filter. +func (r *ManagementFiltersService) Insert(accountId string, filter *Filter) *ManagementFiltersInsertCall { + c := &ManagementFiltersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.filter = filter + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementFiltersInsertCall) Fields(s ...googleapi.Field) *ManagementFiltersInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementFiltersInsertCall) Context(ctx context.Context) *ManagementFiltersInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementFiltersInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementFiltersInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.filter) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/filters") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.filters.insert" call. +// Exactly one of *Filter or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Filter.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementFiltersInsertCall) Do(opts ...googleapi.CallOption) (*Filter, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Filter{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Create a new filter.", + // "httpMethod": "POST", + // "id": "analytics.management.filters.insert", + // "parameterOrder": [ + // "accountId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to create filter for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/filters", + // "request": { + // "$ref": "Filter" + // }, + // "response": { + // "$ref": "Filter" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.filters.list": + +type ManagementFiltersListCall struct { + s *Service + accountId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists all filters for an account +func (r *ManagementFiltersService) List(accountId string) *ManagementFiltersListCall { + c := &ManagementFiltersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of filters to include in this response. +func (c *ManagementFiltersListCall) MaxResults(maxResults int64) *ManagementFiltersListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first entity to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementFiltersListCall) StartIndex(startIndex int64) *ManagementFiltersListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementFiltersListCall) Fields(s ...googleapi.Field) *ManagementFiltersListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementFiltersListCall) IfNoneMatch(entityTag string) *ManagementFiltersListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementFiltersListCall) Context(ctx context.Context) *ManagementFiltersListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementFiltersListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementFiltersListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/filters") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.filters.list" call. +// Exactly one of *Filters or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Filters.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementFiltersListCall) Do(opts ...googleapi.CallOption) (*Filters, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Filters{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists all filters for an account", + // "httpMethod": "GET", + // "id": "analytics.management.filters.list", + // "parameterOrder": [ + // "accountId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve filters for.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of filters to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // } + // }, + // "path": "management/accounts/{accountId}/filters", + // "response": { + // "$ref": "Filters" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.filters.patch": + +type ManagementFiltersPatchCall struct { + s *Service + accountId string + filterId string + filter *Filter + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Updates an existing filter. This method supports patch +// semantics. +func (r *ManagementFiltersService) Patch(accountId string, filterId string, filter *Filter) *ManagementFiltersPatchCall { + c := &ManagementFiltersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.filterId = filterId + c.filter = filter + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementFiltersPatchCall) Fields(s ...googleapi.Field) *ManagementFiltersPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementFiltersPatchCall) Context(ctx context.Context) *ManagementFiltersPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementFiltersPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementFiltersPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.filter) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/filters/{filterId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "filterId": c.filterId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.filters.patch" call. +// Exactly one of *Filter or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Filter.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementFiltersPatchCall) Do(opts ...googleapi.CallOption) (*Filter, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Filter{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing filter. This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "analytics.management.filters.patch", + // "parameterOrder": [ + // "accountId", + // "filterId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which the filter belongs.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "filterId": { + // "description": "ID of the filter to be updated.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/filters/{filterId}", + // "request": { + // "$ref": "Filter" + // }, + // "response": { + // "$ref": "Filter" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.filters.update": + +type ManagementFiltersUpdateCall struct { + s *Service + accountId string + filterId string + filter *Filter + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates an existing filter. +func (r *ManagementFiltersService) Update(accountId string, filterId string, filter *Filter) *ManagementFiltersUpdateCall { + c := &ManagementFiltersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.filterId = filterId + c.filter = filter + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementFiltersUpdateCall) Fields(s ...googleapi.Field) *ManagementFiltersUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementFiltersUpdateCall) Context(ctx context.Context) *ManagementFiltersUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementFiltersUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementFiltersUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.filter) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/filters/{filterId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "filterId": c.filterId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.filters.update" call. +// Exactly one of *Filter or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Filter.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementFiltersUpdateCall) Do(opts ...googleapi.CallOption) (*Filter, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Filter{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing filter.", + // "httpMethod": "PUT", + // "id": "analytics.management.filters.update", + // "parameterOrder": [ + // "accountId", + // "filterId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which the filter belongs.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "filterId": { + // "description": "ID of the filter to be updated.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/filters/{filterId}", + // "request": { + // "$ref": "Filter" + // }, + // "response": { + // "$ref": "Filter" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.goals.get": + +type ManagementGoalsGetCall struct { + s *Service + accountId string + webPropertyId string + profileId string + goalId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Gets a goal to which the user has access. +func (r *ManagementGoalsService) Get(accountId string, webPropertyId string, profileId string, goalId string) *ManagementGoalsGetCall { + c := &ManagementGoalsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.goalId = goalId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementGoalsGetCall) Fields(s ...googleapi.Field) *ManagementGoalsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementGoalsGetCall) IfNoneMatch(entityTag string) *ManagementGoalsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementGoalsGetCall) Context(ctx context.Context) *ManagementGoalsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementGoalsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementGoalsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "goalId": c.goalId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.goals.get" call. +// Exactly one of *Goal or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Goal.ServerResponse.Header or (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *ManagementGoalsGetCall) Do(opts ...googleapi.CallOption) (*Goal, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Goal{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Gets a goal to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.goals.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "goalId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve the goal for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "goalId": { + // "description": "Goal ID to retrieve the goal for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to retrieve the goal for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve the goal for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}", + // "response": { + // "$ref": "Goal" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.goals.insert": + +type ManagementGoalsInsertCall struct { + s *Service + accountId string + webPropertyId string + profileId string + goal *Goal + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Create a new goal. +func (r *ManagementGoalsService) Insert(accountId string, webPropertyId string, profileId string, goal *Goal) *ManagementGoalsInsertCall { + c := &ManagementGoalsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.goal = goal + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementGoalsInsertCall) Fields(s ...googleapi.Field) *ManagementGoalsInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementGoalsInsertCall) Context(ctx context.Context) *ManagementGoalsInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementGoalsInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementGoalsInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.goal) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.goals.insert" call. +// Exactly one of *Goal or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Goal.ServerResponse.Header or (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *ManagementGoalsInsertCall) Do(opts ...googleapi.CallOption) (*Goal, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Goal{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Create a new goal.", + // "httpMethod": "POST", + // "id": "analytics.management.goals.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to create the goal for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to create the goal for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to create the goal for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals", + // "request": { + // "$ref": "Goal" + // }, + // "response": { + // "$ref": "Goal" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.goals.list": + +type ManagementGoalsListCall struct { + s *Service + accountId string + webPropertyId string + profileId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists goals to which the user has access. +func (r *ManagementGoalsService) List(accountId string, webPropertyId string, profileId string) *ManagementGoalsListCall { + c := &ManagementGoalsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of goals to include in this response. +func (c *ManagementGoalsListCall) MaxResults(maxResults int64) *ManagementGoalsListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first goal to retrieve. Use this parameter as a pagination mechanism +// along with the max-results parameter. +func (c *ManagementGoalsListCall) StartIndex(startIndex int64) *ManagementGoalsListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementGoalsListCall) Fields(s ...googleapi.Field) *ManagementGoalsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementGoalsListCall) IfNoneMatch(entityTag string) *ManagementGoalsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementGoalsListCall) Context(ctx context.Context) *ManagementGoalsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementGoalsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementGoalsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.goals.list" call. +// Exactly one of *Goals or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Goals.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementGoalsListCall) Do(opts ...googleapi.CallOption) (*Goals, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Goals{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists goals to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.goals.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve goals for. Can either be a specific account ID or '~all', which refers to all the accounts that user has access to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of goals to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "profileId": { + // "description": "View (Profile) ID to retrieve goals for. Can either be a specific view (profile) ID or '~all', which refers to all the views (profiles) that user has access to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "start-index": { + // "description": "An index of the first goal to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve goals for. Can either be a specific web property ID or '~all', which refers to all the web properties that user has access to.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals", + // "response": { + // "$ref": "Goals" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.goals.patch": + +type ManagementGoalsPatchCall struct { + s *Service + accountId string + webPropertyId string + profileId string + goalId string + goal *Goal + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Updates an existing goal. This method supports patch +// semantics. +func (r *ManagementGoalsService) Patch(accountId string, webPropertyId string, profileId string, goalId string, goal *Goal) *ManagementGoalsPatchCall { + c := &ManagementGoalsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.goalId = goalId + c.goal = goal + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementGoalsPatchCall) Fields(s ...googleapi.Field) *ManagementGoalsPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementGoalsPatchCall) Context(ctx context.Context) *ManagementGoalsPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementGoalsPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementGoalsPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.goal) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "goalId": c.goalId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.goals.patch" call. +// Exactly one of *Goal or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Goal.ServerResponse.Header or (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *ManagementGoalsPatchCall) Do(opts ...googleapi.CallOption) (*Goal, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Goal{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing goal. This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "analytics.management.goals.patch", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "goalId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to update the goal.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "goalId": { + // "description": "Index of the goal to be updated.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to update the goal.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to update the goal.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}", + // "request": { + // "$ref": "Goal" + // }, + // "response": { + // "$ref": "Goal" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.goals.update": + +type ManagementGoalsUpdateCall struct { + s *Service + accountId string + webPropertyId string + profileId string + goalId string + goal *Goal + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates an existing goal. +func (r *ManagementGoalsService) Update(accountId string, webPropertyId string, profileId string, goalId string, goal *Goal) *ManagementGoalsUpdateCall { + c := &ManagementGoalsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.goalId = goalId + c.goal = goal + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementGoalsUpdateCall) Fields(s ...googleapi.Field) *ManagementGoalsUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementGoalsUpdateCall) Context(ctx context.Context) *ManagementGoalsUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementGoalsUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementGoalsUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.goal) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "goalId": c.goalId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.goals.update" call. +// Exactly one of *Goal or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Goal.ServerResponse.Header or (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *ManagementGoalsUpdateCall) Do(opts ...googleapi.CallOption) (*Goal, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Goal{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing goal.", + // "httpMethod": "PUT", + // "id": "analytics.management.goals.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "goalId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to update the goal.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "goalId": { + // "description": "Index of the goal to be updated.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to update the goal.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to update the goal.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}", + // "request": { + // "$ref": "Goal" + // }, + // "response": { + // "$ref": "Goal" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.profileFilterLinks.delete": + +type ManagementProfileFilterLinksDeleteCall struct { + s *Service + accountId string + webPropertyId string + profileId string + linkId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Delete a profile filter link. +func (r *ManagementProfileFilterLinksService) Delete(accountId string, webPropertyId string, profileId string, linkId string) *ManagementProfileFilterLinksDeleteCall { + c := &ManagementProfileFilterLinksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.linkId = linkId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfileFilterLinksDeleteCall) Fields(s ...googleapi.Field) *ManagementProfileFilterLinksDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfileFilterLinksDeleteCall) Context(ctx context.Context) *ManagementProfileFilterLinksDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfileFilterLinksDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfileFilterLinksDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("DELETE", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "linkId": c.linkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profileFilterLinks.delete" call. +func (c *ManagementProfileFilterLinksDeleteCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Delete a profile filter link.", + // "httpMethod": "DELETE", + // "id": "analytics.management.profileFilterLinks.delete", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "linkId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which the profile filter link belongs.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "linkId": { + // "description": "ID of the profile filter link to delete.", + // "location": "path", + // "pattern": "\\d+:\\d+", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "Profile ID to which the filter link belongs.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property Id to which the profile filter link belongs.", + // "location": "path", + // "pattern": "UA-(\\d+)-(\\d+)", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}", + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.profileFilterLinks.get": + +type ManagementProfileFilterLinksGetCall struct { + s *Service + accountId string + webPropertyId string + profileId string + linkId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns a single profile filter link. +func (r *ManagementProfileFilterLinksService) Get(accountId string, webPropertyId string, profileId string, linkId string) *ManagementProfileFilterLinksGetCall { + c := &ManagementProfileFilterLinksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.linkId = linkId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfileFilterLinksGetCall) Fields(s ...googleapi.Field) *ManagementProfileFilterLinksGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementProfileFilterLinksGetCall) IfNoneMatch(entityTag string) *ManagementProfileFilterLinksGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfileFilterLinksGetCall) Context(ctx context.Context) *ManagementProfileFilterLinksGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfileFilterLinksGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfileFilterLinksGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "linkId": c.linkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profileFilterLinks.get" call. +// Exactly one of *ProfileFilterLink or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *ProfileFilterLink.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementProfileFilterLinksGetCall) Do(opts ...googleapi.CallOption) (*ProfileFilterLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &ProfileFilterLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns a single profile filter link.", + // "httpMethod": "GET", + // "id": "analytics.management.profileFilterLinks.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "linkId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve profile filter link for.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "linkId": { + // "description": "ID of the profile filter link.", + // "location": "path", + // "pattern": "\\d+:\\d+", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "Profile ID to retrieve filter link for.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property Id to retrieve profile filter link for.", + // "location": "path", + // "pattern": "UA-(\\d+)-(\\d+)", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}", + // "response": { + // "$ref": "ProfileFilterLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.profileFilterLinks.insert": + +type ManagementProfileFilterLinksInsertCall struct { + s *Service + accountId string + webPropertyId string + profileId string + profilefilterlink *ProfileFilterLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Create a new profile filter link. +func (r *ManagementProfileFilterLinksService) Insert(accountId string, webPropertyId string, profileId string, profilefilterlink *ProfileFilterLink) *ManagementProfileFilterLinksInsertCall { + c := &ManagementProfileFilterLinksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.profilefilterlink = profilefilterlink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfileFilterLinksInsertCall) Fields(s ...googleapi.Field) *ManagementProfileFilterLinksInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfileFilterLinksInsertCall) Context(ctx context.Context) *ManagementProfileFilterLinksInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfileFilterLinksInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfileFilterLinksInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.profilefilterlink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profileFilterLinks.insert" call. +// Exactly one of *ProfileFilterLink or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *ProfileFilterLink.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementProfileFilterLinksInsertCall) Do(opts ...googleapi.CallOption) (*ProfileFilterLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &ProfileFilterLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Create a new profile filter link.", + // "httpMethod": "POST", + // "id": "analytics.management.profileFilterLinks.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to create profile filter link for.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "Profile ID to create filter link for.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property Id to create profile filter link for.", + // "location": "path", + // "pattern": "UA-(\\d+)-(\\d+)", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks", + // "request": { + // "$ref": "ProfileFilterLink" + // }, + // "response": { + // "$ref": "ProfileFilterLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.profileFilterLinks.list": + +type ManagementProfileFilterLinksListCall struct { + s *Service + accountId string + webPropertyId string + profileId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists all profile filter links for a profile. +func (r *ManagementProfileFilterLinksService) List(accountId string, webPropertyId string, profileId string) *ManagementProfileFilterLinksListCall { + c := &ManagementProfileFilterLinksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of profile filter links to include in this response. +func (c *ManagementProfileFilterLinksListCall) MaxResults(maxResults int64) *ManagementProfileFilterLinksListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first entity to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementProfileFilterLinksListCall) StartIndex(startIndex int64) *ManagementProfileFilterLinksListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfileFilterLinksListCall) Fields(s ...googleapi.Field) *ManagementProfileFilterLinksListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementProfileFilterLinksListCall) IfNoneMatch(entityTag string) *ManagementProfileFilterLinksListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfileFilterLinksListCall) Context(ctx context.Context) *ManagementProfileFilterLinksListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfileFilterLinksListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfileFilterLinksListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profileFilterLinks.list" call. +// Exactly one of *ProfileFilterLinks or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *ProfileFilterLinks.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementProfileFilterLinksListCall) Do(opts ...googleapi.CallOption) (*ProfileFilterLinks, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &ProfileFilterLinks{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists all profile filter links for a profile.", + // "httpMethod": "GET", + // "id": "analytics.management.profileFilterLinks.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve profile filter links for.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of profile filter links to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "profileId": { + // "description": "Profile ID to retrieve filter links for. Can either be a specific profile ID or '~all', which refers to all the profiles that user has access to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "start-index": { + // "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web property Id for profile filter links for. Can either be a specific web property ID or '~all', which refers to all the web properties that user has access to.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks", + // "response": { + // "$ref": "ProfileFilterLinks" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.profileFilterLinks.patch": + +type ManagementProfileFilterLinksPatchCall struct { + s *Service + accountId string + webPropertyId string + profileId string + linkId string + profilefilterlink *ProfileFilterLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Update an existing profile filter link. This method supports +// patch semantics. +func (r *ManagementProfileFilterLinksService) Patch(accountId string, webPropertyId string, profileId string, linkId string, profilefilterlink *ProfileFilterLink) *ManagementProfileFilterLinksPatchCall { + c := &ManagementProfileFilterLinksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.linkId = linkId + c.profilefilterlink = profilefilterlink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfileFilterLinksPatchCall) Fields(s ...googleapi.Field) *ManagementProfileFilterLinksPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfileFilterLinksPatchCall) Context(ctx context.Context) *ManagementProfileFilterLinksPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfileFilterLinksPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfileFilterLinksPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.profilefilterlink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "linkId": c.linkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profileFilterLinks.patch" call. +// Exactly one of *ProfileFilterLink or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *ProfileFilterLink.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementProfileFilterLinksPatchCall) Do(opts ...googleapi.CallOption) (*ProfileFilterLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &ProfileFilterLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Update an existing profile filter link. This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "analytics.management.profileFilterLinks.patch", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "linkId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which profile filter link belongs.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "linkId": { + // "description": "ID of the profile filter link to be updated.", + // "location": "path", + // "pattern": "\\d+:\\d+", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "Profile ID to which filter link belongs", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property Id to which profile filter link belongs", + // "location": "path", + // "pattern": "UA-(\\d+)-(\\d+)", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}", + // "request": { + // "$ref": "ProfileFilterLink" + // }, + // "response": { + // "$ref": "ProfileFilterLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.profileFilterLinks.update": + +type ManagementProfileFilterLinksUpdateCall struct { + s *Service + accountId string + webPropertyId string + profileId string + linkId string + profilefilterlink *ProfileFilterLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Update an existing profile filter link. +func (r *ManagementProfileFilterLinksService) Update(accountId string, webPropertyId string, profileId string, linkId string, profilefilterlink *ProfileFilterLink) *ManagementProfileFilterLinksUpdateCall { + c := &ManagementProfileFilterLinksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.linkId = linkId + c.profilefilterlink = profilefilterlink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfileFilterLinksUpdateCall) Fields(s ...googleapi.Field) *ManagementProfileFilterLinksUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfileFilterLinksUpdateCall) Context(ctx context.Context) *ManagementProfileFilterLinksUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfileFilterLinksUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfileFilterLinksUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.profilefilterlink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "linkId": c.linkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profileFilterLinks.update" call. +// Exactly one of *ProfileFilterLink or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *ProfileFilterLink.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementProfileFilterLinksUpdateCall) Do(opts ...googleapi.CallOption) (*ProfileFilterLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &ProfileFilterLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Update an existing profile filter link.", + // "httpMethod": "PUT", + // "id": "analytics.management.profileFilterLinks.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "linkId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which profile filter link belongs.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "linkId": { + // "description": "ID of the profile filter link to be updated.", + // "location": "path", + // "pattern": "\\d+:\\d+", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "Profile ID to which filter link belongs", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property Id to which profile filter link belongs", + // "location": "path", + // "pattern": "UA-(\\d+)-(\\d+)", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}", + // "request": { + // "$ref": "ProfileFilterLink" + // }, + // "response": { + // "$ref": "ProfileFilterLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.profileUserLinks.delete": + +type ManagementProfileUserLinksDeleteCall struct { + s *Service + accountId string + webPropertyId string + profileId string + linkId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Removes a user from the given view (profile). +func (r *ManagementProfileUserLinksService) Delete(accountId string, webPropertyId string, profileId string, linkId string) *ManagementProfileUserLinksDeleteCall { + c := &ManagementProfileUserLinksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.linkId = linkId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfileUserLinksDeleteCall) Fields(s ...googleapi.Field) *ManagementProfileUserLinksDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfileUserLinksDeleteCall) Context(ctx context.Context) *ManagementProfileUserLinksDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfileUserLinksDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfileUserLinksDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("DELETE", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "linkId": c.linkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profileUserLinks.delete" call. +func (c *ManagementProfileUserLinksDeleteCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Removes a user from the given view (profile).", + // "httpMethod": "DELETE", + // "id": "analytics.management.profileUserLinks.delete", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "linkId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to delete the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "linkId": { + // "description": "Link ID to delete the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to delete the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web Property ID to delete the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}", + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users" + // ] + // } + +} + +// method id "analytics.management.profileUserLinks.insert": + +type ManagementProfileUserLinksInsertCall struct { + s *Service + accountId string + webPropertyId string + profileId string + entityuserlink *EntityUserLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Adds a new user to the given view (profile). +func (r *ManagementProfileUserLinksService) Insert(accountId string, webPropertyId string, profileId string, entityuserlink *EntityUserLink) *ManagementProfileUserLinksInsertCall { + c := &ManagementProfileUserLinksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.entityuserlink = entityuserlink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfileUserLinksInsertCall) Fields(s ...googleapi.Field) *ManagementProfileUserLinksInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfileUserLinksInsertCall) Context(ctx context.Context) *ManagementProfileUserLinksInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfileUserLinksInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfileUserLinksInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profileUserLinks.insert" call. +// Exactly one of *EntityUserLink or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *EntityUserLink.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementProfileUserLinksInsertCall) Do(opts ...googleapi.CallOption) (*EntityUserLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityUserLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Adds a new user to the given view (profile).", + // "httpMethod": "POST", + // "id": "analytics.management.profileUserLinks.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to create the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to create the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web Property ID to create the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks", + // "request": { + // "$ref": "EntityUserLink" + // }, + // "response": { + // "$ref": "EntityUserLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users" + // ] + // } + +} + +// method id "analytics.management.profileUserLinks.list": + +type ManagementProfileUserLinksListCall struct { + s *Service + accountId string + webPropertyId string + profileId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists profile-user links for a given view (profile). +func (r *ManagementProfileUserLinksService) List(accountId string, webPropertyId string, profileId string) *ManagementProfileUserLinksListCall { + c := &ManagementProfileUserLinksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of profile-user links to include in this response. +func (c *ManagementProfileUserLinksListCall) MaxResults(maxResults int64) *ManagementProfileUserLinksListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first profile-user link to retrieve. Use this parameter as a +// pagination mechanism along with the max-results parameter. +func (c *ManagementProfileUserLinksListCall) StartIndex(startIndex int64) *ManagementProfileUserLinksListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfileUserLinksListCall) Fields(s ...googleapi.Field) *ManagementProfileUserLinksListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementProfileUserLinksListCall) IfNoneMatch(entityTag string) *ManagementProfileUserLinksListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfileUserLinksListCall) Context(ctx context.Context) *ManagementProfileUserLinksListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfileUserLinksListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfileUserLinksListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profileUserLinks.list" call. +// Exactly one of *EntityUserLinks or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *EntityUserLinks.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementProfileUserLinksListCall) Do(opts ...googleapi.CallOption) (*EntityUserLinks, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityUserLinks{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists profile-user links for a given view (profile).", + // "httpMethod": "GET", + // "id": "analytics.management.profileUserLinks.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID which the given view (profile) belongs to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of profile-user links to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "profileId": { + // "description": "View (Profile) ID to retrieve the profile-user links for. Can either be a specific profile ID or '~all', which refers to all the profiles that user has access to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "start-index": { + // "description": "An index of the first profile-user link to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web Property ID which the given view (profile) belongs to. Can either be a specific web property ID or '~all', which refers to all the web properties that user has access to.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks", + // "response": { + // "$ref": "EntityUserLinks" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users", + // "https://www.googleapis.com/auth/analytics.manage.users.readonly" + // ] + // } + +} + +// method id "analytics.management.profileUserLinks.update": + +type ManagementProfileUserLinksUpdateCall struct { + s *Service + accountId string + webPropertyId string + profileId string + linkId string + entityuserlink *EntityUserLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates permissions for an existing user on the given view +// (profile). +func (r *ManagementProfileUserLinksService) Update(accountId string, webPropertyId string, profileId string, linkId string, entityuserlink *EntityUserLink) *ManagementProfileUserLinksUpdateCall { + c := &ManagementProfileUserLinksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.linkId = linkId + c.entityuserlink = entityuserlink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfileUserLinksUpdateCall) Fields(s ...googleapi.Field) *ManagementProfileUserLinksUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfileUserLinksUpdateCall) Context(ctx context.Context) *ManagementProfileUserLinksUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfileUserLinksUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfileUserLinksUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "linkId": c.linkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profileUserLinks.update" call. +// Exactly one of *EntityUserLink or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *EntityUserLink.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementProfileUserLinksUpdateCall) Do(opts ...googleapi.CallOption) (*EntityUserLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityUserLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates permissions for an existing user on the given view (profile).", + // "httpMethod": "PUT", + // "id": "analytics.management.profileUserLinks.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "linkId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to update the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "linkId": { + // "description": "Link ID to update the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile ID) to update the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web Property ID to update the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}", + // "request": { + // "$ref": "EntityUserLink" + // }, + // "response": { + // "$ref": "EntityUserLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users" + // ] + // } + +} + +// method id "analytics.management.profiles.delete": + +type ManagementProfilesDeleteCall struct { + s *Service + accountId string + webPropertyId string + profileId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes a view (profile). +func (r *ManagementProfilesService) Delete(accountId string, webPropertyId string, profileId string) *ManagementProfilesDeleteCall { + c := &ManagementProfilesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfilesDeleteCall) Fields(s ...googleapi.Field) *ManagementProfilesDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfilesDeleteCall) Context(ctx context.Context) *ManagementProfilesDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfilesDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfilesDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("DELETE", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profiles.delete" call. +func (c *ManagementProfilesDeleteCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Deletes a view (profile).", + // "httpMethod": "DELETE", + // "id": "analytics.management.profiles.delete", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to delete the view (profile) for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "ID of the view (profile) to be deleted.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to delete the view (profile) for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}", + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.profiles.get": + +type ManagementProfilesGetCall struct { + s *Service + accountId string + webPropertyId string + profileId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Gets a view (profile) to which the user has access. +func (r *ManagementProfilesService) Get(accountId string, webPropertyId string, profileId string) *ManagementProfilesGetCall { + c := &ManagementProfilesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfilesGetCall) Fields(s ...googleapi.Field) *ManagementProfilesGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementProfilesGetCall) IfNoneMatch(entityTag string) *ManagementProfilesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfilesGetCall) Context(ctx context.Context) *ManagementProfilesGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfilesGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfilesGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profiles.get" call. +// Exactly one of *Profile or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Profile.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementProfilesGetCall) Do(opts ...googleapi.CallOption) (*Profile, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Profile{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Gets a view (profile) to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.profiles.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve the view (profile) for.", + // "location": "path", + // "pattern": "[0-9]+", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to retrieve the view (profile) for.", + // "location": "path", + // "pattern": "[0-9]+", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve the view (profile) for.", + // "location": "path", + // "pattern": "UA-[0-9]+-[0-9]+", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}", + // "response": { + // "$ref": "Profile" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.profiles.insert": + +type ManagementProfilesInsertCall struct { + s *Service + accountId string + webPropertyId string + profile *Profile + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Create a new view (profile). +func (r *ManagementProfilesService) Insert(accountId string, webPropertyId string, profile *Profile) *ManagementProfilesInsertCall { + c := &ManagementProfilesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profile = profile + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfilesInsertCall) Fields(s ...googleapi.Field) *ManagementProfilesInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfilesInsertCall) Context(ctx context.Context) *ManagementProfilesInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfilesInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfilesInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.profile) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profiles.insert" call. +// Exactly one of *Profile or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Profile.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementProfilesInsertCall) Do(opts ...googleapi.CallOption) (*Profile, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Profile{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Create a new view (profile).", + // "httpMethod": "POST", + // "id": "analytics.management.profiles.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to create the view (profile) for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to create the view (profile) for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles", + // "request": { + // "$ref": "Profile" + // }, + // "response": { + // "$ref": "Profile" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.profiles.list": + +type ManagementProfilesListCall struct { + s *Service + accountId string + webPropertyId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists views (profiles) to which the user has access. +func (r *ManagementProfilesService) List(accountId string, webPropertyId string) *ManagementProfilesListCall { + c := &ManagementProfilesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of views (profiles) to include in this response. +func (c *ManagementProfilesListCall) MaxResults(maxResults int64) *ManagementProfilesListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first entity to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementProfilesListCall) StartIndex(startIndex int64) *ManagementProfilesListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfilesListCall) Fields(s ...googleapi.Field) *ManagementProfilesListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementProfilesListCall) IfNoneMatch(entityTag string) *ManagementProfilesListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfilesListCall) Context(ctx context.Context) *ManagementProfilesListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfilesListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfilesListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profiles.list" call. +// Exactly one of *Profiles or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Profiles.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementProfilesListCall) Do(opts ...googleapi.CallOption) (*Profiles, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Profiles{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists views (profiles) to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.profiles.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID for the view (profiles) to retrieve. Can either be a specific account ID or '~all', which refers to all the accounts to which the user has access.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of views (profiles) to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web property ID for the views (profiles) to retrieve. Can either be a specific web property ID or '~all', which refers to all the web properties to which the user has access.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles", + // "response": { + // "$ref": "Profiles" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.profiles.patch": + +type ManagementProfilesPatchCall struct { + s *Service + accountId string + webPropertyId string + profileId string + profile *Profile + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Updates an existing view (profile). This method supports patch +// semantics. +func (r *ManagementProfilesService) Patch(accountId string, webPropertyId string, profileId string, profile *Profile) *ManagementProfilesPatchCall { + c := &ManagementProfilesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.profile = profile + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfilesPatchCall) Fields(s ...googleapi.Field) *ManagementProfilesPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfilesPatchCall) Context(ctx context.Context) *ManagementProfilesPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfilesPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfilesPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.profile) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profiles.patch" call. +// Exactly one of *Profile or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Profile.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementProfilesPatchCall) Do(opts ...googleapi.CallOption) (*Profile, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Profile{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing view (profile). This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "analytics.management.profiles.patch", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which the view (profile) belongs", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "ID of the view (profile) to be updated.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to which the view (profile) belongs", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}", + // "request": { + // "$ref": "Profile" + // }, + // "response": { + // "$ref": "Profile" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.profiles.update": + +type ManagementProfilesUpdateCall struct { + s *Service + accountId string + webPropertyId string + profileId string + profile *Profile + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates an existing view (profile). +func (r *ManagementProfilesService) Update(accountId string, webPropertyId string, profileId string, profile *Profile) *ManagementProfilesUpdateCall { + c := &ManagementProfilesUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.profile = profile + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementProfilesUpdateCall) Fields(s ...googleapi.Field) *ManagementProfilesUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementProfilesUpdateCall) Context(ctx context.Context) *ManagementProfilesUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementProfilesUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementProfilesUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.profile) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.profiles.update" call. +// Exactly one of *Profile or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Profile.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementProfilesUpdateCall) Do(opts ...googleapi.CallOption) (*Profile, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Profile{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing view (profile).", + // "httpMethod": "PUT", + // "id": "analytics.management.profiles.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which the view (profile) belongs", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "ID of the view (profile) to be updated.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to which the view (profile) belongs", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}", + // "request": { + // "$ref": "Profile" + // }, + // "response": { + // "$ref": "Profile" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.remarketingAudience.delete": + +type ManagementRemarketingAudienceDeleteCall struct { + s *Service + accountId string + webPropertyId string + remarketingAudienceId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Delete a remarketing audience. +func (r *ManagementRemarketingAudienceService) Delete(accountId string, webPropertyId string, remarketingAudienceId string) *ManagementRemarketingAudienceDeleteCall { + c := &ManagementRemarketingAudienceDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.remarketingAudienceId = remarketingAudienceId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementRemarketingAudienceDeleteCall) Fields(s ...googleapi.Field) *ManagementRemarketingAudienceDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementRemarketingAudienceDeleteCall) Context(ctx context.Context) *ManagementRemarketingAudienceDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementRemarketingAudienceDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementRemarketingAudienceDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("DELETE", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "remarketingAudienceId": c.remarketingAudienceId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.remarketingAudience.delete" call. +func (c *ManagementRemarketingAudienceDeleteCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Delete a remarketing audience.", + // "httpMethod": "DELETE", + // "id": "analytics.management.remarketingAudience.delete", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "remarketingAudienceId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which the remarketing audience belongs.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "remarketingAudienceId": { + // "description": "The ID of the remarketing audience to delete.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to which the remarketing audience belongs.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}", + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.remarketingAudience.get": + +type ManagementRemarketingAudienceGetCall struct { + s *Service + accountId string + webPropertyId string + remarketingAudienceId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Gets a remarketing audience to which the user has access. +func (r *ManagementRemarketingAudienceService) Get(accountId string, webPropertyId string, remarketingAudienceId string) *ManagementRemarketingAudienceGetCall { + c := &ManagementRemarketingAudienceGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.remarketingAudienceId = remarketingAudienceId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementRemarketingAudienceGetCall) Fields(s ...googleapi.Field) *ManagementRemarketingAudienceGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementRemarketingAudienceGetCall) IfNoneMatch(entityTag string) *ManagementRemarketingAudienceGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementRemarketingAudienceGetCall) Context(ctx context.Context) *ManagementRemarketingAudienceGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementRemarketingAudienceGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementRemarketingAudienceGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "remarketingAudienceId": c.remarketingAudienceId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.remarketingAudience.get" call. +// Exactly one of *RemarketingAudience or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *RemarketingAudience.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementRemarketingAudienceGetCall) Do(opts ...googleapi.CallOption) (*RemarketingAudience, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RemarketingAudience{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Gets a remarketing audience to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.remarketingAudience.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "remarketingAudienceId" + // ], + // "parameters": { + // "accountId": { + // "description": "The account ID of the remarketing audience to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "remarketingAudienceId": { + // "description": "The ID of the remarketing audience to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "The web property ID of the remarketing audience to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}", + // "response": { + // "$ref": "RemarketingAudience" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.remarketingAudience.insert": + +type ManagementRemarketingAudienceInsertCall struct { + s *Service + accountId string + webPropertyId string + remarketingaudience *RemarketingAudience + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Creates a new remarketing audience. +func (r *ManagementRemarketingAudienceService) Insert(accountId string, webPropertyId string, remarketingaudience *RemarketingAudience) *ManagementRemarketingAudienceInsertCall { + c := &ManagementRemarketingAudienceInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.remarketingaudience = remarketingaudience + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementRemarketingAudienceInsertCall) Fields(s ...googleapi.Field) *ManagementRemarketingAudienceInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementRemarketingAudienceInsertCall) Context(ctx context.Context) *ManagementRemarketingAudienceInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementRemarketingAudienceInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementRemarketingAudienceInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketingaudience) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.remarketingAudience.insert" call. +// Exactly one of *RemarketingAudience or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *RemarketingAudience.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementRemarketingAudienceInsertCall) Do(opts ...googleapi.CallOption) (*RemarketingAudience, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RemarketingAudience{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Creates a new remarketing audience.", + // "httpMethod": "POST", + // "id": "analytics.management.remarketingAudience.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "The account ID for which to create the remarketing audience.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID for which to create the remarketing audience.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences", + // "request": { + // "$ref": "RemarketingAudience" + // }, + // "response": { + // "$ref": "RemarketingAudience" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.remarketingAudience.list": + +type ManagementRemarketingAudienceListCall struct { + s *Service + accountId string + webPropertyId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists remarketing audiences to which the user has access. +func (r *ManagementRemarketingAudienceService) List(accountId string, webPropertyId string) *ManagementRemarketingAudienceListCall { + c := &ManagementRemarketingAudienceListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of remarketing audiences to include in this response. +func (c *ManagementRemarketingAudienceListCall) MaxResults(maxResults int64) *ManagementRemarketingAudienceListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first entity to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementRemarketingAudienceListCall) StartIndex(startIndex int64) *ManagementRemarketingAudienceListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Type sets the optional parameter "type": +func (c *ManagementRemarketingAudienceListCall) Type(type_ string) *ManagementRemarketingAudienceListCall { + c.urlParams_.Set("type", type_) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementRemarketingAudienceListCall) Fields(s ...googleapi.Field) *ManagementRemarketingAudienceListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementRemarketingAudienceListCall) IfNoneMatch(entityTag string) *ManagementRemarketingAudienceListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementRemarketingAudienceListCall) Context(ctx context.Context) *ManagementRemarketingAudienceListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementRemarketingAudienceListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementRemarketingAudienceListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.remarketingAudience.list" call. +// Exactly one of *RemarketingAudiences or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *RemarketingAudiences.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementRemarketingAudienceListCall) Do(opts ...googleapi.CallOption) (*RemarketingAudiences, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RemarketingAudiences{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists remarketing audiences to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.remarketingAudience.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "The account ID of the remarketing audiences to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of remarketing audiences to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "type": { + // "default": "all", + // "location": "query", + // "type": "string" + // }, + // "webPropertyId": { + // "description": "The web property ID of the remarketing audiences to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences", + // "response": { + // "$ref": "RemarketingAudiences" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.remarketingAudience.patch": + +type ManagementRemarketingAudiencePatchCall struct { + s *Service + accountId string + webPropertyId string + remarketingAudienceId string + remarketingaudience *RemarketingAudience + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Updates an existing remarketing audience. This method supports +// patch semantics. +func (r *ManagementRemarketingAudienceService) Patch(accountId string, webPropertyId string, remarketingAudienceId string, remarketingaudience *RemarketingAudience) *ManagementRemarketingAudiencePatchCall { + c := &ManagementRemarketingAudiencePatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.remarketingAudienceId = remarketingAudienceId + c.remarketingaudience = remarketingaudience + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementRemarketingAudiencePatchCall) Fields(s ...googleapi.Field) *ManagementRemarketingAudiencePatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementRemarketingAudiencePatchCall) Context(ctx context.Context) *ManagementRemarketingAudiencePatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementRemarketingAudiencePatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementRemarketingAudiencePatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketingaudience) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "remarketingAudienceId": c.remarketingAudienceId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.remarketingAudience.patch" call. +// Exactly one of *RemarketingAudience or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *RemarketingAudience.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementRemarketingAudiencePatchCall) Do(opts ...googleapi.CallOption) (*RemarketingAudience, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RemarketingAudience{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing remarketing audience. This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "analytics.management.remarketingAudience.patch", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "remarketingAudienceId" + // ], + // "parameters": { + // "accountId": { + // "description": "The account ID of the remarketing audience to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "remarketingAudienceId": { + // "description": "The ID of the remarketing audience to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "The web property ID of the remarketing audience to update.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}", + // "request": { + // "$ref": "RemarketingAudience" + // }, + // "response": { + // "$ref": "RemarketingAudience" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.remarketingAudience.update": + +type ManagementRemarketingAudienceUpdateCall struct { + s *Service + accountId string + webPropertyId string + remarketingAudienceId string + remarketingaudience *RemarketingAudience + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates an existing remarketing audience. +func (r *ManagementRemarketingAudienceService) Update(accountId string, webPropertyId string, remarketingAudienceId string, remarketingaudience *RemarketingAudience) *ManagementRemarketingAudienceUpdateCall { + c := &ManagementRemarketingAudienceUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.remarketingAudienceId = remarketingAudienceId + c.remarketingaudience = remarketingaudience + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementRemarketingAudienceUpdateCall) Fields(s ...googleapi.Field) *ManagementRemarketingAudienceUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementRemarketingAudienceUpdateCall) Context(ctx context.Context) *ManagementRemarketingAudienceUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementRemarketingAudienceUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementRemarketingAudienceUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketingaudience) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "remarketingAudienceId": c.remarketingAudienceId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.remarketingAudience.update" call. +// Exactly one of *RemarketingAudience or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *RemarketingAudience.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementRemarketingAudienceUpdateCall) Do(opts ...googleapi.CallOption) (*RemarketingAudience, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RemarketingAudience{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing remarketing audience.", + // "httpMethod": "PUT", + // "id": "analytics.management.remarketingAudience.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "remarketingAudienceId" + // ], + // "parameters": { + // "accountId": { + // "description": "The account ID of the remarketing audience to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "remarketingAudienceId": { + // "description": "The ID of the remarketing audience to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "The web property ID of the remarketing audience to update.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}", + // "request": { + // "$ref": "RemarketingAudience" + // }, + // "response": { + // "$ref": "RemarketingAudience" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.segments.list": + +type ManagementSegmentsListCall struct { + s *Service + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists segments to which the user has access. +func (r *ManagementSegmentsService) List() *ManagementSegmentsListCall { + c := &ManagementSegmentsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of segments to include in this response. +func (c *ManagementSegmentsListCall) MaxResults(maxResults int64) *ManagementSegmentsListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first segment to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementSegmentsListCall) StartIndex(startIndex int64) *ManagementSegmentsListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementSegmentsListCall) Fields(s ...googleapi.Field) *ManagementSegmentsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementSegmentsListCall) IfNoneMatch(entityTag string) *ManagementSegmentsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementSegmentsListCall) Context(ctx context.Context) *ManagementSegmentsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementSegmentsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementSegmentsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/segments") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.segments.list" call. +// Exactly one of *Segments or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Segments.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementSegmentsListCall) Do(opts ...googleapi.CallOption) (*Segments, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Segments{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists segments to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.segments.list", + // "parameters": { + // "max-results": { + // "description": "The maximum number of segments to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first segment to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // } + // }, + // "path": "management/segments", + // "response": { + // "$ref": "Segments" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.unsampledReports.delete": + +type ManagementUnsampledReportsDeleteCall struct { + s *Service + accountId string + webPropertyId string + profileId string + unsampledReportId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes an unsampled report. +func (r *ManagementUnsampledReportsService) Delete(accountId string, webPropertyId string, profileId string, unsampledReportId string) *ManagementUnsampledReportsDeleteCall { + c := &ManagementUnsampledReportsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.unsampledReportId = unsampledReportId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementUnsampledReportsDeleteCall) Fields(s ...googleapi.Field) *ManagementUnsampledReportsDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementUnsampledReportsDeleteCall) Context(ctx context.Context) *ManagementUnsampledReportsDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementUnsampledReportsDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementUnsampledReportsDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("DELETE", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "unsampledReportId": c.unsampledReportId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.unsampledReports.delete" call. +func (c *ManagementUnsampledReportsDeleteCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Deletes an unsampled report.", + // "httpMethod": "DELETE", + // "id": "analytics.management.unsampledReports.delete", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "unsampledReportId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to delete the unsampled report for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to delete the unsampled report for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "unsampledReportId": { + // "description": "ID of the unsampled report to be deleted.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to delete the unsampled reports for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}", + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.unsampledReports.get": + +type ManagementUnsampledReportsGetCall struct { + s *Service + accountId string + webPropertyId string + profileId string + unsampledReportId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns a single unsampled report. +func (r *ManagementUnsampledReportsService) Get(accountId string, webPropertyId string, profileId string, unsampledReportId string) *ManagementUnsampledReportsGetCall { + c := &ManagementUnsampledReportsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.unsampledReportId = unsampledReportId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementUnsampledReportsGetCall) Fields(s ...googleapi.Field) *ManagementUnsampledReportsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementUnsampledReportsGetCall) IfNoneMatch(entityTag string) *ManagementUnsampledReportsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementUnsampledReportsGetCall) Context(ctx context.Context) *ManagementUnsampledReportsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementUnsampledReportsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementUnsampledReportsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + "unsampledReportId": c.unsampledReportId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.unsampledReports.get" call. +// Exactly one of *UnsampledReport or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *UnsampledReport.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementUnsampledReportsGetCall) Do(opts ...googleapi.CallOption) (*UnsampledReport, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &UnsampledReport{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns a single unsampled report.", + // "httpMethod": "GET", + // "id": "analytics.management.unsampledReports.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId", + // "unsampledReportId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve unsampled report for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to retrieve unsampled report for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "unsampledReportId": { + // "description": "ID of the unsampled report to retrieve.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve unsampled reports for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}", + // "response": { + // "$ref": "UnsampledReport" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.unsampledReports.insert": + +type ManagementUnsampledReportsInsertCall struct { + s *Service + accountId string + webPropertyId string + profileId string + unsampledreport *UnsampledReport + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Create a new unsampled report. +func (r *ManagementUnsampledReportsService) Insert(accountId string, webPropertyId string, profileId string, unsampledreport *UnsampledReport) *ManagementUnsampledReportsInsertCall { + c := &ManagementUnsampledReportsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + c.unsampledreport = unsampledreport + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementUnsampledReportsInsertCall) Fields(s ...googleapi.Field) *ManagementUnsampledReportsInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementUnsampledReportsInsertCall) Context(ctx context.Context) *ManagementUnsampledReportsInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementUnsampledReportsInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementUnsampledReportsInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.unsampledreport) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.unsampledReports.insert" call. +// Exactly one of *UnsampledReport or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *UnsampledReport.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementUnsampledReportsInsertCall) Do(opts ...googleapi.CallOption) (*UnsampledReport, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &UnsampledReport{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Create a new unsampled report.", + // "httpMethod": "POST", + // "id": "analytics.management.unsampledReports.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to create the unsampled report for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "profileId": { + // "description": "View (Profile) ID to create the unsampled report for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to create the unsampled report for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports", + // "request": { + // "$ref": "UnsampledReport" + // }, + // "response": { + // "$ref": "UnsampledReport" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.unsampledReports.list": + +type ManagementUnsampledReportsListCall struct { + s *Service + accountId string + webPropertyId string + profileId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists unsampled reports to which the user has access. +func (r *ManagementUnsampledReportsService) List(accountId string, webPropertyId string, profileId string) *ManagementUnsampledReportsListCall { + c := &ManagementUnsampledReportsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.profileId = profileId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of unsampled reports to include in this response. +func (c *ManagementUnsampledReportsListCall) MaxResults(maxResults int64) *ManagementUnsampledReportsListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first unsampled report to retrieve. Use this parameter as a +// pagination mechanism along with the max-results parameter. +func (c *ManagementUnsampledReportsListCall) StartIndex(startIndex int64) *ManagementUnsampledReportsListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementUnsampledReportsListCall) Fields(s ...googleapi.Field) *ManagementUnsampledReportsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementUnsampledReportsListCall) IfNoneMatch(entityTag string) *ManagementUnsampledReportsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementUnsampledReportsListCall) Context(ctx context.Context) *ManagementUnsampledReportsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementUnsampledReportsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementUnsampledReportsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "profileId": c.profileId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.unsampledReports.list" call. +// Exactly one of *UnsampledReports or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *UnsampledReports.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementUnsampledReportsListCall) Do(opts ...googleapi.CallOption) (*UnsampledReports, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &UnsampledReports{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists unsampled reports to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.unsampledReports.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "profileId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve unsampled reports for. Must be a specific account ID, ~all is not supported.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of unsampled reports to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "profileId": { + // "description": "View (Profile) ID to retrieve unsampled reports for. Must be a specific view (profile) ID, ~all is not supported.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "start-index": { + // "description": "An index of the first unsampled report to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve unsampled reports for. Must be a specific web property ID, ~all is not supported.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports", + // "response": { + // "$ref": "UnsampledReports" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.uploads.deleteUploadData": + +type ManagementUploadsDeleteUploadDataCall struct { + s *Service + accountId string + webPropertyId string + customDataSourceId string + analyticsdataimportdeleteuploaddatarequest *AnalyticsDataimportDeleteUploadDataRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// DeleteUploadData: Delete data associated with a previous upload. +func (r *ManagementUploadsService) DeleteUploadData(accountId string, webPropertyId string, customDataSourceId string, analyticsdataimportdeleteuploaddatarequest *AnalyticsDataimportDeleteUploadDataRequest) *ManagementUploadsDeleteUploadDataCall { + c := &ManagementUploadsDeleteUploadDataCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customDataSourceId = customDataSourceId + c.analyticsdataimportdeleteuploaddatarequest = analyticsdataimportdeleteuploaddatarequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementUploadsDeleteUploadDataCall) Fields(s ...googleapi.Field) *ManagementUploadsDeleteUploadDataCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementUploadsDeleteUploadDataCall) Context(ctx context.Context) *ManagementUploadsDeleteUploadDataCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementUploadsDeleteUploadDataCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementUploadsDeleteUploadDataCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.analyticsdataimportdeleteuploaddatarequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/deleteUploadData") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "customDataSourceId": c.customDataSourceId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.uploads.deleteUploadData" call. +func (c *ManagementUploadsDeleteUploadDataCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Delete data associated with a previous upload.", + // "httpMethod": "POST", + // "id": "analytics.management.uploads.deleteUploadData", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "customDataSourceId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account Id for the uploads to be deleted.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "customDataSourceId": { + // "description": "Custom data source Id for the uploads to be deleted.", + // "location": "path", + // "pattern": ".{22}", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property Id for the uploads to be deleted.", + // "location": "path", + // "pattern": "UA-(\\d+)-(\\d+)", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/deleteUploadData", + // "request": { + // "$ref": "AnalyticsDataimportDeleteUploadDataRequest" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.uploads.get": + +type ManagementUploadsGetCall struct { + s *Service + accountId string + webPropertyId string + customDataSourceId string + uploadId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: List uploads to which the user has access. +func (r *ManagementUploadsService) Get(accountId string, webPropertyId string, customDataSourceId string, uploadId string) *ManagementUploadsGetCall { + c := &ManagementUploadsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customDataSourceId = customDataSourceId + c.uploadId = uploadId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementUploadsGetCall) Fields(s ...googleapi.Field) *ManagementUploadsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementUploadsGetCall) IfNoneMatch(entityTag string) *ManagementUploadsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementUploadsGetCall) Context(ctx context.Context) *ManagementUploadsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementUploadsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementUploadsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads/{uploadId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "customDataSourceId": c.customDataSourceId, + "uploadId": c.uploadId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.uploads.get" call. +// Exactly one of *Upload or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Upload.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementUploadsGetCall) Do(opts ...googleapi.CallOption) (*Upload, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Upload{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "List uploads to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.uploads.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "customDataSourceId", + // "uploadId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account Id for the upload to retrieve.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "customDataSourceId": { + // "description": "Custom data source Id for upload to retrieve.", + // "location": "path", + // "pattern": ".{22}", + // "required": true, + // "type": "string" + // }, + // "uploadId": { + // "description": "Upload Id to retrieve.", + // "location": "path", + // "pattern": ".{22}", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property Id for the upload to retrieve.", + // "location": "path", + // "pattern": "UA-(\\d+)-(\\d+)", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads/{uploadId}", + // "response": { + // "$ref": "Upload" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.uploads.list": + +type ManagementUploadsListCall struct { + s *Service + accountId string + webPropertyId string + customDataSourceId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: List uploads to which the user has access. +func (r *ManagementUploadsService) List(accountId string, webPropertyId string, customDataSourceId string) *ManagementUploadsListCall { + c := &ManagementUploadsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customDataSourceId = customDataSourceId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of uploads to include in this response. +func (c *ManagementUploadsListCall) MaxResults(maxResults int64) *ManagementUploadsListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": A 1-based index +// of the first upload to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementUploadsListCall) StartIndex(startIndex int64) *ManagementUploadsListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementUploadsListCall) Fields(s ...googleapi.Field) *ManagementUploadsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementUploadsListCall) IfNoneMatch(entityTag string) *ManagementUploadsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementUploadsListCall) Context(ctx context.Context) *ManagementUploadsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementUploadsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementUploadsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "customDataSourceId": c.customDataSourceId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.uploads.list" call. +// Exactly one of *Uploads or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Uploads.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementUploadsListCall) Do(opts ...googleapi.CallOption) (*Uploads, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Uploads{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "List uploads to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.uploads.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "customDataSourceId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account Id for the uploads to retrieve.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "customDataSourceId": { + // "description": "Custom data source Id for uploads to retrieve.", + // "location": "path", + // "pattern": ".{22}", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of uploads to include in this response.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "start-index": { + // "description": "A 1-based index of the first upload to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web property Id for the uploads to retrieve.", + // "location": "path", + // "pattern": "UA-(\\d+)-(\\d+)", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads", + // "response": { + // "$ref": "Uploads" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.uploads.uploadData": + +type ManagementUploadsUploadDataCall struct { + s *Service + accountId string + webPropertyId string + customDataSourceId string + urlParams_ gensupport.URLParams + mediaInfo_ *gensupport.MediaInfo + ctx_ context.Context + header_ http.Header +} + +// UploadData: Upload data for a custom data source. +func (r *ManagementUploadsService) UploadData(accountId string, webPropertyId string, customDataSourceId string) *ManagementUploadsUploadDataCall { + c := &ManagementUploadsUploadDataCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.customDataSourceId = customDataSourceId + return c +} + +// Media specifies the media to upload in one or more chunks. The chunk +// size may be controlled by supplying a MediaOption generated by +// googleapi.ChunkSize. The chunk size defaults to +// googleapi.DefaultUploadChunkSize.The Content-Type header used in the +// upload request will be determined by sniffing the contents of r, +// unless a MediaOption generated by googleapi.ContentType is +// supplied. +// At most one of Media and ResumableMedia may be set. +func (c *ManagementUploadsUploadDataCall) Media(r io.Reader, options ...googleapi.MediaOption) *ManagementUploadsUploadDataCall { + c.mediaInfo_ = gensupport.NewInfoFromMedia(r, options) + return c +} + +// ResumableMedia specifies the media to upload in chunks and can be +// canceled with ctx. +// +// Deprecated: use Media instead. +// +// At most one of Media and ResumableMedia may be set. mediaType +// identifies the MIME media type of the upload, such as "image/png". If +// mediaType is "", it will be auto-detected. The provided ctx will +// supersede any context previously provided to the Context method. +func (c *ManagementUploadsUploadDataCall) ResumableMedia(ctx context.Context, r io.ReaderAt, size int64, mediaType string) *ManagementUploadsUploadDataCall { + c.ctx_ = ctx + c.mediaInfo_ = gensupport.NewInfoFromResumableMedia(r, size, mediaType) + return c +} + +// ProgressUpdater provides a callback function that will be called +// after every chunk. It should be a low-latency function in order to +// not slow down the upload operation. This should only be called when +// using ResumableMedia (as opposed to Media). +func (c *ManagementUploadsUploadDataCall) ProgressUpdater(pu googleapi.ProgressUpdater) *ManagementUploadsUploadDataCall { + c.mediaInfo_.SetProgressUpdater(pu) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementUploadsUploadDataCall) Fields(s ...googleapi.Field) *ManagementUploadsUploadDataCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +// This context will supersede any context previously provided to the +// ResumableMedia method. +func (c *ManagementUploadsUploadDataCall) Context(ctx context.Context) *ManagementUploadsUploadDataCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementUploadsUploadDataCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementUploadsUploadDataCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads") + if c.mediaInfo_ != nil { + urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1) + c.urlParams_.Set("uploadType", c.mediaInfo_.UploadType()) + } + if body == nil { + body = new(bytes.Buffer) + reqHeaders.Set("Content-Type", "application/json") + } + body, getBody, cleanup := c.mediaInfo_.UploadRequest(reqHeaders, body) + defer cleanup() + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + req.GetBody = getBody + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "customDataSourceId": c.customDataSourceId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.uploads.uploadData" call. +// Exactly one of *Upload or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Upload.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ManagementUploadsUploadDataCall) Do(opts ...googleapi.CallOption) (*Upload, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + rx := c.mediaInfo_.ResumableUpload(res.Header.Get("Location")) + if rx != nil { + rx.Client = c.s.client + rx.UserAgent = c.s.userAgent() + ctx := c.ctx_ + if ctx == nil { + ctx = context.TODO() + } + res, err = rx.Upload(ctx) + if err != nil { + return nil, err + } + defer res.Body.Close() + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + } + ret := &Upload{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Upload data for a custom data source.", + // "httpMethod": "POST", + // "id": "analytics.management.uploads.uploadData", + // "mediaUpload": { + // "accept": [ + // "application/octet-stream" + // ], + // "maxSize": "1GB", + // "protocols": { + // "resumable": { + // "multipart": true, + // "path": "/resumable/upload/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads" + // }, + // "simple": { + // "multipart": true, + // "path": "/upload/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads" + // } + // } + // }, + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "customDataSourceId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account Id associated with the upload.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "customDataSourceId": { + // "description": "Custom data source Id to which the data being uploaded belongs.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property UA-string associated with the upload.", + // "location": "path", + // "pattern": "UA-\\d+-\\d+", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads", + // "response": { + // "$ref": "Upload" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit" + // ], + // "supportsMediaUpload": true + // } + +} + +// method id "analytics.management.webPropertyAdWordsLinks.delete": + +type ManagementWebPropertyAdWordsLinksDeleteCall struct { + s *Service + accountId string + webPropertyId string + webPropertyAdWordsLinkId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes a web property-Google Ads link. +func (r *ManagementWebPropertyAdWordsLinksService) Delete(accountId string, webPropertyId string, webPropertyAdWordsLinkId string) *ManagementWebPropertyAdWordsLinksDeleteCall { + c := &ManagementWebPropertyAdWordsLinksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.webPropertyAdWordsLinkId = webPropertyAdWordsLinkId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebPropertyAdWordsLinksDeleteCall) Fields(s ...googleapi.Field) *ManagementWebPropertyAdWordsLinksDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebPropertyAdWordsLinksDeleteCall) Context(ctx context.Context) *ManagementWebPropertyAdWordsLinksDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebPropertyAdWordsLinksDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebPropertyAdWordsLinksDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("DELETE", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "webPropertyAdWordsLinkId": c.webPropertyAdWordsLinkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webPropertyAdWordsLinks.delete" call. +func (c *ManagementWebPropertyAdWordsLinksDeleteCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Deletes a web property-Google Ads link.", + // "httpMethod": "DELETE", + // "id": "analytics.management.webPropertyAdWordsLinks.delete", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "webPropertyAdWordsLinkId" + // ], + // "parameters": { + // "accountId": { + // "description": "ID of the account which the given web property belongs to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyAdWordsLinkId": { + // "description": "Web property Google Ads link ID.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to delete the Google Ads link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}", + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.webPropertyAdWordsLinks.get": + +type ManagementWebPropertyAdWordsLinksGetCall struct { + s *Service + accountId string + webPropertyId string + webPropertyAdWordsLinkId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns a web property-Google Ads link to which the user has +// access. +func (r *ManagementWebPropertyAdWordsLinksService) Get(accountId string, webPropertyId string, webPropertyAdWordsLinkId string) *ManagementWebPropertyAdWordsLinksGetCall { + c := &ManagementWebPropertyAdWordsLinksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.webPropertyAdWordsLinkId = webPropertyAdWordsLinkId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebPropertyAdWordsLinksGetCall) Fields(s ...googleapi.Field) *ManagementWebPropertyAdWordsLinksGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementWebPropertyAdWordsLinksGetCall) IfNoneMatch(entityTag string) *ManagementWebPropertyAdWordsLinksGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebPropertyAdWordsLinksGetCall) Context(ctx context.Context) *ManagementWebPropertyAdWordsLinksGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebPropertyAdWordsLinksGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebPropertyAdWordsLinksGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "webPropertyAdWordsLinkId": c.webPropertyAdWordsLinkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webPropertyAdWordsLinks.get" call. +// Exactly one of *EntityAdWordsLink or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *EntityAdWordsLink.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementWebPropertyAdWordsLinksGetCall) Do(opts ...googleapi.CallOption) (*EntityAdWordsLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityAdWordsLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns a web property-Google Ads link to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.webPropertyAdWordsLinks.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "webPropertyAdWordsLinkId" + // ], + // "parameters": { + // "accountId": { + // "description": "ID of the account which the given web property belongs to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyAdWordsLinkId": { + // "description": "Web property-Google Ads link ID.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve the Google Ads link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}", + // "response": { + // "$ref": "EntityAdWordsLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.webPropertyAdWordsLinks.insert": + +type ManagementWebPropertyAdWordsLinksInsertCall struct { + s *Service + accountId string + webPropertyId string + entityadwordslink *EntityAdWordsLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Creates a webProperty-Google Ads link. +func (r *ManagementWebPropertyAdWordsLinksService) Insert(accountId string, webPropertyId string, entityadwordslink *EntityAdWordsLink) *ManagementWebPropertyAdWordsLinksInsertCall { + c := &ManagementWebPropertyAdWordsLinksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.entityadwordslink = entityadwordslink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebPropertyAdWordsLinksInsertCall) Fields(s ...googleapi.Field) *ManagementWebPropertyAdWordsLinksInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebPropertyAdWordsLinksInsertCall) Context(ctx context.Context) *ManagementWebPropertyAdWordsLinksInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebPropertyAdWordsLinksInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebPropertyAdWordsLinksInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityadwordslink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webPropertyAdWordsLinks.insert" call. +// Exactly one of *EntityAdWordsLink or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *EntityAdWordsLink.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementWebPropertyAdWordsLinksInsertCall) Do(opts ...googleapi.CallOption) (*EntityAdWordsLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityAdWordsLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Creates a webProperty-Google Ads link.", + // "httpMethod": "POST", + // "id": "analytics.management.webPropertyAdWordsLinks.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "ID of the Google Analytics account to create the link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to create the link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks", + // "request": { + // "$ref": "EntityAdWordsLink" + // }, + // "response": { + // "$ref": "EntityAdWordsLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.webPropertyAdWordsLinks.list": + +type ManagementWebPropertyAdWordsLinksListCall struct { + s *Service + accountId string + webPropertyId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists webProperty-Google Ads links for a given web property. +func (r *ManagementWebPropertyAdWordsLinksService) List(accountId string, webPropertyId string) *ManagementWebPropertyAdWordsLinksListCall { + c := &ManagementWebPropertyAdWordsLinksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of webProperty-Google Ads links to include in this response. +func (c *ManagementWebPropertyAdWordsLinksListCall) MaxResults(maxResults int64) *ManagementWebPropertyAdWordsLinksListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first webProperty-Google Ads link to retrieve. Use this parameter as +// a pagination mechanism along with the max-results parameter. +func (c *ManagementWebPropertyAdWordsLinksListCall) StartIndex(startIndex int64) *ManagementWebPropertyAdWordsLinksListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebPropertyAdWordsLinksListCall) Fields(s ...googleapi.Field) *ManagementWebPropertyAdWordsLinksListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementWebPropertyAdWordsLinksListCall) IfNoneMatch(entityTag string) *ManagementWebPropertyAdWordsLinksListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebPropertyAdWordsLinksListCall) Context(ctx context.Context) *ManagementWebPropertyAdWordsLinksListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebPropertyAdWordsLinksListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebPropertyAdWordsLinksListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webPropertyAdWordsLinks.list" call. +// Exactly one of *EntityAdWordsLinks or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *EntityAdWordsLinks.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementWebPropertyAdWordsLinksListCall) Do(opts ...googleapi.CallOption) (*EntityAdWordsLinks, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityAdWordsLinks{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists webProperty-Google Ads links for a given web property.", + // "httpMethod": "GET", + // "id": "analytics.management.webPropertyAdWordsLinks.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "ID of the account which the given web property belongs to.", + // "location": "path", + // "pattern": "\\d+", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of webProperty-Google Ads links to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first webProperty-Google Ads link to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve the Google Ads links for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks", + // "response": { + // "$ref": "EntityAdWordsLinks" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.webPropertyAdWordsLinks.patch": + +type ManagementWebPropertyAdWordsLinksPatchCall struct { + s *Service + accountId string + webPropertyId string + webPropertyAdWordsLinkId string + entityadwordslink *EntityAdWordsLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Updates an existing webProperty-Google Ads link. This method +// supports patch semantics. +func (r *ManagementWebPropertyAdWordsLinksService) Patch(accountId string, webPropertyId string, webPropertyAdWordsLinkId string, entityadwordslink *EntityAdWordsLink) *ManagementWebPropertyAdWordsLinksPatchCall { + c := &ManagementWebPropertyAdWordsLinksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.webPropertyAdWordsLinkId = webPropertyAdWordsLinkId + c.entityadwordslink = entityadwordslink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebPropertyAdWordsLinksPatchCall) Fields(s ...googleapi.Field) *ManagementWebPropertyAdWordsLinksPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebPropertyAdWordsLinksPatchCall) Context(ctx context.Context) *ManagementWebPropertyAdWordsLinksPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebPropertyAdWordsLinksPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebPropertyAdWordsLinksPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityadwordslink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "webPropertyAdWordsLinkId": c.webPropertyAdWordsLinkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webPropertyAdWordsLinks.patch" call. +// Exactly one of *EntityAdWordsLink or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *EntityAdWordsLink.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementWebPropertyAdWordsLinksPatchCall) Do(opts ...googleapi.CallOption) (*EntityAdWordsLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityAdWordsLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing webProperty-Google Ads link. This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "analytics.management.webPropertyAdWordsLinks.patch", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "webPropertyAdWordsLinkId" + // ], + // "parameters": { + // "accountId": { + // "description": "ID of the account which the given web property belongs to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyAdWordsLinkId": { + // "description": "Web property-Google Ads link ID.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve the Google Ads link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}", + // "request": { + // "$ref": "EntityAdWordsLink" + // }, + // "response": { + // "$ref": "EntityAdWordsLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.webPropertyAdWordsLinks.update": + +type ManagementWebPropertyAdWordsLinksUpdateCall struct { + s *Service + accountId string + webPropertyId string + webPropertyAdWordsLinkId string + entityadwordslink *EntityAdWordsLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates an existing webProperty-Google Ads link. +func (r *ManagementWebPropertyAdWordsLinksService) Update(accountId string, webPropertyId string, webPropertyAdWordsLinkId string, entityadwordslink *EntityAdWordsLink) *ManagementWebPropertyAdWordsLinksUpdateCall { + c := &ManagementWebPropertyAdWordsLinksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.webPropertyAdWordsLinkId = webPropertyAdWordsLinkId + c.entityadwordslink = entityadwordslink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebPropertyAdWordsLinksUpdateCall) Fields(s ...googleapi.Field) *ManagementWebPropertyAdWordsLinksUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebPropertyAdWordsLinksUpdateCall) Context(ctx context.Context) *ManagementWebPropertyAdWordsLinksUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebPropertyAdWordsLinksUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebPropertyAdWordsLinksUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityadwordslink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "webPropertyAdWordsLinkId": c.webPropertyAdWordsLinkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webPropertyAdWordsLinks.update" call. +// Exactly one of *EntityAdWordsLink or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *EntityAdWordsLink.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementWebPropertyAdWordsLinksUpdateCall) Do(opts ...googleapi.CallOption) (*EntityAdWordsLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityAdWordsLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing webProperty-Google Ads link.", + // "httpMethod": "PUT", + // "id": "analytics.management.webPropertyAdWordsLinks.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "webPropertyAdWordsLinkId" + // ], + // "parameters": { + // "accountId": { + // "description": "ID of the account which the given web property belongs to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyAdWordsLinkId": { + // "description": "Web property-Google Ads link ID.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to retrieve the Google Ads link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}", + // "request": { + // "$ref": "EntityAdWordsLink" + // }, + // "response": { + // "$ref": "EntityAdWordsLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.webproperties.get": + +type ManagementWebpropertiesGetCall struct { + s *Service + accountId string + webPropertyId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Gets a web property to which the user has access. +func (r *ManagementWebpropertiesService) Get(accountId string, webPropertyId string) *ManagementWebpropertiesGetCall { + c := &ManagementWebpropertiesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebpropertiesGetCall) Fields(s ...googleapi.Field) *ManagementWebpropertiesGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementWebpropertiesGetCall) IfNoneMatch(entityTag string) *ManagementWebpropertiesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebpropertiesGetCall) Context(ctx context.Context) *ManagementWebpropertiesGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebpropertiesGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebpropertiesGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webproperties.get" call. +// Exactly one of *Webproperty or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Webproperty.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementWebpropertiesGetCall) Do(opts ...googleapi.CallOption) (*Webproperty, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Webproperty{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Gets a web property to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.webproperties.get", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve the web property for.", + // "location": "path", + // "pattern": "[0-9]+", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "ID to retrieve the web property for.", + // "location": "path", + // "pattern": "UA-[0-9]+-[0-9]+", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}", + // "response": { + // "$ref": "Webproperty" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.webproperties.insert": + +type ManagementWebpropertiesInsertCall struct { + s *Service + accountId string + webproperty *Webproperty + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Create a new property if the account has fewer than 20 +// properties. Web properties are visible in the Google Analytics +// interface only if they have at least one profile. +func (r *ManagementWebpropertiesService) Insert(accountId string, webproperty *Webproperty) *ManagementWebpropertiesInsertCall { + c := &ManagementWebpropertiesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webproperty = webproperty + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebpropertiesInsertCall) Fields(s ...googleapi.Field) *ManagementWebpropertiesInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebpropertiesInsertCall) Context(ctx context.Context) *ManagementWebpropertiesInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebpropertiesInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebpropertiesInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.webproperty) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webproperties.insert" call. +// Exactly one of *Webproperty or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Webproperty.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementWebpropertiesInsertCall) Do(opts ...googleapi.CallOption) (*Webproperty, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Webproperty{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Create a new property if the account has fewer than 20 properties. Web properties are visible in the Google Analytics interface only if they have at least one profile.", + // "httpMethod": "POST", + // "id": "analytics.management.webproperties.insert", + // "parameterOrder": [ + // "accountId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to create the web property for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties", + // "request": { + // "$ref": "Webproperty" + // }, + // "response": { + // "$ref": "Webproperty" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.webproperties.list": + +type ManagementWebpropertiesListCall struct { + s *Service + accountId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists web properties to which the user has access. +func (r *ManagementWebpropertiesService) List(accountId string) *ManagementWebpropertiesListCall { + c := &ManagementWebpropertiesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of web properties to include in this response. +func (c *ManagementWebpropertiesListCall) MaxResults(maxResults int64) *ManagementWebpropertiesListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first entity to retrieve. Use this parameter as a pagination +// mechanism along with the max-results parameter. +func (c *ManagementWebpropertiesListCall) StartIndex(startIndex int64) *ManagementWebpropertiesListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebpropertiesListCall) Fields(s ...googleapi.Field) *ManagementWebpropertiesListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementWebpropertiesListCall) IfNoneMatch(entityTag string) *ManagementWebpropertiesListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebpropertiesListCall) Context(ctx context.Context) *ManagementWebpropertiesListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebpropertiesListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebpropertiesListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webproperties.list" call. +// Exactly one of *Webproperties or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Webproperties.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementWebpropertiesListCall) Do(opts ...googleapi.CallOption) (*Webproperties, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Webproperties{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists web properties to which the user has access.", + // "httpMethod": "GET", + // "id": "analytics.management.webproperties.list", + // "parameterOrder": [ + // "accountId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to retrieve web properties for. Can either be a specific account ID or '~all', which refers to all the accounts that user has access to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of web properties to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first entity to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties", + // "response": { + // "$ref": "Webproperties" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.management.webproperties.patch": + +type ManagementWebpropertiesPatchCall struct { + s *Service + accountId string + webPropertyId string + webproperty *Webproperty + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Updates an existing web property. This method supports patch +// semantics. +func (r *ManagementWebpropertiesService) Patch(accountId string, webPropertyId string, webproperty *Webproperty) *ManagementWebpropertiesPatchCall { + c := &ManagementWebpropertiesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.webproperty = webproperty + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebpropertiesPatchCall) Fields(s ...googleapi.Field) *ManagementWebpropertiesPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebpropertiesPatchCall) Context(ctx context.Context) *ManagementWebpropertiesPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebpropertiesPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebpropertiesPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.webproperty) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PATCH", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webproperties.patch" call. +// Exactly one of *Webproperty or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Webproperty.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementWebpropertiesPatchCall) Do(opts ...googleapi.CallOption) (*Webproperty, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Webproperty{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing web property. This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "analytics.management.webproperties.patch", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which the web property belongs", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}", + // "request": { + // "$ref": "Webproperty" + // }, + // "response": { + // "$ref": "Webproperty" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.webproperties.update": + +type ManagementWebpropertiesUpdateCall struct { + s *Service + accountId string + webPropertyId string + webproperty *Webproperty + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates an existing web property. +func (r *ManagementWebpropertiesService) Update(accountId string, webPropertyId string, webproperty *Webproperty) *ManagementWebpropertiesUpdateCall { + c := &ManagementWebpropertiesUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.webproperty = webproperty + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebpropertiesUpdateCall) Fields(s ...googleapi.Field) *ManagementWebpropertiesUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebpropertiesUpdateCall) Context(ctx context.Context) *ManagementWebpropertiesUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebpropertiesUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebpropertiesUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.webproperty) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webproperties.update" call. +// Exactly one of *Webproperty or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Webproperty.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ManagementWebpropertiesUpdateCall) Do(opts ...googleapi.CallOption) (*Webproperty, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Webproperty{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an existing web property.", + // "httpMethod": "PUT", + // "id": "analytics.management.webproperties.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to which the web property belongs", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}", + // "request": { + // "$ref": "Webproperty" + // }, + // "response": { + // "$ref": "Webproperty" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.edit" + // ] + // } + +} + +// method id "analytics.management.webpropertyUserLinks.delete": + +type ManagementWebpropertyUserLinksDeleteCall struct { + s *Service + accountId string + webPropertyId string + linkId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Removes a user from the given web property. +func (r *ManagementWebpropertyUserLinksService) Delete(accountId string, webPropertyId string, linkId string) *ManagementWebpropertyUserLinksDeleteCall { + c := &ManagementWebpropertyUserLinksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.linkId = linkId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebpropertyUserLinksDeleteCall) Fields(s ...googleapi.Field) *ManagementWebpropertyUserLinksDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebpropertyUserLinksDeleteCall) Context(ctx context.Context) *ManagementWebpropertyUserLinksDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebpropertyUserLinksDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebpropertyUserLinksDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("DELETE", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "linkId": c.linkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webpropertyUserLinks.delete" call. +func (c *ManagementWebpropertyUserLinksDeleteCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Removes a user from the given web property.", + // "httpMethod": "DELETE", + // "id": "analytics.management.webpropertyUserLinks.delete", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "linkId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to delete the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "linkId": { + // "description": "Link ID to delete the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web Property ID to delete the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}", + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users" + // ] + // } + +} + +// method id "analytics.management.webpropertyUserLinks.insert": + +type ManagementWebpropertyUserLinksInsertCall struct { + s *Service + accountId string + webPropertyId string + entityuserlink *EntityUserLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Adds a new user to the given web property. +func (r *ManagementWebpropertyUserLinksService) Insert(accountId string, webPropertyId string, entityuserlink *EntityUserLink) *ManagementWebpropertyUserLinksInsertCall { + c := &ManagementWebpropertyUserLinksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.entityuserlink = entityuserlink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebpropertyUserLinksInsertCall) Fields(s ...googleapi.Field) *ManagementWebpropertyUserLinksInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebpropertyUserLinksInsertCall) Context(ctx context.Context) *ManagementWebpropertyUserLinksInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebpropertyUserLinksInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebpropertyUserLinksInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webpropertyUserLinks.insert" call. +// Exactly one of *EntityUserLink or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *EntityUserLink.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementWebpropertyUserLinksInsertCall) Do(opts ...googleapi.CallOption) (*EntityUserLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityUserLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Adds a new user to the given web property.", + // "httpMethod": "POST", + // "id": "analytics.management.webpropertyUserLinks.insert", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to create the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web Property ID to create the user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks", + // "request": { + // "$ref": "EntityUserLink" + // }, + // "response": { + // "$ref": "EntityUserLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users" + // ] + // } + +} + +// method id "analytics.management.webpropertyUserLinks.list": + +type ManagementWebpropertyUserLinksListCall struct { + s *Service + accountId string + webPropertyId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists webProperty-user links for a given web property. +func (r *ManagementWebpropertyUserLinksService) List(accountId string, webPropertyId string) *ManagementWebpropertyUserLinksListCall { + c := &ManagementWebpropertyUserLinksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + return c +} + +// MaxResults sets the optional parameter "max-results": The maximum +// number of webProperty-user Links to include in this response. +func (c *ManagementWebpropertyUserLinksListCall) MaxResults(maxResults int64) *ManagementWebpropertyUserLinksListCall { + c.urlParams_.Set("max-results", fmt.Sprint(maxResults)) + return c +} + +// StartIndex sets the optional parameter "start-index": An index of the +// first webProperty-user link to retrieve. Use this parameter as a +// pagination mechanism along with the max-results parameter. +func (c *ManagementWebpropertyUserLinksListCall) StartIndex(startIndex int64) *ManagementWebpropertyUserLinksListCall { + c.urlParams_.Set("start-index", fmt.Sprint(startIndex)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebpropertyUserLinksListCall) Fields(s ...googleapi.Field) *ManagementWebpropertyUserLinksListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ManagementWebpropertyUserLinksListCall) IfNoneMatch(entityTag string) *ManagementWebpropertyUserLinksListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebpropertyUserLinksListCall) Context(ctx context.Context) *ManagementWebpropertyUserLinksListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebpropertyUserLinksListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebpropertyUserLinksListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webpropertyUserLinks.list" call. +// Exactly one of *EntityUserLinks or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *EntityUserLinks.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementWebpropertyUserLinksListCall) Do(opts ...googleapi.CallOption) (*EntityUserLinks, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityUserLinks{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists webProperty-user links for a given web property.", + // "httpMethod": "GET", + // "id": "analytics.management.webpropertyUserLinks.list", + // "parameterOrder": [ + // "accountId", + // "webPropertyId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID which the given web property belongs to.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "max-results": { + // "description": "The maximum number of webProperty-user Links to include in this response.", + // "format": "int32", + // "location": "query", + // "type": "integer" + // }, + // "start-index": { + // "description": "An index of the first webProperty-user link to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.", + // "format": "int32", + // "location": "query", + // "minimum": "1", + // "type": "integer" + // }, + // "webPropertyId": { + // "description": "Web Property ID for the webProperty-user links to retrieve. Can either be a specific web property ID or '~all', which refers to all the web properties that user has access to.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks", + // "response": { + // "$ref": "EntityUserLinks" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users", + // "https://www.googleapis.com/auth/analytics.manage.users.readonly" + // ] + // } + +} + +// method id "analytics.management.webpropertyUserLinks.update": + +type ManagementWebpropertyUserLinksUpdateCall struct { + s *Service + accountId string + webPropertyId string + linkId string + entityuserlink *EntityUserLink + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates permissions for an existing user on the given web +// property. +func (r *ManagementWebpropertyUserLinksService) Update(accountId string, webPropertyId string, linkId string, entityuserlink *EntityUserLink) *ManagementWebpropertyUserLinksUpdateCall { + c := &ManagementWebpropertyUserLinksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountId = accountId + c.webPropertyId = webPropertyId + c.linkId = linkId + c.entityuserlink = entityuserlink + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ManagementWebpropertyUserLinksUpdateCall) Fields(s ...googleapi.Field) *ManagementWebpropertyUserLinksUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ManagementWebpropertyUserLinksUpdateCall) Context(ctx context.Context) *ManagementWebpropertyUserLinksUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ManagementWebpropertyUserLinksUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ManagementWebpropertyUserLinksUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("PUT", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "accountId": c.accountId, + "webPropertyId": c.webPropertyId, + "linkId": c.linkId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.management.webpropertyUserLinks.update" call. +// Exactly one of *EntityUserLink or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *EntityUserLink.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ManagementWebpropertyUserLinksUpdateCall) Do(opts ...googleapi.CallOption) (*EntityUserLink, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &EntityUserLink{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates permissions for an existing user on the given web property.", + // "httpMethod": "PUT", + // "id": "analytics.management.webpropertyUserLinks.update", + // "parameterOrder": [ + // "accountId", + // "webPropertyId", + // "linkId" + // ], + // "parameters": { + // "accountId": { + // "description": "Account ID to update the account-user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "linkId": { + // "description": "Link ID to update the account-user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "webPropertyId": { + // "description": "Web property ID to update the account-user link for.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}", + // "request": { + // "$ref": "EntityUserLink" + // }, + // "response": { + // "$ref": "EntityUserLink" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.manage.users" + // ] + // } + +} + +// method id "analytics.metadata.columns.list": + +type MetadataColumnsListCall struct { + s *Service + reportType string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists all columns for a report type +func (r *MetadataColumnsService) List(reportType string) *MetadataColumnsListCall { + c := &MetadataColumnsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.reportType = reportType + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *MetadataColumnsListCall) Fields(s ...googleapi.Field) *MetadataColumnsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *MetadataColumnsListCall) IfNoneMatch(entityTag string) *MetadataColumnsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *MetadataColumnsListCall) Context(ctx context.Context) *MetadataColumnsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *MetadataColumnsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *MetadataColumnsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "metadata/{reportType}/columns") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("GET", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "reportType": c.reportType, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.metadata.columns.list" call. +// Exactly one of *Columns or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Columns.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *MetadataColumnsListCall) Do(opts ...googleapi.CallOption) (*Columns, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Columns{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists all columns for a report type", + // "httpMethod": "GET", + // "id": "analytics.metadata.columns.list", + // "parameterOrder": [ + // "reportType" + // ], + // "parameters": { + // "reportType": { + // "description": "Report type. Allowed Values: 'ga'. Where 'ga' corresponds to the Core Reporting API", + // "location": "path", + // "pattern": "ga", + // "required": true, + // "type": "string" + // } + // }, + // "path": "metadata/{reportType}/columns", + // "response": { + // "$ref": "Columns" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics", + // "https://www.googleapis.com/auth/analytics.edit", + // "https://www.googleapis.com/auth/analytics.readonly" + // ] + // } + +} + +// method id "analytics.provisioning.createAccountTicket": + +type ProvisioningCreateAccountTicketCall struct { + s *Service + accountticket *AccountTicket + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// CreateAccountTicket: Creates an account ticket. +func (r *ProvisioningService) CreateAccountTicket(accountticket *AccountTicket) *ProvisioningCreateAccountTicketCall { + c := &ProvisioningCreateAccountTicketCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accountticket = accountticket + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProvisioningCreateAccountTicketCall) Fields(s ...googleapi.Field) *ProvisioningCreateAccountTicketCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProvisioningCreateAccountTicketCall) Context(ctx context.Context) *ProvisioningCreateAccountTicketCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProvisioningCreateAccountTicketCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProvisioningCreateAccountTicketCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountticket) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "provisioning/createAccountTicket") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.provisioning.createAccountTicket" call. +// Exactly one of *AccountTicket or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *AccountTicket.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ProvisioningCreateAccountTicketCall) Do(opts ...googleapi.CallOption) (*AccountTicket, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &AccountTicket{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Creates an account ticket.", + // "httpMethod": "POST", + // "id": "analytics.provisioning.createAccountTicket", + // "path": "provisioning/createAccountTicket", + // "request": { + // "$ref": "AccountTicket" + // }, + // "response": { + // "$ref": "AccountTicket" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.provision" + // ] + // } + +} + +// method id "analytics.provisioning.createAccountTree": + +type ProvisioningCreateAccountTreeCall struct { + s *Service + accounttreerequest *AccountTreeRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// CreateAccountTree: Provision account. +func (r *ProvisioningService) CreateAccountTree(accounttreerequest *AccountTreeRequest) *ProvisioningCreateAccountTreeCall { + c := &ProvisioningCreateAccountTreeCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.accounttreerequest = accounttreerequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProvisioningCreateAccountTreeCall) Fields(s ...googleapi.Field) *ProvisioningCreateAccountTreeCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProvisioningCreateAccountTreeCall) Context(ctx context.Context) *ProvisioningCreateAccountTreeCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProvisioningCreateAccountTreeCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProvisioningCreateAccountTreeCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.accounttreerequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "provisioning/createAccountTree") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.provisioning.createAccountTree" call. +// Exactly one of *AccountTreeResponse or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *AccountTreeResponse.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ProvisioningCreateAccountTreeCall) Do(opts ...googleapi.CallOption) (*AccountTreeResponse, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &AccountTreeResponse{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Provision account.", + // "httpMethod": "POST", + // "id": "analytics.provisioning.createAccountTree", + // "path": "provisioning/createAccountTree", + // "request": { + // "$ref": "AccountTreeRequest" + // }, + // "response": { + // "$ref": "AccountTreeResponse" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.provision" + // ] + // } + +} + +// method id "analytics.userDeletion.userDeletionRequest.upsert": + +type UserDeletionUserDeletionRequestUpsertCall struct { + s *Service + userdeletionrequest *UserDeletionRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Upsert: Insert or update a user deletion requests. +func (r *UserDeletionUserDeletionRequestService) Upsert(userdeletionrequest *UserDeletionRequest) *UserDeletionUserDeletionRequestUpsertCall { + c := &UserDeletionUserDeletionRequestUpsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.userdeletionrequest = userdeletionrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *UserDeletionUserDeletionRequestUpsertCall) Fields(s ...googleapi.Field) *UserDeletionUserDeletionRequestUpsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *UserDeletionUserDeletionRequestUpsertCall) Context(ctx context.Context) *UserDeletionUserDeletionRequestUpsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *UserDeletionUserDeletionRequestUpsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *UserDeletionUserDeletionRequestUpsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.userdeletionrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + c.urlParams_.Set("prettyPrint", "false") + urls := googleapi.ResolveRelative(c.s.BasePath, "userDeletion/userDeletionRequests:upsert") + urls += "?" + c.urlParams_.Encode() + req, err := http.NewRequest("POST", urls, body) + if err != nil { + return nil, err + } + req.Header = reqHeaders + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "analytics.userDeletion.userDeletionRequest.upsert" call. +// Exactly one of *UserDeletionRequest or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *UserDeletionRequest.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *UserDeletionUserDeletionRequestUpsertCall) Do(opts ...googleapi.CallOption) (*UserDeletionRequest, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &UserDeletionRequest{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := gensupport.DecodeResponse(target, res); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Insert or update a user deletion requests.", + // "httpMethod": "POST", + // "id": "analytics.userDeletion.userDeletionRequest.upsert", + // "path": "userDeletion/userDeletionRequests:upsert", + // "request": { + // "$ref": "UserDeletionRequest" + // }, + // "response": { + // "$ref": "UserDeletionRequest" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/analytics.user.deletion" + // ] + // } + +} diff --git a/vendor/google.golang.org/api/analyticsreporting/v4/analyticsreporting-api.json b/vendor/google.golang.org/api/analyticsreporting/v4/analyticsreporting-api.json index 13489d18..1001d702 100644 --- a/vendor/google.golang.org/api/analyticsreporting/v4/analyticsreporting-api.json +++ b/vendor/google.golang.org/api/analyticsreporting/v4/analyticsreporting-api.json @@ -154,7 +154,7 @@ } } }, - "revision": "20190318", + "revision": "20190719", "rootUrl": "https://analyticsreporting.googleapis.com/", "schemas": { "Activity": { @@ -283,7 +283,7 @@ "type": "array" }, "lifetimeValue": { - "description": "Enable Life Time Value (LTV). LTV measures lifetime value for users\nacquired through different channels.\nPlease see:\n[Cohort Analysis](https://support.google.com/analytics/answer/6074676) and\n[Lifetime Value](https://support.google.com/analytics/answer/6182550)\nIf the value of lifetimeValue is false:\n\n- The metric values are similar to the values in the web interface cohort\n report.\n- The cohort definition date ranges must be aligned to the calendar week\n and month. i.e. while requesting `ga:cohortNthWeek` the `startDate` in\n the cohort definition should be a Sunday and the `endDate` should be the\n following Saturday, and for `ga:cohortNthMonth`, the `startDate`\n should be the 1st of the month and `endDate` should be the last day\n of the month.\n\nWhen the lifetimeValue is true:\n\n- The metric values will correspond to the values in the web interface\n LifeTime value report.\n- The Lifetime Value report shows you how user value (Revenue) and\n engagement (Appviews, Goal Completions, Sessions, and Session Duration)\n grow during the 90 days after a user is acquired.\n- The metrics are calculated as a cumulative average per user per the time\n increment.\n- The cohort definition date ranges need not be aligned to the calendar\n week and month boundaries.\n- The `viewId` must be an\n [app view ID](https://support.google.com/analytics/answer/2649553#WebVersusAppViews)", + "description": "Enable Life Time Value (LTV). LTV measures lifetime value for users\nacquired through different channels.\nPlease see:\n[Cohort Analysis](https://support.google.com/analytics/answer/6074676) and\n[Lifetime Value](https://support.google.com/analytics/answer/6182550)\nIf the value of lifetimeValue is false:\n\n- The metric values are similar to the values in the web interface cohort\n report.\n- The cohort definition date ranges must be aligned to the calendar week\n and month. i.e. while requesting `ga:cohortNthWeek` the `startDate` in\n the cohort definition should be a Sunday and the `endDate` should be the\n following Saturday, and for `ga:cohortNthMonth`, the `startDate`\n should be the 1st of the month and `endDate` should be the last day\n of the month.\n\nWhen the lifetimeValue is true:\n\n- The metric values will correspond to the values in the web interface\n LifeTime value report.\n- The Lifetime Value report shows you how user value (Revenue) and\n engagement (Appviews, Goal Completions, Sessions, and Session Duration)\n grow during the 90 days after a user is acquired.\n- The metrics are calculated as a cumulative average per user per the time\n increment.\n- The cohort definition date ranges need not be aligned to the calendar\n week and month boundaries.\n- The `viewId` must be an\n [app view\n ID](https://support.google.com/analytics/answer/2649553#WebVersusAppViews)", "type": "boolean" } }, @@ -578,7 +578,7 @@ "type": "array" }, "useResourceQuotas": { - "description": "Enables\n[resource based quotas](/analytics/devguides/reporting/core/v4/limits-quotas#analytics_reporting_api_v4),\n(defaults to `False`). If this field is set to `True` the\nper view (profile) quotas are governed by the computational\ncost of the request. Note that using cost based quotas will\nhigher enable sampling rates. (10 Million for `SMALL`,\n100M for `LARGE`. See the\n[limits and quotas documentation](/analytics/devguides/reporting/core/v4/limits-quotas#analytics_reporting_api_v4) for details.", + "description": "Enables\n[resource based\nquotas](/analytics/devguides/reporting/core/v4/limits-quotas#analytics_reporting_api_v4),\n(defaults to `False`). If this field is set to `True` the\nper view (profile) quotas are governed by the computational\ncost of the request. Note that using cost based quotas will\nhigher enable sampling rates. (10 Million for `SMALL`,\n100M for `LARGE`. See the\n[limits and quotas\ndocumentation](/analytics/devguides/reporting/core/v4/limits-quotas#analytics_reporting_api_v4)\nfor details.", "type": "boolean" } }, @@ -1117,14 +1117,14 @@ "type": "array" }, "dimensions": { - "description": "The dimensions requested.\nRequests can have a total of 7 dimensions.", + "description": "The dimensions requested.\nRequests can have a total of 9 dimensions.", "items": { "$ref": "Dimension" }, "type": "array" }, "filtersExpression": { - "description": "Dimension or metric filters that restrict the data returned for your\nrequest. To use the `filtersExpression`, supply a dimension or metric on\nwhich to filter, followed by the filter expression. For example, the\nfollowing expression selects `ga:browser` dimension which starts with\nFirefox; `ga:browser=~^Firefox`. For more information on dimensions\nand metric filters, see\n[Filters reference](https://developers.google.com/analytics/devguides/reporting/core/v3/reference#filters).", + "description": "Dimension or metric filters that restrict the data returned for your\nrequest. To use the `filtersExpression`, supply a dimension or metric on\nwhich to filter, followed by the filter expression. For example, the\nfollowing expression selects `ga:browser` dimension which starts with\nFirefox; `ga:browser=~^Firefox`. For more information on dimensions\nand metric filters, see\n[Filters\nreference](https://developers.google.com/analytics/devguides/reporting/core/v3/reference#filters).", "type": "string" }, "hideTotals": { diff --git a/vendor/google.golang.org/api/analyticsreporting/v4/analyticsreporting-gen.go b/vendor/google.golang.org/api/analyticsreporting/v4/analyticsreporting-gen.go index a3d1bc42..e0b667b3 100644 --- a/vendor/google.golang.org/api/analyticsreporting/v4/analyticsreporting-gen.go +++ b/vendor/google.golang.org/api/analyticsreporting/v4/analyticsreporting-gen.go @@ -432,6 +432,7 @@ type CohortGroup struct { // week and month boundaries. // - The `viewId` must be an // [app view + // // ID](https://support.google.com/analytics/answer/2649553#WebVersusAppVi // ews) LifetimeValue bool `json:"lifetimeValue,omitempty"` @@ -956,17 +957,20 @@ type GetReportsRequest struct { ReportRequests []*ReportRequest `json:"reportRequests,omitempty"` // UseResourceQuotas: Enables - // [resource based - // quotas](/analytics/devguides/reporting/core/v4/limits-quotas#analytics - // _reporting_api_v4), + // [resource + // based + // quotas](/analytics/devguides/reporting/core/v4/limits-quotas#ana + // lytics_reporting_api_v4), // (defaults to `False`). If this field is set to `True` the // per view (profile) quotas are governed by the computational // cost of the request. Note that using cost based quotas will // higher enable sampling rates. (10 Million for `SMALL`, // 100M for `LARGE`. See the - // [limits and quotas - // documentation](/analytics/devguides/reporting/core/v4/limits-quotas#an - // alytics_reporting_api_v4) for details. + // [limits and + // quotas + // documentation](/analytics/devguides/reporting/core/v4/limits-qu + // otas#analytics_reporting_api_v4) + // for details. UseResourceQuotas bool `json:"useResourceQuotas,omitempty"` // ForceSendFields is a list of field names (e.g. "ReportRequests") to @@ -1929,7 +1933,7 @@ type ReportRequest struct { DimensionFilterClauses []*DimensionFilterClause `json:"dimensionFilterClauses,omitempty"` // Dimensions: The dimensions requested. - // Requests can have a total of 7 dimensions. + // Requests can have a total of 9 dimensions. Dimensions []*Dimension `json:"dimensions,omitempty"` // FiltersExpression: Dimension or metric filters that restrict the data @@ -1942,10 +1946,11 @@ type ReportRequest struct { // with // Firefox; `ga:browser=~^Firefox`. For more information on // dimensions - // and metric filters, see + // and metric filters, + // see // [Filters - // reference](https://developers.google.com/analytics/devguides/reporting - // /core/v3/reference#filters). + // reference](https://developers.google.com/analytics/devgui + // des/reporting/core/v3/reference#filters). FiltersExpression string `json:"filtersExpression,omitempty"` // HideTotals: If set to true, hides the total of all metrics for all @@ -2999,6 +3004,7 @@ func (c *ReportsBatchGetCall) Header() http.Header { func (c *ReportsBatchGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -3124,6 +3130,7 @@ func (c *UserActivitySearchCall) Header() http.Header { func (c *UserActivitySearchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } diff --git a/vendor/google.golang.org/api/calendar/v3/calendar-api.json b/vendor/google.golang.org/api/calendar/v3/calendar-api.json index c863c000..6b214a99 100644 --- a/vendor/google.golang.org/api/calendar/v3/calendar-api.json +++ b/vendor/google.golang.org/api/calendar/v3/calendar-api.json @@ -26,7 +26,7 @@ "description": "Manipulates events and other calendar data.", "discoveryVersion": "v1", "documentationLink": "https://developers.google.com/google-apps/calendar/firstapp", - "etag": "\"VPK3KBfpaEgZ16pozGOoMYfKc0U/AciOQr9FW92aqABx-Xo_TTJaKXc\"", + "etag": "\"9eZ1uxVRThTDhLJCZHhqs3eQWz4/K_k45CtMfV--mlEBFlbW_LzaaUU\"", "icons": { "x16": "http://www.google.com/images/icons/product/calendar-16.png", "x32": "http://www.google.com/images/icons/product/calendar-32.png" @@ -1724,7 +1724,7 @@ } } }, - "revision": "20190430", + "revision": "20190609", "rootUrl": "https://www.googleapis.com/", "schemas": { "Acl": { @@ -2019,7 +2019,7 @@ }, "kind": { "default": "api#channel", - "description": "Identifies this as a notification channel used to watch for changes to a resource. Value: the fixed string \"api#channel\".", + "description": "Identifies this as a notification channel used to watch for changes to a resource, which is \"api#channel\".", "type": "string" }, "params": { diff --git a/vendor/google.golang.org/api/calendar/v3/calendar-gen.go b/vendor/google.golang.org/api/calendar/v3/calendar-gen.go index c1d26a56..d04e1199 100644 --- a/vendor/google.golang.org/api/calendar/v3/calendar-gen.go +++ b/vendor/google.golang.org/api/calendar/v3/calendar-gen.go @@ -701,7 +701,7 @@ type Channel struct { Id string `json:"id,omitempty"` // Kind: Identifies this as a notification channel used to watch for - // changes to a resource. Value: the fixed string "api#channel". + // changes to a resource, which is "api#channel". Kind string `json:"kind,omitempty"` // Params: Additional parameters controlling delivery channel behavior. @@ -2426,6 +2426,7 @@ func (c *AclDeleteCall) Header() http.Header { func (c *AclDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -2546,6 +2547,7 @@ func (c *AclGetCall) Header() http.Header { func (c *AclGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -2695,6 +2697,7 @@ func (c *AclInsertCall) Header() http.Header { func (c *AclInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -2886,6 +2889,7 @@ func (c *AclListCall) Header() http.Header { func (c *AclListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -3074,6 +3078,7 @@ func (c *AclPatchCall) Header() http.Header { func (c *AclPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -3235,6 +3240,7 @@ func (c *AclUpdateCall) Header() http.Header { func (c *AclUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -3425,6 +3431,7 @@ func (c *AclWatchCall) Header() http.Header { func (c *AclWatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -3584,6 +3591,7 @@ func (c *CalendarListDeleteCall) Header() http.Header { func (c *CalendarListDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -3694,6 +3702,7 @@ func (c *CalendarListGetCall) Header() http.Header { func (c *CalendarListGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -3835,6 +3844,7 @@ func (c *CalendarListInsertCall) Header() http.Header { func (c *CalendarListInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -4037,6 +4047,7 @@ func (c *CalendarListListCall) Header() http.Header { func (c *CalendarListListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -4235,6 +4246,7 @@ func (c *CalendarListPatchCall) Header() http.Header { func (c *CalendarListPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -4387,6 +4399,7 @@ func (c *CalendarListUpdateCall) Header() http.Header { func (c *CalendarListUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -4592,6 +4605,7 @@ func (c *CalendarListWatchCall) Header() http.Header { func (c *CalendarListWatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -4763,6 +4777,7 @@ func (c *CalendarsClearCall) Header() http.Header { func (c *CalendarsClearCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -4863,6 +4878,7 @@ func (c *CalendarsDeleteCall) Header() http.Header { func (c *CalendarsDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -4973,6 +4989,7 @@ func (c *CalendarsGetCall) Header() http.Header { func (c *CalendarsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -5104,6 +5121,7 @@ func (c *CalendarsInsertCall) Header() http.Header { func (c *CalendarsInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -5228,6 +5246,7 @@ func (c *CalendarsPatchCall) Header() http.Header { func (c *CalendarsPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -5365,6 +5384,7 @@ func (c *CalendarsUpdateCall) Header() http.Header { func (c *CalendarsUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -5500,6 +5520,7 @@ func (c *ChannelsStopCall) Header() http.Header { func (c *ChannelsStopCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -5607,6 +5628,7 @@ func (c *ColorsGetCall) Header() http.Header { func (c *ColorsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -5752,6 +5774,7 @@ func (c *EventsDeleteCall) Header() http.Header { func (c *EventsDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -5921,6 +5944,7 @@ func (c *EventsGetCall) Header() http.Header { func (c *EventsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -6102,6 +6126,7 @@ func (c *EventsImportCall) Header() http.Header { func (c *EventsImportCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -6309,6 +6334,7 @@ func (c *EventsInsertCall) Header() http.Header { func (c *EventsInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -6575,6 +6601,7 @@ func (c *EventsInstancesCall) Header() http.Header { func (c *EventsInstancesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -6984,6 +7011,7 @@ func (c *EventsListCall) Header() http.Header { func (c *EventsListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -7273,6 +7301,7 @@ func (c *EventsMoveCall) Header() http.Header { func (c *EventsMoveCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -7508,6 +7537,7 @@ func (c *EventsPatchCall) Header() http.Header { func (c *EventsPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -7724,6 +7754,7 @@ func (c *EventsQuickAddCall) Header() http.Header { func (c *EventsQuickAddCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -7951,6 +7982,7 @@ func (c *EventsUpdateCall) Header() http.Header { func (c *EventsUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -8326,6 +8358,7 @@ func (c *EventsWatchCall) Header() http.Header { func (c *EventsWatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -8569,6 +8602,7 @@ func (c *FreebusyQueryCall) Header() http.Header { func (c *FreebusyQueryCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -8702,6 +8736,7 @@ func (c *SettingsGetCall) Header() http.Header { func (c *SettingsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -8872,6 +8907,7 @@ func (c *SettingsListCall) Header() http.Header { func (c *SettingsListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -9060,6 +9096,7 @@ func (c *SettingsWatchCall) Header() http.Header { func (c *SettingsWatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } diff --git a/vendor/google.golang.org/api/gensupport/backoff.go b/vendor/google.golang.org/api/gensupport/backoff.go deleted file mode 100644 index 94b7789e..00000000 --- a/vendor/google.golang.org/api/gensupport/backoff.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gensupport - -import ( - "math/rand" - "time" -) - -// BackoffStrategy defines the set of functions that a backoff-er must -// implement. -type BackoffStrategy interface { - // Pause returns the duration of the next pause and true if the operation should be - // retried, or false if no further retries should be attempted. - Pause() (time.Duration, bool) - - // Reset restores the strategy to its initial state. - Reset() -} - -// ExponentialBackoff performs exponential backoff as per https://en.wikipedia.org/wiki/Exponential_backoff. -// The initial pause time is given by Base. -// Once the total pause time exceeds Max, Pause will indicate no further retries. -type ExponentialBackoff struct { - Base time.Duration - Max time.Duration - total time.Duration - n uint -} - -// Pause returns the amount of time the caller should wait. -func (eb *ExponentialBackoff) Pause() (time.Duration, bool) { - if eb.total > eb.Max { - return 0, false - } - - // The next pause is selected from randomly from [0, 2^n * Base). - d := time.Duration(rand.Int63n((1 << eb.n) * int64(eb.Base))) - eb.total += d - eb.n++ - return d, true -} - -// Reset resets the backoff strategy such that the next Pause call will begin -// counting from the start. It is not safe to call concurrently with Pause. -func (eb *ExponentialBackoff) Reset() { - eb.n = 0 - eb.total = 0 -} diff --git a/vendor/google.golang.org/api/gensupport/header.go b/vendor/google.golang.org/api/gensupport/header.go deleted file mode 100644 index cb5e67c7..00000000 --- a/vendor/google.golang.org/api/gensupport/header.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gensupport - -import ( - "fmt" - "runtime" - "strings" -) - -// GoogleClientHeader returns the value to use for the x-goog-api-client -// header, which is used internally by Google. -func GoogleClientHeader(generatorVersion, clientElement string) string { - elts := []string{"gl-go/" + strings.Replace(runtime.Version(), " ", "_", -1)} - if clientElement != "" { - elts = append(elts, clientElement) - } - elts = append(elts, fmt.Sprintf("gdcl/%s", generatorVersion)) - return strings.Join(elts, " ") -} diff --git a/vendor/google.golang.org/api/gensupport/resumable.go b/vendor/google.golang.org/api/gensupport/resumable.go index 2552a6ac..e67ccd9a 100644 --- a/vendor/google.golang.org/api/gensupport/resumable.go +++ b/vendor/google.golang.org/api/gensupport/resumable.go @@ -12,6 +12,22 @@ import ( "net/http" "sync" "time" + + gax "github.com/googleapis/gax-go/v2" +) + +// Backoff is an interface around gax.Backoff's Pause method, allowing tests to provide their +// own implementation. +type Backoff interface { + Pause() time.Duration +} + +// These are declared as global variables so that tests can overwrite them. +var ( + retryDeadline = 32 * time.Second + backoff = func() Backoff { + return &gax.Backoff{Initial: 100 * time.Millisecond} + } ) const ( @@ -39,9 +55,6 @@ type ResumableUpload struct { // Callback is an optional function that will be periodically called with the cumulative number of bytes uploaded. Callback func(int64) - - // If not specified, a default exponential backoff strategy will be used. - Backoff BackoffStrategy } // Progress returns the number of bytes uploaded at this point. @@ -138,15 +151,6 @@ func (rx *ResumableUpload) transferChunk(ctx context.Context) (*http.Response, e return res, nil } -func contextDone(ctx context.Context) bool { - select { - case <-ctx.Done(): - return true - default: - return false - } -} - // Upload starts the process of a resumable upload with a cancellable context. // It retries using the provided back off strategy until cancelled or the // strategy indicates to stop retrying. @@ -156,61 +160,82 @@ func contextDone(ctx context.Context) bool { // rx is private to the auto-generated API code. // Exactly one of resp or err will be nil. If resp is non-nil, the caller must call resp.Body.Close. func (rx *ResumableUpload) Upload(ctx context.Context) (resp *http.Response, err error) { - var pause time.Duration - backoff := rx.Backoff - if backoff == nil { - backoff = DefaultBackoffStrategy() + var shouldRetry = func(status int, err error) bool { + if 500 <= status && status <= 599 { + return true + } + if status == statusTooManyRequests { + return true + } + if err == io.ErrUnexpectedEOF { + return true + } + if err, ok := err.(interface{ Temporary() bool }); ok { + return err.Temporary() + } + return false } - for { - // Ensure that we return in the case of cancelled context, even if pause is 0. - if contextDone(ctx) { - return nil, ctx.Err() - } - select { - case <-ctx.Done(): - return nil, ctx.Err() - case <-time.After(pause): - } - - resp, err = rx.transferChunk(ctx) - - var status int - if resp != nil { - status = resp.StatusCode - } - - // Check if we should retry the request. - if shouldRetry(status, err) { - var retry bool - pause, retry = backoff.Pause() - if retry { - if resp != nil && resp.Body != nil { - resp.Body.Close() - } - continue - } - } - - // If the chunk was uploaded successfully, but there's still - // more to go, upload the next chunk without any delay. - if statusResumeIncomplete(resp) { - pause = 0 - backoff.Reset() - resp.Body.Close() - continue - } - - // It's possible for err and resp to both be non-nil here, but we expose a simpler - // contract to our callers: exactly one of resp and err will be non-nil. This means - // that any response body must be closed here before returning a non-nil error. + // There are a couple of cases where it's possible for err and resp to both + // be non-nil. However, we expose a simpler contract to our callers: exactly + // one of resp and err will be non-nil. This means that any response body + // must be closed here before returning a non-nil error. + var prepareReturn = func(resp *http.Response, err error) (*http.Response, error) { if err != nil { if resp != nil && resp.Body != nil { resp.Body.Close() } return nil, err } - return resp, nil } + + // Send all chunks. + for { + var pause time.Duration + + // Each chunk gets its own initialized-at-zero retry. + bo := backoff() + quitAfter := time.After(retryDeadline) + + // Retry loop for a single chunk. + for { + select { + case <-ctx.Done(): + if err == nil { + err = ctx.Err() + } + return prepareReturn(resp, err) + case <-time.After(pause): + case <-quitAfter: + return prepareReturn(resp, err) + } + + resp, err = rx.transferChunk(ctx) + + var status int + if resp != nil { + status = resp.StatusCode + } + + // Check if we should retry the request. + if !shouldRetry(status, err) { + break + } + + pause = bo.Pause() + if resp != nil && resp.Body != nil { + resp.Body.Close() + } + } + + // If the chunk was uploaded successfully, but there's still + // more to go, upload the next chunk without any delay. + if statusResumeIncomplete(resp) { + resp.Body.Close() + continue + } + + return prepareReturn(resp, err) + } } diff --git a/vendor/google.golang.org/api/gensupport/retry.go b/vendor/google.golang.org/api/gensupport/retry.go deleted file mode 100644 index fdde3f42..00000000 --- a/vendor/google.golang.org/api/gensupport/retry.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2017 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gensupport - -import ( - "context" - "io" - "net" - "net/http" - "time" -) - -// Retry invokes the given function, retrying it multiple times if the connection failed or -// the HTTP status response indicates the request should be attempted again. ctx may be nil. -func Retry(ctx context.Context, f func() (*http.Response, error), backoff BackoffStrategy) (*http.Response, error) { - for { - resp, err := f() - - var status int - if resp != nil { - status = resp.StatusCode - } - - // Return if we shouldn't retry. - pause, retry := backoff.Pause() - if !shouldRetry(status, err) || !retry { - return resp, err - } - - // Ensure the response body is closed, if any. - if resp != nil && resp.Body != nil { - resp.Body.Close() - } - - // Pause, but still listen to ctx.Done if context is not nil. - var done <-chan struct{} - if ctx != nil { - done = ctx.Done() - } - select { - case <-done: - return nil, ctx.Err() - case <-time.After(pause): - } - } -} - -// DefaultBackoffStrategy returns a default strategy to use for retrying failed upload requests. -func DefaultBackoffStrategy() BackoffStrategy { - return &ExponentialBackoff{ - Base: 250 * time.Millisecond, - Max: 16 * time.Second, - } -} - -// shouldRetry returns true if the HTTP response / error indicates that the -// request should be attempted again. -func shouldRetry(status int, err error) bool { - if 500 <= status && status <= 599 { - return true - } - if status == statusTooManyRequests { - return true - } - if err == io.ErrUnexpectedEOF { - return true - } - if err, ok := err.(net.Error); ok { - return err.Temporary() - } - return false -} diff --git a/vendor/google.golang.org/api/sheets/v4/sheets-api.json b/vendor/google.golang.org/api/sheets/v4/sheets-api.json index 20ffff8e..da1b9210 100644 --- a/vendor/google.golang.org/api/sheets/v4/sheets-api.json +++ b/vendor/google.golang.org/api/sheets/v4/sheets-api.json @@ -27,6 +27,7 @@ "description": "Reads and writes Google Sheets.", "discoveryVersion": "v1", "documentationLink": "https://developers.google.com/sheets/", + "fullyEncodeReservedExpansion": true, "icons": { "x16": "http://www.google.com/images/icons/product/search-16.gif", "x32": "http://www.google.com/images/icons/product/search-32.gif" @@ -808,7 +809,7 @@ } } }, - "revision": "20190429", + "revision": "20190813", "rootUrl": "https://sheets.googleapis.com/", "schemas": { "AddBandingRequest": { @@ -1166,6 +1167,10 @@ "titleTextPosition": { "$ref": "TextPosition", "description": "The axis title text position." + }, + "viewWindowOptions": { + "$ref": "ChartAxisViewWindowOptions", + "description": "The view window options for this axis." } }, "type": "object" @@ -2243,6 +2248,39 @@ }, "type": "object" }, + "ChartAxisViewWindowOptions": { + "description": "The options that define a \"view window\" for a chart (such as the visible\nvalues in an axis).", + "id": "ChartAxisViewWindowOptions", + "properties": { + "viewWindowMax": { + "description": "The maximum numeric value to be shown in this view window. If unset, will\nautomatically determine a maximum value that looks good for the data.", + "format": "double", + "type": "number" + }, + "viewWindowMin": { + "description": "The minimum numeric value to be shown in this view window. If unset, will\nautomatically determine a minimum value that looks good for the data.", + "format": "double", + "type": "number" + }, + "viewWindowMode": { + "description": "The view window's mode.", + "enum": [ + "DEFAULT_VIEW_WINDOW_MODE", + "VIEW_WINDOW_MODE_UNSUPPORTED", + "EXPLICIT", + "PRETTY" + ], + "enumDescriptions": [ + "The default view window mode used in the Sheets editor for this chart\ntype. In most cases, if set, the default mode is equivalent to\n`PRETTY`.", + "Do not use. Represents that the currently set mode is not supported by\nthe API.", + "Follows the min and max exactly if specified. If a value is unspecified,\nit will fall back to the `PRETTY` value.", + "Chooses a min and max that make the chart look good. Both min and max are\nignored in this mode." + ], + "type": "string" + } + }, + "type": "object" + }, "ChartData": { "description": "The data included in a domain or series.", "id": "ChartData", @@ -2824,6 +2862,36 @@ }, "type": "object" }, + "DeleteDuplicatesRequest": { + "description": "Removes rows within this range that contain values in the specified columns\nthat are duplicates of values in any previous row. Rows with identical values\nbut different letter cases, formatting, or formulas are considered to be\nduplicates.\n\nThis request also removes duplicate rows hidden from view (for example, due\nto a filter). When removing duplicates, the first instance of each duplicate\nrow scanning from the top downwards is kept in the resulting range. Content\noutside of the specified range isn't removed, and rows considered duplicates\ndo not have to be adjacent to each other in the range.", + "id": "DeleteDuplicatesRequest", + "properties": { + "comparisonColumns": { + "description": "The columns in the range to analyze for duplicate values. If no columns are\nselected then all columns are analyzed for duplicates.", + "items": { + "$ref": "DimensionRange" + }, + "type": "array" + }, + "range": { + "$ref": "GridRange", + "description": "The range to remove duplicates rows from." + } + }, + "type": "object" + }, + "DeleteDuplicatesResponse": { + "description": "The result of removing duplicates in a range.", + "id": "DeleteDuplicatesResponse", + "properties": { + "duplicatesRemovedCount": { + "description": "The number of duplicate rows removed.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, "DeleteEmbeddedObjectRequest": { "description": "Deletes the embedded object with the given ID.", "id": "DeleteEmbeddedObjectRequest", @@ -4610,6 +4678,10 @@ "$ref": "DeleteDimensionGroupRequest", "description": "Deletes a group over the specified range." }, + "deleteDuplicates": { + "$ref": "DeleteDuplicatesRequest", + "description": "Removes rows containing duplicate values in specified columns of a cell\nrange." + }, "deleteEmbeddedObject": { "$ref": "DeleteEmbeddedObjectRequest", "description": "Deletes an embedded object (e.g, chart, image) in a sheet." @@ -4690,6 +4762,10 @@ "$ref": "TextToColumnsRequest", "description": "Converts a column of text into many columns of text." }, + "trimWhitespace": { + "$ref": "TrimWhitespaceRequest", + "description": "Trims cells of whitespace (such as spaces, tabs, or new lines)." + }, "unmergeCells": { "$ref": "UnmergeCellsRequest", "description": "Unmerges merged cells." @@ -4801,6 +4877,10 @@ "$ref": "DeleteDimensionGroupResponse", "description": "A reply from deleting a dimension group." }, + "deleteDuplicates": { + "$ref": "DeleteDuplicatesResponse", + "description": "A reply from removing rows containing duplicate values." + }, "duplicateFilterView": { "$ref": "DuplicateFilterViewResponse", "description": "A reply from duplicating a filter view." @@ -4813,6 +4893,10 @@ "$ref": "FindReplaceResponse", "description": "A reply from doing a find/replace." }, + "trimWhitespace": { + "$ref": "TrimWhitespaceResponse", + "description": "A reply from trimming whitespace." + }, "updateConditionalFormatRule": { "$ref": "UpdateConditionalFormatRuleResponse", "description": "A reply from updating a conditional format rule." @@ -5399,6 +5483,29 @@ }, "type": "object" }, + "TrimWhitespaceRequest": { + "description": "Trims the whitespace (such as spaces, tabs, or new lines) in every cell in\nthe specified range. This request removes all whitespace from the start and\nend of each cell's text, and reduces any subsequence of remaining whitespace\ncharacters to a single space. If the resulting trimmed text starts with a '+'\nor '=' character, the text remains as a string value and isn't interpreted\nas a formula.", + "id": "TrimWhitespaceRequest", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range whose cells to trim." + } + }, + "type": "object" + }, + "TrimWhitespaceResponse": { + "description": "The result of trimming whitespace in cells.", + "id": "TrimWhitespaceResponse", + "properties": { + "cellsChangedCount": { + "description": "The number of cells that were trimmed of whitespace.", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, "UnmergeCellsRequest": { "description": "Unmerges cells in the given range.", "id": "UnmergeCellsRequest", diff --git a/vendor/google.golang.org/api/sheets/v4/sheets-gen.go b/vendor/google.golang.org/api/sheets/v4/sheets-gen.go index 0a244d46..2d4ea6b9 100644 --- a/vendor/google.golang.org/api/sheets/v4/sheets-gen.go +++ b/vendor/google.golang.org/api/sheets/v4/sheets-gen.go @@ -1025,6 +1025,9 @@ type BasicChartAxis struct { // TitleTextPosition: The axis title text position. TitleTextPosition *TextPosition `json:"titleTextPosition,omitempty"` + // ViewWindowOptions: The view window options for this axis. + ViewWindowOptions *ChartAxisViewWindowOptions `json:"viewWindowOptions,omitempty"` + // ForceSendFields is a list of field names (e.g. "Format") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, @@ -2918,6 +2921,78 @@ func (s *CellFormat) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// ChartAxisViewWindowOptions: The options that define a "view window" +// for a chart (such as the visible +// values in an axis). +type ChartAxisViewWindowOptions struct { + // ViewWindowMax: The maximum numeric value to be shown in this view + // window. If unset, will + // automatically determine a maximum value that looks good for the data. + ViewWindowMax float64 `json:"viewWindowMax,omitempty"` + + // ViewWindowMin: The minimum numeric value to be shown in this view + // window. If unset, will + // automatically determine a minimum value that looks good for the data. + ViewWindowMin float64 `json:"viewWindowMin,omitempty"` + + // ViewWindowMode: The view window's mode. + // + // Possible values: + // "DEFAULT_VIEW_WINDOW_MODE" - The default view window mode used in + // the Sheets editor for this chart + // type. In most cases, if set, the default mode is equivalent + // to + // `PRETTY`. + // "VIEW_WINDOW_MODE_UNSUPPORTED" - Do not use. Represents that the + // currently set mode is not supported by + // the API. + // "EXPLICIT" - Follows the min and max exactly if specified. If a + // value is unspecified, + // it will fall back to the `PRETTY` value. + // "PRETTY" - Chooses a min and max that make the chart look good. + // Both min and max are + // ignored in this mode. + ViewWindowMode string `json:"viewWindowMode,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ViewWindowMax") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ViewWindowMax") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ChartAxisViewWindowOptions) MarshalJSON() ([]byte, error) { + type NoMethod ChartAxisViewWindowOptions + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +func (s *ChartAxisViewWindowOptions) UnmarshalJSON(data []byte) error { + type NoMethod ChartAxisViewWindowOptions + var s1 struct { + ViewWindowMax gensupport.JSONFloat64 `json:"viewWindowMax"` + ViewWindowMin gensupport.JSONFloat64 `json:"viewWindowMin"` + *NoMethod + } + s1.NoMethod = (*NoMethod)(s) + if err := json.Unmarshal(data, &s1); err != nil { + return err + } + s.ViewWindowMax = float64(s1.ViewWindowMax) + s.ViewWindowMin = float64(s1.ViewWindowMin) + return nil +} + // ChartData: The data included in a domain or series. type ChartData struct { // SourceRange: The source ranges of the data. @@ -4130,6 +4205,87 @@ func (s *DeleteDimensionRequest) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// DeleteDuplicatesRequest: Removes rows within this range that contain +// values in the specified columns +// that are duplicates of values in any previous row. Rows with +// identical values +// but different letter cases, formatting, or formulas are considered to +// be +// duplicates. +// +// This request also removes duplicate rows hidden from view (for +// example, due +// to a filter). When removing duplicates, the first instance of each +// duplicate +// row scanning from the top downwards is kept in the resulting range. +// Content +// outside of the specified range isn't removed, and rows considered +// duplicates +// do not have to be adjacent to each other in the range. +type DeleteDuplicatesRequest struct { + // ComparisonColumns: The columns in the range to analyze for duplicate + // values. If no columns are + // selected then all columns are analyzed for duplicates. + ComparisonColumns []*DimensionRange `json:"comparisonColumns,omitempty"` + + // Range: The range to remove duplicates rows from. + Range *GridRange `json:"range,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ComparisonColumns") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ComparisonColumns") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *DeleteDuplicatesRequest) MarshalJSON() ([]byte, error) { + type NoMethod DeleteDuplicatesRequest + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// DeleteDuplicatesResponse: The result of removing duplicates in a +// range. +type DeleteDuplicatesResponse struct { + // DuplicatesRemovedCount: The number of duplicate rows removed. + DuplicatesRemovedCount int64 `json:"duplicatesRemovedCount,omitempty"` + + // ForceSendFields is a list of field names (e.g. + // "DuplicatesRemovedCount") to unconditionally include in API requests. + // By default, fields with empty values are omitted from API requests. + // However, any non-pointer, non-interface field appearing in + // ForceSendFields will be sent to the server regardless of whether the + // field is empty or not. This may be used to include empty fields in + // Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "DuplicatesRemovedCount") + // to include in API requests with the JSON null value. By default, + // fields with empty values are omitted from API requests. However, any + // field with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *DeleteDuplicatesResponse) MarshalJSON() ([]byte, error) { + type NoMethod DeleteDuplicatesResponse + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // DeleteEmbeddedObjectRequest: Deletes the embedded object with the // given ID. type DeleteEmbeddedObjectRequest struct { @@ -7320,6 +7476,11 @@ type Request struct { // DeleteDimensionGroup: Deletes a group over the specified range. DeleteDimensionGroup *DeleteDimensionGroupRequest `json:"deleteDimensionGroup,omitempty"` + // DeleteDuplicates: Removes rows containing duplicate values in + // specified columns of a cell + // range. + DeleteDuplicates *DeleteDuplicatesRequest `json:"deleteDuplicates,omitempty"` + // DeleteEmbeddedObject: Deletes an embedded object (e.g, chart, image) // in a sheet. DeleteEmbeddedObject *DeleteEmbeddedObjectRequest `json:"deleteEmbeddedObject,omitempty"` @@ -7384,6 +7545,10 @@ type Request struct { // TextToColumns: Converts a column of text into many columns of text. TextToColumns *TextToColumnsRequest `json:"textToColumns,omitempty"` + // TrimWhitespace: Trims cells of whitespace (such as spaces, tabs, or + // new lines). + TrimWhitespace *TrimWhitespaceRequest `json:"trimWhitespace,omitempty"` + // UnmergeCells: Unmerges merged cells. UnmergeCells *UnmergeCellsRequest `json:"unmergeCells,omitempty"` @@ -7492,6 +7657,10 @@ type Response struct { // DeleteDimensionGroup: A reply from deleting a dimension group. DeleteDimensionGroup *DeleteDimensionGroupResponse `json:"deleteDimensionGroup,omitempty"` + // DeleteDuplicates: A reply from removing rows containing duplicate + // values. + DeleteDuplicates *DeleteDuplicatesResponse `json:"deleteDuplicates,omitempty"` + // DuplicateFilterView: A reply from duplicating a filter view. DuplicateFilterView *DuplicateFilterViewResponse `json:"duplicateFilterView,omitempty"` @@ -7501,6 +7670,9 @@ type Response struct { // FindReplace: A reply from doing a find/replace. FindReplace *FindReplaceResponse `json:"findReplace,omitempty"` + // TrimWhitespace: A reply from trimming whitespace. + TrimWhitespace *TrimWhitespaceResponse `json:"trimWhitespace,omitempty"` + // UpdateConditionalFormatRule: A reply from updating a conditional // format rule. UpdateConditionalFormatRule *UpdateConditionalFormatRuleResponse `json:"updateConditionalFormatRule,omitempty"` @@ -8494,6 +8666,74 @@ func (s *TreemapChartSpec) UnmarshalJSON(data []byte) error { return nil } +// TrimWhitespaceRequest: Trims the whitespace (such as spaces, tabs, or +// new lines) in every cell in +// the specified range. This request removes all whitespace from the +// start and +// end of each cell's text, and reduces any subsequence of remaining +// whitespace +// characters to a single space. If the resulting trimmed text starts +// with a '+' +// or '=' character, the text remains as a string value and isn't +// interpreted +// as a formula. +type TrimWhitespaceRequest struct { + // Range: The range whose cells to trim. + Range *GridRange `json:"range,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Range") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Range") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *TrimWhitespaceRequest) MarshalJSON() ([]byte, error) { + type NoMethod TrimWhitespaceRequest + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// TrimWhitespaceResponse: The result of trimming whitespace in cells. +type TrimWhitespaceResponse struct { + // CellsChangedCount: The number of cells that were trimmed of + // whitespace. + CellsChangedCount int64 `json:"cellsChangedCount,omitempty"` + + // ForceSendFields is a list of field names (e.g. "CellsChangedCount") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CellsChangedCount") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *TrimWhitespaceResponse) MarshalJSON() ([]byte, error) { + type NoMethod TrimWhitespaceResponse + raw := NoMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // UnmergeCellsRequest: Unmerges cells in the given range. type UnmergeCellsRequest struct { // Range: The range within which all cells should be unmerged. @@ -9670,6 +9910,7 @@ func (c *SpreadsheetsBatchUpdateCall) Header() http.Header { func (c *SpreadsheetsBatchUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -9809,6 +10050,7 @@ func (c *SpreadsheetsCreateCall) Header() http.Header { func (c *SpreadsheetsCreateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -9985,6 +10227,7 @@ func (c *SpreadsheetsGetCall) Header() http.Header { func (c *SpreadsheetsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -10160,6 +10403,7 @@ func (c *SpreadsheetsGetByDataFilterCall) Header() http.Header { func (c *SpreadsheetsGetByDataFilterCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -10314,6 +10558,7 @@ func (c *SpreadsheetsDeveloperMetadataGetCall) Header() http.Header { func (c *SpreadsheetsDeveloperMetadataGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -10467,6 +10712,7 @@ func (c *SpreadsheetsDeveloperMetadataSearchCall) Header() http.Header { func (c *SpreadsheetsDeveloperMetadataSearchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -10611,6 +10857,7 @@ func (c *SpreadsheetsSheetsCopyToCall) Header() http.Header { func (c *SpreadsheetsSheetsCopyToCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -10846,6 +11093,7 @@ func (c *SpreadsheetsValuesAppendCall) Header() http.Header { func (c *SpreadsheetsValuesAppendCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -11043,6 +11291,7 @@ func (c *SpreadsheetsValuesBatchClearCall) Header() http.Header { func (c *SpreadsheetsValuesBatchClearCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -11190,6 +11439,7 @@ func (c *SpreadsheetsValuesBatchClearByDataFilterCall) Header() http.Header { func (c *SpreadsheetsValuesBatchClearByDataFilterCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -11398,6 +11648,7 @@ func (c *SpreadsheetsValuesBatchGetCall) Header() http.Header { func (c *SpreadsheetsValuesBatchGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -11575,6 +11826,7 @@ func (c *SpreadsheetsValuesBatchGetByDataFilterCall) Header() http.Header { func (c *SpreadsheetsValuesBatchGetByDataFilterCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -11719,6 +11971,7 @@ func (c *SpreadsheetsValuesBatchUpdateCall) Header() http.Header { func (c *SpreadsheetsValuesBatchUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -11863,6 +12116,7 @@ func (c *SpreadsheetsValuesBatchUpdateByDataFilterCall) Header() http.Header { func (c *SpreadsheetsValuesBatchUpdateByDataFilterCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -12010,6 +12264,7 @@ func (c *SpreadsheetsValuesClearCall) Header() http.Header { func (c *SpreadsheetsValuesClearCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -12219,6 +12474,7 @@ func (c *SpreadsheetsValuesGetCall) Header() http.Header { func (c *SpreadsheetsValuesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } @@ -12456,6 +12712,7 @@ func (c *SpreadsheetsValuesUpdateCall) Header() http.Header { func (c *SpreadsheetsValuesUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) + reqHeaders.Set("x-goog-api-client", "gl-go/1.11.0 gdcl/20190802") for k, v := range c.header_ { reqHeaders[k] = v } diff --git a/vendor/google.golang.org/grpc/.travis.yml b/vendor/google.golang.org/grpc/.travis.yml index 591343ed..024408e6 100644 --- a/vendor/google.golang.org/grpc/.travis.yml +++ b/vendor/google.golang.org/grpc/.travis.yml @@ -3,15 +3,15 @@ language: go matrix: include: - go: 1.12.x - env: GO111MODULE=on - - go: 1.11.x env: VET=1 GO111MODULE=on - - go: 1.11.x + - go: 1.12.x env: RACE=1 GO111MODULE=on - - go: 1.11.x + - go: 1.12.x env: RUN386=1 - - go: 1.11.x + - go: 1.12.x env: GRPC_GO_RETRY=on + - go: 1.11.x + env: GO111MODULE=on - go: 1.10.x - go: 1.9.x - go: 1.9.x diff --git a/vendor/google.golang.org/grpc/balancer.go b/vendor/google.golang.org/grpc/balancer.go index a78e702b..a8eb0f47 100644 --- a/vendor/google.golang.org/grpc/balancer.go +++ b/vendor/google.golang.org/grpc/balancer.go @@ -43,7 +43,7 @@ type Address struct { // BalancerConfig specifies the configurations for Balancer. // -// Deprecated: please use package balancer. +// Deprecated: please use package balancer. May be removed in a future 1.x release. type BalancerConfig struct { // DialCreds is the transport credential the Balancer implementation can // use to dial to a remote load balancer server. The Balancer implementations @@ -57,7 +57,7 @@ type BalancerConfig struct { // BalancerGetOptions configures a Get call. // -// Deprecated: please use package balancer. +// Deprecated: please use package balancer. May be removed in a future 1.x release. type BalancerGetOptions struct { // BlockingWait specifies whether Get should block when there is no // connected address. @@ -66,7 +66,7 @@ type BalancerGetOptions struct { // Balancer chooses network addresses for RPCs. // -// Deprecated: please use package balancer. +// Deprecated: please use package balancer. May be removed in a future 1.x release. type Balancer interface { // Start does the initialization work to bootstrap a Balancer. For example, // this function may start the name resolution and watch the updates. It will @@ -120,7 +120,7 @@ type Balancer interface { // RoundRobin returns a Balancer that selects addresses round-robin. It uses r to watch // the name resolution updates and updates the addresses available correspondingly. // -// Deprecated: please use package balancer/roundrobin. +// Deprecated: please use package balancer/roundrobin. May be removed in a future 1.x release. func RoundRobin(r naming.Resolver) Balancer { return &roundRobin{r: r} } diff --git a/vendor/google.golang.org/grpc/balancer/balancer.go b/vendor/google.golang.org/grpc/balancer/balancer.go index 4b72daa8..c266f4ec 100644 --- a/vendor/google.golang.org/grpc/balancer/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/balancer.go @@ -22,6 +22,7 @@ package balancer import ( "context" + "encoding/json" "errors" "net" "strings" @@ -31,6 +32,7 @@ import ( "google.golang.org/grpc/internal" "google.golang.org/grpc/metadata" "google.golang.org/grpc/resolver" + "google.golang.org/grpc/serviceconfig" ) var ( @@ -39,7 +41,10 @@ var ( ) // Register registers the balancer builder to the balancer map. b.Name -// (lowercased) will be used as the name registered with this builder. +// (lowercased) will be used as the name registered with this builder. If the +// Builder implements ConfigParser, ParseConfig will be called when new service +// configs are received by the resolver, and the result will be provided to the +// Balancer in UpdateClientConnState. // // NOTE: this function must only be called during initialization time (i.e. in // an init() function), and is not thread-safe. If multiple Balancers are @@ -172,6 +177,14 @@ type Builder interface { Name() string } +// ConfigParser parses load balancer configs. +type ConfigParser interface { + // ParseConfig parses the JSON load balancer config provided into an + // internal form or returns an error if the config is invalid. For future + // compatibility reasons, unknown fields in the config should be ignored. + ParseConfig(LoadBalancingConfigJSON json.RawMessage) (serviceconfig.LoadBalancingConfig, error) +} + // PickOptions contains addition information for the Pick operation. type PickOptions struct { // FullMethodName is the method name that NewClientStream() is called @@ -270,7 +283,7 @@ type Balancer interface { // non-nil error to gRPC. // // Deprecated: if V2Balancer is implemented by the Balancer, - // UpdateResolverState will be called instead. + // UpdateClientConnState will be called instead. HandleResolvedAddrs([]resolver.Address, error) // Close closes the balancer. The balancer is not required to call // ClientConn.RemoveSubConn for its existing SubConns. @@ -283,14 +296,23 @@ type SubConnState struct { // TODO: add last connection error } +// ClientConnState describes the state of a ClientConn relevant to the +// balancer. +type ClientConnState struct { + ResolverState resolver.State + // The parsed load balancing configuration returned by the builder's + // ParseConfig method, if implemented. + BalancerConfig serviceconfig.LoadBalancingConfig +} + // V2Balancer is defined for documentation purposes. If a Balancer also -// implements V2Balancer, its UpdateResolverState method will be called instead -// of HandleResolvedAddrs and its UpdateSubConnState will be called instead of -// HandleSubConnStateChange. +// implements V2Balancer, its UpdateClientConnState method will be called +// instead of HandleResolvedAddrs and its UpdateSubConnState will be called +// instead of HandleSubConnStateChange. type V2Balancer interface { - // UpdateResolverState is called by gRPC when the state of the resolver + // UpdateClientConnState is called by gRPC when the state of the ClientConn // changes. - UpdateResolverState(resolver.State) + UpdateClientConnState(ClientConnState) // UpdateSubConnState is called by gRPC when the state of a SubConn // changes. UpdateSubConnState(SubConn, SubConnState) diff --git a/vendor/google.golang.org/grpc/balancer/base/balancer.go b/vendor/google.golang.org/grpc/balancer/base/balancer.go index c5a51bd1..1af88f0a 100644 --- a/vendor/google.golang.org/grpc/balancer/base/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/base/balancer.go @@ -70,13 +70,15 @@ func (b *baseBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) panic("not implemented") } -func (b *baseBalancer) UpdateResolverState(s resolver.State) { - // TODO: handle s.Err (log if not nil) once implemented. - // TODO: handle s.ServiceConfig? - grpclog.Infoln("base.baseBalancer: got new resolver state: ", s) +func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) { + // TODO: handle s.ResolverState.Err (log if not nil) once implemented. + // TODO: handle s.ResolverState.ServiceConfig? + if grpclog.V(2) { + grpclog.Infoln("base.baseBalancer: got new ClientConn state: ", s) + } // addrsSet is the set converted from addrs, it's used for quick lookup of an address. addrsSet := make(map[resolver.Address]struct{}) - for _, a := range s.Addresses { + for _, a := range s.ResolverState.Addresses { addrsSet[a] = struct{}{} if _, ok := b.subConns[a]; !ok { // a is a new address (not existing in b.subConns). @@ -127,10 +129,14 @@ func (b *baseBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectiv func (b *baseBalancer) UpdateSubConnState(sc balancer.SubConn, state balancer.SubConnState) { s := state.ConnectivityState - grpclog.Infof("base.baseBalancer: handle SubConn state change: %p, %v", sc, s) + if grpclog.V(2) { + grpclog.Infof("base.baseBalancer: handle SubConn state change: %p, %v", sc, s) + } oldS, ok := b.scStates[sc] if !ok { - grpclog.Infof("base.baseBalancer: got state changes for an unknown SubConn: %p, %v", sc, s) + if grpclog.V(2) { + grpclog.Infof("base.baseBalancer: got state changes for an unknown SubConn: %p, %v", sc, s) + } return } b.scStates[sc] = s diff --git a/vendor/google.golang.org/grpc/balancer_conn_wrappers.go b/vendor/google.golang.org/grpc/balancer_conn_wrappers.go index bc965f0a..8df4095c 100644 --- a/vendor/google.golang.org/grpc/balancer_conn_wrappers.go +++ b/vendor/google.golang.org/grpc/balancer_conn_wrappers.go @@ -88,7 +88,7 @@ type ccBalancerWrapper struct { cc *ClientConn balancer balancer.Balancer stateChangeQueue *scStateUpdateBuffer - resolverUpdateCh chan *resolver.State + ccUpdateCh chan *balancer.ClientConnState done chan struct{} mu sync.Mutex @@ -99,7 +99,7 @@ func newCCBalancerWrapper(cc *ClientConn, b balancer.Builder, bopts balancer.Bui ccb := &ccBalancerWrapper{ cc: cc, stateChangeQueue: newSCStateUpdateBuffer(), - resolverUpdateCh: make(chan *resolver.State, 1), + ccUpdateCh: make(chan *balancer.ClientConnState, 1), done: make(chan struct{}), subConns: make(map[*acBalancerWrapper]struct{}), } @@ -126,7 +126,7 @@ func (ccb *ccBalancerWrapper) watcher() { } else { ccb.balancer.HandleSubConnStateChange(t.sc, t.state) } - case s := <-ccb.resolverUpdateCh: + case s := <-ccb.ccUpdateCh: select { case <-ccb.done: ccb.balancer.Close() @@ -134,9 +134,9 @@ func (ccb *ccBalancerWrapper) watcher() { default: } if ub, ok := ccb.balancer.(balancer.V2Balancer); ok { - ub.UpdateResolverState(*s) + ub.UpdateClientConnState(*s) } else { - ccb.balancer.HandleResolvedAddrs(s.Addresses, nil) + ccb.balancer.HandleResolvedAddrs(s.ResolverState.Addresses, nil) } case <-ccb.done: } @@ -151,9 +151,11 @@ func (ccb *ccBalancerWrapper) watcher() { for acbw := range scs { ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain) } + ccb.UpdateBalancerState(connectivity.Connecting, nil) return default: } + ccb.cc.firstResolveEvent.Fire() } } @@ -178,9 +180,10 @@ func (ccb *ccBalancerWrapper) handleSubConnStateChange(sc balancer.SubConn, s co }) } -func (ccb *ccBalancerWrapper) updateResolverState(s resolver.State) { +func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnState) { if ccb.cc.curBalancerName != grpclbName { // Filter any grpclb addresses since we don't have the grpclb balancer. + s := &ccs.ResolverState for i := 0; i < len(s.Addresses); { if s.Addresses[i].Type == resolver.GRPCLB { copy(s.Addresses[i:], s.Addresses[i+1:]) @@ -191,10 +194,10 @@ func (ccb *ccBalancerWrapper) updateResolverState(s resolver.State) { } } select { - case <-ccb.resolverUpdateCh: + case <-ccb.ccUpdateCh: default: } - ccb.resolverUpdateCh <- &s + ccb.ccUpdateCh <- ccs } func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) { diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go index 78e6d178..a7643df7 100644 --- a/vendor/google.golang.org/grpc/clientconn.go +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -38,13 +38,13 @@ import ( "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal/backoff" "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/envconfig" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/transport" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/resolver" _ "google.golang.org/grpc/resolver/dns" // To register dns resolver. _ "google.golang.org/grpc/resolver/passthrough" // To register passthrough resolver. + "google.golang.org/grpc/serviceconfig" "google.golang.org/grpc/status" ) @@ -532,24 +532,6 @@ func (cc *ClientConn) waitForResolvedAddrs(ctx context.Context) error { } } -// gRPC should resort to default service config when: -// * resolver service config is disabled -// * or, resolver does not return a service config or returns an invalid one. -func (cc *ClientConn) fallbackToDefaultServiceConfig(sc string) bool { - if cc.dopts.disableServiceConfig { - return true - } - // The logic below is temporary, will be removed once we change the resolver.State ServiceConfig field type. - // Right now, we assume that empty service config string means resolver does not return a config. - if sc == "" { - return true - } - // TODO: the logic below is temporary. Once we finish the logic to validate service config - // in resolver, we will replace the logic below. - _, err := parseServiceConfig(sc) - return err != nil -} - func (cc *ClientConn) updateResolverState(s resolver.State) error { cc.mu.Lock() defer cc.mu.Unlock() @@ -560,44 +542,37 @@ func (cc *ClientConn) updateResolverState(s resolver.State) error { return nil } - if cc.fallbackToDefaultServiceConfig(s.ServiceConfig) { + if cc.dopts.disableServiceConfig || s.ServiceConfig == nil { if cc.dopts.defaultServiceConfig != nil && cc.sc == nil { cc.applyServiceConfig(cc.dopts.defaultServiceConfig) } - } else { - // TODO: the parsing logic below will be moved inside resolver. - sc, err := parseServiceConfig(s.ServiceConfig) - if err != nil { - return err - } - if cc.sc == nil || cc.sc.rawJSONString != s.ServiceConfig { - cc.applyServiceConfig(sc) - } - } - - // update the service config that will be sent to balancer. - if cc.sc != nil { - s.ServiceConfig = cc.sc.rawJSONString + } else if sc, ok := s.ServiceConfig.(*ServiceConfig); ok { + cc.applyServiceConfig(sc) } + var balCfg serviceconfig.LoadBalancingConfig if cc.dopts.balancerBuilder == nil { // Only look at balancer types and switch balancer if balancer dial // option is not set. - var isGRPCLB bool - for _, a := range s.Addresses { - if a.Type == resolver.GRPCLB { - isGRPCLB = true - break - } - } var newBalancerName string - // TODO: use new loadBalancerConfig field with appropriate priority. - if isGRPCLB { - newBalancerName = grpclbName - } else if cc.sc != nil && cc.sc.LB != nil { - newBalancerName = *cc.sc.LB + if cc.sc != nil && cc.sc.lbConfig != nil { + newBalancerName = cc.sc.lbConfig.name + balCfg = cc.sc.lbConfig.cfg } else { - newBalancerName = PickFirstBalancerName + var isGRPCLB bool + for _, a := range s.Addresses { + if a.Type == resolver.GRPCLB { + isGRPCLB = true + break + } + } + if isGRPCLB { + newBalancerName = grpclbName + } else if cc.sc != nil && cc.sc.LB != nil { + newBalancerName = *cc.sc.LB + } else { + newBalancerName = PickFirstBalancerName + } } cc.switchBalancer(newBalancerName) } else if cc.balancerWrapper == nil { @@ -607,8 +582,7 @@ func (cc *ClientConn) updateResolverState(s resolver.State) error { cc.balancerWrapper = newCCBalancerWrapper(cc, cc.dopts.balancerBuilder, cc.balancerBuildOpts) } - cc.balancerWrapper.updateResolverState(s) - cc.firstResolveEvent.Fire() + cc.balancerWrapper.updateClientConnState(&balancer.ClientConnState{ResolverState: s, BalancerConfig: balCfg}) return nil } @@ -621,7 +595,7 @@ func (cc *ClientConn) updateResolverState(s resolver.State) error { // // Caller must hold cc.mu. func (cc *ClientConn) switchBalancer(name string) { - if strings.ToLower(cc.curBalancerName) == strings.ToLower(name) { + if strings.EqualFold(cc.curBalancerName, name) { return } @@ -760,6 +734,8 @@ func (ac *addrConn) connect() error { ac.mu.Unlock() return nil } + // Update connectivity state within the lock to prevent subsequent or + // concurrent calls from resetting the transport more than once. ac.updateConnectivityState(connectivity.Connecting) ac.mu.Unlock() @@ -770,7 +746,16 @@ func (ac *addrConn) connect() error { // tryUpdateAddrs tries to update ac.addrs with the new addresses list. // -// It checks whether current connected address of ac is in the new addrs list. +// If ac is Connecting, it returns false. The caller should tear down the ac and +// create a new one. Note that the backoff will be reset when this happens. +// +// If ac is TransientFailure, it updates ac.addrs and returns true. The updated +// addresses will be picked up by retry in the next iteration after backoff. +// +// If ac is Shutdown or Idle, it updates ac.addrs and returns true. +// +// If ac is Ready, it checks whether current connected address of ac is in the +// new addrs list. // - If true, it updates ac.addrs and returns true. The ac will keep using // the existing connection. // - If false, it does nothing and returns false. @@ -778,17 +763,18 @@ func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool { ac.mu.Lock() defer ac.mu.Unlock() grpclog.Infof("addrConn: tryUpdateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs) - if ac.state == connectivity.Shutdown { + if ac.state == connectivity.Shutdown || + ac.state == connectivity.TransientFailure || + ac.state == connectivity.Idle { ac.addrs = addrs return true } - // Unless we're busy reconnecting already, let's reconnect from the top of - // the list. - if ac.state != connectivity.Ready { + if ac.state == connectivity.Connecting { return false } + // ac.state is Ready, try to find the connected address. var curAddrFound bool for _, a := range addrs { if reflect.DeepEqual(ac.curAddr, a) { @@ -1037,6 +1023,9 @@ func (ac *addrConn) resetTransport() { // The spec doesn't mention what should be done for multiple addresses. // https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md#proposed-backoff-algorithm connectDeadline := time.Now().Add(dialDuration) + + ac.updateConnectivityState(connectivity.Connecting) + ac.transport = nil ac.mu.Unlock() newTr, addr, reconnect, err := ac.tryAllAddrs(addrs, connectDeadline) @@ -1071,55 +1060,32 @@ func (ac *addrConn) resetTransport() { ac.mu.Lock() if ac.state == connectivity.Shutdown { - newTr.Close() ac.mu.Unlock() + newTr.Close() return } ac.curAddr = addr ac.transport = newTr ac.backoffIdx = 0 - healthCheckConfig := ac.cc.healthCheckConfig() - // LB channel health checking is only enabled when all the four requirements below are met: - // 1. it is not disabled by the user with the WithDisableHealthCheck DialOption, - // 2. the internal.HealthCheckFunc is set by importing the grpc/healthcheck package, - // 3. a service config with non-empty healthCheckConfig field is provided, - // 4. the current load balancer allows it. hctx, hcancel := context.WithCancel(ac.ctx) - healthcheckManagingState := false - if !ac.cc.dopts.disableHealthCheck && healthCheckConfig != nil && ac.scopts.HealthCheckEnabled { - if ac.cc.dopts.healthCheckFunc == nil { - // TODO: add a link to the health check doc in the error message. - grpclog.Error("the client side LB channel health check function has not been set.") - } else { - // TODO(deklerk) refactor to just return transport - go ac.startHealthCheck(hctx, newTr, addr, healthCheckConfig.ServiceName) - healthcheckManagingState = true - } - } - if !healthcheckManagingState { - ac.updateConnectivityState(connectivity.Ready) - } + ac.startHealthCheck(hctx) ac.mu.Unlock() // Block until the created transport is down. And when this happens, // we restart from the top of the addr list. <-reconnect.Done() hcancel() - - // Need to reconnect after a READY, the addrConn enters - // TRANSIENT_FAILURE. + // restart connecting - the top of the loop will set state to + // CONNECTING. This is against the current connectivity semantics doc, + // however it allows for graceful behavior for RPCs not yet dispatched + // - unfortunate timing would otherwise lead to the RPC failing even + // though the TRANSIENT_FAILURE state (called for by the doc) would be + // instantaneous. // - // This will set addrConn to TRANSIENT_FAILURE for a very short period - // of time, and turns CONNECTING. It seems reasonable to skip this, but - // READY-CONNECTING is not a valid transition. - ac.mu.Lock() - if ac.state == connectivity.Shutdown { - ac.mu.Unlock() - return - } - ac.updateConnectivityState(connectivity.TransientFailure) - ac.mu.Unlock() + // Ideally we should transition to Idle here and block until there is + // RPC activity that leads to the balancer requesting a reconnect of + // the associated SubConn. } } @@ -1133,8 +1099,6 @@ func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.T ac.mu.Unlock() return nil, resolver.Address{}, nil, errConnClosing } - ac.updateConnectivityState(connectivity.Connecting) - ac.transport = nil ac.cc.mu.RLock() ac.dopts.copts.KeepaliveParams = ac.cc.mkp @@ -1178,14 +1142,35 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne Authority: ac.cc.authority, } + once := sync.Once{} onGoAway := func(r transport.GoAwayReason) { ac.mu.Lock() ac.adjustParams(r) + once.Do(func() { + if ac.state == connectivity.Ready { + // Prevent this SubConn from being used for new RPCs by setting its + // state to Connecting. + // + // TODO: this should be Idle when grpc-go properly supports it. + ac.updateConnectivityState(connectivity.Connecting) + } + }) ac.mu.Unlock() reconnect.Fire() } onClose := func() { + ac.mu.Lock() + once.Do(func() { + if ac.state == connectivity.Ready { + // Prevent this SubConn from being used for new RPCs by setting its + // state to Connecting. + // + // TODO: this should be Idle when grpc-go properly supports it. + ac.updateConnectivityState(connectivity.Connecting) + } + }) + ac.mu.Unlock() close(onCloseCalled) reconnect.Fire() } @@ -1207,60 +1192,99 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne return nil, nil, err } - if ac.dopts.reqHandshake == envconfig.RequireHandshakeOn { - select { - case <-time.After(connectDeadline.Sub(time.Now())): - // We didn't get the preface in time. - newTr.Close() - grpclog.Warningf("grpc: addrConn.createTransport failed to connect to %v: didn't receive server preface in time. Reconnecting...", addr) - return nil, nil, errors.New("timed out waiting for server handshake") - case <-prefaceReceived: - // We got the preface - huzzah! things are good. - case <-onCloseCalled: - // The transport has already closed - noop. - return nil, nil, errors.New("connection closed") - // TODO(deklerk) this should bail on ac.ctx.Done(). Add a test and fix. - } + select { + case <-time.After(connectDeadline.Sub(time.Now())): + // We didn't get the preface in time. + newTr.Close() + grpclog.Warningf("grpc: addrConn.createTransport failed to connect to %v: didn't receive server preface in time. Reconnecting...", addr) + return nil, nil, errors.New("timed out waiting for server handshake") + case <-prefaceReceived: + // We got the preface - huzzah! things are good. + case <-onCloseCalled: + // The transport has already closed - noop. + return nil, nil, errors.New("connection closed") + // TODO(deklerk) this should bail on ac.ctx.Done(). Add a test and fix. } return newTr, reconnect, nil } -func (ac *addrConn) startHealthCheck(ctx context.Context, newTr transport.ClientTransport, addr resolver.Address, serviceName string) { - // Set up the health check helper functions - newStream := func() (interface{}, error) { - return ac.newClientStream(ctx, &StreamDesc{ServerStreams: true}, "/grpc.health.v1.Health/Watch", newTr) +// startHealthCheck starts the health checking stream (RPC) to watch the health +// stats of this connection if health checking is requested and configured. +// +// LB channel health checking is enabled when all requirements below are met: +// 1. it is not disabled by the user with the WithDisableHealthCheck DialOption +// 2. internal.HealthCheckFunc is set by importing the grpc/healthcheck package +// 3. a service config with non-empty healthCheckConfig field is provided +// 4. the load balancer requests it +// +// It sets addrConn to READY if the health checking stream is not started. +// +// Caller must hold ac.mu. +func (ac *addrConn) startHealthCheck(ctx context.Context) { + var healthcheckManagingState bool + defer func() { + if !healthcheckManagingState { + ac.updateConnectivityState(connectivity.Ready) + } + }() + + if ac.cc.dopts.disableHealthCheck { + return } - firstReady := true - reportHealth := func(ok bool) { + healthCheckConfig := ac.cc.healthCheckConfig() + if healthCheckConfig == nil { + return + } + if !ac.scopts.HealthCheckEnabled { + return + } + healthCheckFunc := ac.cc.dopts.healthCheckFunc + if healthCheckFunc == nil { + // The health package is not imported to set health check function. + // + // TODO: add a link to the health check doc in the error message. + grpclog.Error("Health check is requested but health check function is not set.") + return + } + + healthcheckManagingState = true + + // Set up the health check helper functions. + currentTr := ac.transport + newStream := func(method string) (interface{}, error) { + ac.mu.Lock() + if ac.transport != currentTr { + ac.mu.Unlock() + return nil, status.Error(codes.Canceled, "the provided transport is no longer valid to use") + } + ac.mu.Unlock() + return newNonRetryClientStream(ctx, &StreamDesc{ServerStreams: true}, method, currentTr, ac) + } + setConnectivityState := func(s connectivity.State) { ac.mu.Lock() defer ac.mu.Unlock() - if ac.transport != newTr { + if ac.transport != currentTr { return } - if ok { - if firstReady { - firstReady = false - ac.curAddr = addr - } - ac.updateConnectivityState(connectivity.Ready) - } else { - ac.updateConnectivityState(connectivity.TransientFailure) - } + ac.updateConnectivityState(s) } - err := ac.cc.dopts.healthCheckFunc(ctx, newStream, reportHealth, serviceName) - if err != nil { - if status.Code(err) == codes.Unimplemented { - if channelz.IsOn() { - channelz.AddTraceEvent(ac.channelzID, &channelz.TraceEventDesc{ - Desc: "Subchannel health check is unimplemented at server side, thus health check is disabled", - Severity: channelz.CtError, - }) + // Start the health checking stream. + go func() { + err := ac.cc.dopts.healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName) + if err != nil { + if status.Code(err) == codes.Unimplemented { + if channelz.IsOn() { + channelz.AddTraceEvent(ac.channelzID, &channelz.TraceEventDesc{ + Desc: "Subchannel health check is unimplemented at server side, thus health check is disabled", + Severity: channelz.CtError, + }) + } + grpclog.Error("Subchannel health check is unimplemented at server side, thus health check is disabled") + } else { + grpclog.Errorf("HealthCheckFunc exits with unexpected error %v", err) } - grpclog.Error("Subchannel health check is unimplemented at server side, thus health check is disabled") - } else { - grpclog.Errorf("HealthCheckFunc exits with unexpected error %v", err) } - } + }() } func (ac *addrConn) resetConnectBackoff() { diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go index 88aff945..8ea3d4a1 100644 --- a/vendor/google.golang.org/grpc/credentials/credentials.go +++ b/vendor/google.golang.org/grpc/credentials/credentials.go @@ -278,24 +278,22 @@ type ChannelzSecurityValue interface { // TLSChannelzSecurityValue defines the struct that TLS protocol should return // from GetSecurityValue(), containing security info like cipher and certificate used. type TLSChannelzSecurityValue struct { + ChannelzSecurityValue StandardName string LocalCertificate []byte RemoteCertificate []byte } -func (*TLSChannelzSecurityValue) isChannelzSecurityValue() {} - // OtherChannelzSecurityValue defines the struct that non-TLS protocol should return // from GetSecurityValue(), which contains protocol specific security info. Note // the Value field will be sent to users of channelz requesting channel info, and // thus sensitive info should better be avoided. type OtherChannelzSecurityValue struct { + ChannelzSecurityValue Name string Value proto.Message } -func (*OtherChannelzSecurityValue) isChannelzSecurityValue() {} - var cipherSuiteLookup = map[uint16]string{ tls.TLS_RSA_WITH_RC4_128_SHA: "TLS_RSA_WITH_RC4_128_SHA", tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA: "TLS_RSA_WITH_3DES_EDE_CBC_SHA", diff --git a/vendor/google.golang.org/grpc/dialoptions.go b/vendor/google.golang.org/grpc/dialoptions.go index 69c00315..e8f34d0d 100644 --- a/vendor/google.golang.org/grpc/dialoptions.go +++ b/vendor/google.golang.org/grpc/dialoptions.go @@ -60,7 +60,6 @@ type dialOptions struct { balancerBuilder balancer.Builder // This is to support grpclb. resolverBuilder resolver.Builder - reqHandshake envconfig.RequireHandshakeSetting channelzParentID int64 disableServiceConfig bool disableRetry bool @@ -100,17 +99,6 @@ func newFuncDialOption(f func(*dialOptions)) *funcDialOption { } } -// WithWaitForHandshake blocks until the initial settings frame is received from -// the server before assigning RPCs to the connection. -// -// Deprecated: this is the default behavior, and this option will be removed -// after the 1.18 release. -func WithWaitForHandshake() DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.reqHandshake = envconfig.RequireHandshakeOn - }) -} - // WithWriteBufferSize determines how much data can be batched before doing a // write on the wire. The corresponding memory allocation for this buffer will // be twice the size to keep syscalls low. The default value for this buffer is @@ -156,7 +144,8 @@ func WithInitialConnWindowSize(s int32) DialOption { // WithMaxMsgSize returns a DialOption which sets the maximum message size the // client can receive. // -// Deprecated: use WithDefaultCallOptions(MaxCallRecvMsgSize(s)) instead. +// Deprecated: use WithDefaultCallOptions(MaxCallRecvMsgSize(s)) instead. Will +// be supported throughout 1.x. func WithMaxMsgSize(s int) DialOption { return WithDefaultCallOptions(MaxCallRecvMsgSize(s)) } @@ -172,7 +161,8 @@ func WithDefaultCallOptions(cos ...CallOption) DialOption { // WithCodec returns a DialOption which sets a codec for message marshaling and // unmarshaling. // -// Deprecated: use WithDefaultCallOptions(ForceCodec(_)) instead. +// Deprecated: use WithDefaultCallOptions(ForceCodec(_)) instead. Will be +// supported throughout 1.x. func WithCodec(c Codec) DialOption { return WithDefaultCallOptions(CallCustomCodec(c)) } @@ -181,7 +171,7 @@ func WithCodec(c Codec) DialOption { // message compression. It has lower priority than the compressor set by the // UseCompressor CallOption. // -// Deprecated: use UseCompressor instead. +// Deprecated: use UseCompressor instead. Will be supported throughout 1.x. func WithCompressor(cp Compressor) DialOption { return newFuncDialOption(func(o *dialOptions) { o.cp = cp @@ -196,7 +186,8 @@ func WithCompressor(cp Compressor) DialOption { // message. If no compressor is registered for the encoding, an Unimplemented // status error will be returned. // -// Deprecated: use encoding.RegisterCompressor instead. +// Deprecated: use encoding.RegisterCompressor instead. Will be supported +// throughout 1.x. func WithDecompressor(dc Decompressor) DialOption { return newFuncDialOption(func(o *dialOptions) { o.dc = dc @@ -207,7 +198,7 @@ func WithDecompressor(dc Decompressor) DialOption { // Name resolver will be ignored if this DialOption is specified. // // Deprecated: use the new balancer APIs in balancer package and -// WithBalancerName. +// WithBalancerName. Will be removed in a future 1.x release. func WithBalancer(b Balancer) DialOption { return newFuncDialOption(func(o *dialOptions) { o.balancerBuilder = &balancerWrapperBuilder{ @@ -223,7 +214,8 @@ func WithBalancer(b Balancer) DialOption { // The balancer cannot be overridden by balancer option specified by service // config. // -// This is an EXPERIMENTAL API. +// Deprecated: use WithDefaultServiceConfig and WithDisableServiceConfig +// instead. Will be removed in a future 1.x release. func WithBalancerName(balancerName string) DialOption { builder := balancer.Get(balancerName) if builder == nil { @@ -244,9 +236,10 @@ func withResolverBuilder(b resolver.Builder) DialOption { // WithServiceConfig returns a DialOption which has a channel to read the // service configuration. // -// Deprecated: service config should be received through name resolver, as -// specified here. -// https://github.com/grpc/grpc/blob/master/doc/service_config.md +// Deprecated: service config should be received through name resolver or via +// WithDefaultServiceConfig, as specified at +// https://github.com/grpc/grpc/blob/master/doc/service_config.md. Will be +// removed in a future 1.x release. func WithServiceConfig(c <-chan ServiceConfig) DialOption { return newFuncDialOption(func(o *dialOptions) { o.scChan = c @@ -329,7 +322,8 @@ func WithCredentialsBundle(b credentials.Bundle) DialOption { // WithTimeout returns a DialOption that configures a timeout for dialing a // ClientConn initially. This is valid if and only if WithBlock() is present. // -// Deprecated: use DialContext and context.WithTimeout instead. +// Deprecated: use DialContext and context.WithTimeout instead. Will be +// supported throughout 1.x. func WithTimeout(d time.Duration) DialOption { return newFuncDialOption(func(o *dialOptions) { o.timeout = d @@ -356,7 +350,8 @@ func init() { // is returned by f, gRPC checks the error's Temporary() method to decide if it // should try to reconnect to the network address. // -// Deprecated: use WithContextDialer instead +// Deprecated: use WithContextDialer instead. Will be supported throughout +// 1.x. func WithDialer(f func(string, time.Duration) (net.Conn, error)) DialOption { return WithContextDialer( func(ctx context.Context, addr string) (net.Conn, error) { @@ -480,8 +475,10 @@ func WithDisableServiceConfig() DialOption { // WithDefaultServiceConfig returns a DialOption that configures the default // service config, which will be used in cases where: -// 1. WithDisableServiceConfig is called. -// 2. Resolver does not return service config or if the resolver gets and invalid config. +// +// 1. WithDisableServiceConfig is also used. +// 2. Resolver does not return a service config or if the resolver returns an +// invalid service config. // // This API is EXPERIMENTAL. func WithDefaultServiceConfig(s string) DialOption { @@ -537,7 +534,6 @@ func withHealthCheckFunc(f internal.HealthChecker) DialOption { func defaultDialOptions() dialOptions { return dialOptions{ disableRetry: !envconfig.Retry, - reqHandshake: envconfig.RequireHandshake, healthCheckFunc: internal.HealthCheckFunc, copts: transport.ConnectOptions{ WriteBufferSize: defaultWriteBufSize, diff --git a/vendor/google.golang.org/grpc/go.mod b/vendor/google.golang.org/grpc/go.mod index b75c069a..c1a8340c 100644 --- a/vendor/google.golang.org/grpc/go.mod +++ b/vendor/google.golang.org/grpc/go.mod @@ -11,10 +11,9 @@ require ( golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 golang.org/x/net v0.0.0-20190311183353-d8887717615a golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be - golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a - golang.org/x/tools v0.0.0-20190311212946-11955173bddd + golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 google.golang.org/appengine v1.1.0 // indirect google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 - honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099 + honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc ) diff --git a/vendor/google.golang.org/grpc/go.sum b/vendor/google.golang.org/grpc/go.sum index 2a172347..741677d2 100644 --- a/vendor/google.golang.org/grpc/go.sum +++ b/vendor/google.golang.org/grpc/go.sum @@ -19,17 +19,19 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJV golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 h1:5Beo0mZN8dRzgrMMkDp0jc8YXQKx9DiJ2k1dkvGsn5A= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099 h1:XJP7lxbSxWLOMNdBE4B/STaqVy6L73o0knwj2vIlxnw= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go index 11be7cd0..3ee8740f 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go @@ -25,40 +25,11 @@ import ( ) const ( - prefix = "GRPC_GO_" - retryStr = prefix + "RETRY" - requireHandshakeStr = prefix + "REQUIRE_HANDSHAKE" -) - -// RequireHandshakeSetting describes the settings for handshaking. -type RequireHandshakeSetting int - -const ( - // RequireHandshakeOn indicates to wait for handshake before considering a - // connection ready/successful. - RequireHandshakeOn RequireHandshakeSetting = iota - // RequireHandshakeOff indicates to not wait for handshake before - // considering a connection ready/successful. - RequireHandshakeOff + prefix = "GRPC_GO_" + retryStr = prefix + "RETRY" ) var ( // Retry is set if retry is explicitly enabled via "GRPC_GO_RETRY=on". Retry = strings.EqualFold(os.Getenv(retryStr), "on") - // RequireHandshake is set based upon the GRPC_GO_REQUIRE_HANDSHAKE - // environment variable. - // - // Will be removed after the 1.18 release. - RequireHandshake = RequireHandshakeOn ) - -func init() { - switch strings.ToLower(os.Getenv(requireHandshakeStr)) { - case "on": - fallthrough - default: - RequireHandshake = RequireHandshakeOn - case "off": - RequireHandshake = RequireHandshakeOff - } -} diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go index c1d2c690..bc1f99ac 100644 --- a/vendor/google.golang.org/grpc/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/internal.go @@ -23,6 +23,8 @@ package internal import ( "context" "time" + + "google.golang.org/grpc/connectivity" ) var ( @@ -37,10 +39,25 @@ var ( // KeepaliveMinPingTime is the minimum ping interval. This must be 10s by // default, but tests may wish to set it lower for convenience. KeepaliveMinPingTime = 10 * time.Second + // ParseServiceConfig is a function to parse JSON service configs into + // opaque data structures. + ParseServiceConfig func(sc string) (interface{}, error) + // StatusRawProto is exported by status/status.go. This func returns a + // pointer to the wrapped Status proto for a given status.Status without a + // call to proto.Clone(). The returned Status proto should not be mutated by + // the caller. + StatusRawProto interface{} // func (*status.Status) *spb.Status ) // HealthChecker defines the signature of the client-side LB channel health checking function. -type HealthChecker func(ctx context.Context, newStream func() (interface{}, error), reportHealth func(bool), serviceName string) error +// +// The implementation is expected to create a health checking RPC stream by +// calling newStream(), watch for the health status of serviceName, and report +// it's health back by calling setConnectivityState(). +// +// The health checking protocol is defined at: +// https://github.com/grpc/grpc/blob/master/doc/health-checking.md +type HealthChecker func(ctx context.Context, newStream func(string) (interface{}, error), setConnectivityState func(connectivity.State), serviceName string) error const ( // CredsBundleModeFallback switches GoogleDefaultCreds to fallback mode. diff --git a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go index 204ba158..b8e0aa4d 100644 --- a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go +++ b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go @@ -23,6 +23,7 @@ import ( "fmt" "runtime" "sync" + "sync/atomic" "golang.org/x/net/http2" "golang.org/x/net/http2/hpack" @@ -84,12 +85,24 @@ func (il *itemList) isEmpty() bool { // the control buffer of transport. They represent different aspects of // control tasks, e.g., flow control, settings, streaming resetting, etc. +// maxQueuedTransportResponseFrames is the most queued "transport response" +// frames we will buffer before preventing new reads from occurring on the +// transport. These are control frames sent in response to client requests, +// such as RST_STREAM due to bad headers or settings acks. +const maxQueuedTransportResponseFrames = 50 + +type cbItem interface { + isTransportResponseFrame() bool +} + // registerStream is used to register an incoming stream with loopy writer. type registerStream struct { streamID uint32 wq *writeQuota } +func (*registerStream) isTransportResponseFrame() bool { return false } + // headerFrame is also used to register stream on the client-side. type headerFrame struct { streamID uint32 @@ -102,6 +115,10 @@ type headerFrame struct { onOrphaned func(error) // Valid on client-side } +func (h *headerFrame) isTransportResponseFrame() bool { + return h.cleanup != nil && h.cleanup.rst // Results in a RST_STREAM +} + type cleanupStream struct { streamID uint32 rst bool @@ -109,6 +126,8 @@ type cleanupStream struct { onWrite func() } +func (c *cleanupStream) isTransportResponseFrame() bool { return c.rst } // Results in a RST_STREAM + type dataFrame struct { streamID uint32 endStream bool @@ -119,27 +138,41 @@ type dataFrame struct { onEachWrite func() } +func (*dataFrame) isTransportResponseFrame() bool { return false } + type incomingWindowUpdate struct { streamID uint32 increment uint32 } +func (*incomingWindowUpdate) isTransportResponseFrame() bool { return false } + type outgoingWindowUpdate struct { streamID uint32 increment uint32 } +func (*outgoingWindowUpdate) isTransportResponseFrame() bool { + return false // window updates are throttled by thresholds +} + type incomingSettings struct { ss []http2.Setting } +func (*incomingSettings) isTransportResponseFrame() bool { return true } // Results in a settings ACK + type outgoingSettings struct { ss []http2.Setting } +func (*outgoingSettings) isTransportResponseFrame() bool { return false } + type incomingGoAway struct { } +func (*incomingGoAway) isTransportResponseFrame() bool { return false } + type goAway struct { code http2.ErrCode debugData []byte @@ -147,15 +180,21 @@ type goAway struct { closeConn bool } +func (*goAway) isTransportResponseFrame() bool { return false } + type ping struct { ack bool data [8]byte } +func (*ping) isTransportResponseFrame() bool { return true } + type outFlowControlSizeRequest struct { resp chan uint32 } +func (*outFlowControlSizeRequest) isTransportResponseFrame() bool { return false } + type outStreamState int const ( @@ -238,6 +277,14 @@ type controlBuffer struct { consumerWaiting bool list *itemList err error + + // transportResponseFrames counts the number of queued items that represent + // the response of an action initiated by the peer. trfChan is created + // when transportResponseFrames >= maxQueuedTransportResponseFrames and is + // closed and nilled when transportResponseFrames drops below the + // threshold. Both fields are protected by mu. + transportResponseFrames int + trfChan atomic.Value // *chan struct{} } func newControlBuffer(done <-chan struct{}) *controlBuffer { @@ -248,12 +295,24 @@ func newControlBuffer(done <-chan struct{}) *controlBuffer { } } -func (c *controlBuffer) put(it interface{}) error { +// throttle blocks if there are too many incomingSettings/cleanupStreams in the +// controlbuf. +func (c *controlBuffer) throttle() { + ch, _ := c.trfChan.Load().(*chan struct{}) + if ch != nil { + select { + case <-*ch: + case <-c.done: + } + } +} + +func (c *controlBuffer) put(it cbItem) error { _, err := c.executeAndPut(nil, it) return err } -func (c *controlBuffer) executeAndPut(f func(it interface{}) bool, it interface{}) (bool, error) { +func (c *controlBuffer) executeAndPut(f func(it interface{}) bool, it cbItem) (bool, error) { var wakeUp bool c.mu.Lock() if c.err != nil { @@ -271,6 +330,15 @@ func (c *controlBuffer) executeAndPut(f func(it interface{}) bool, it interface{ c.consumerWaiting = false } c.list.enqueue(it) + if it.isTransportResponseFrame() { + c.transportResponseFrames++ + if c.transportResponseFrames == maxQueuedTransportResponseFrames { + // We are adding the frame that puts us over the threshold; create + // a throttling channel. + ch := make(chan struct{}) + c.trfChan.Store(&ch) + } + } c.mu.Unlock() if wakeUp { select { @@ -304,7 +372,17 @@ func (c *controlBuffer) get(block bool) (interface{}, error) { return nil, c.err } if !c.list.isEmpty() { - h := c.list.dequeue() + h := c.list.dequeue().(cbItem) + if h.isTransportResponseFrame() { + if c.transportResponseFrames == maxQueuedTransportResponseFrames { + // We are removing the frame that put us over the + // threshold; close and clear the throttling channel. + ch := c.trfChan.Load().(*chan struct{}) + close(*ch) + c.trfChan.Store((*chan struct{})(nil)) + } + c.transportResponseFrames-- + } c.mu.Unlock() return h, nil } diff --git a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go index 5ea997a7..f262edd8 100644 --- a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go +++ b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go @@ -149,6 +149,7 @@ func (f *inFlow) maybeAdjust(n uint32) uint32 { n = uint32(math.MaxInt32) } f.mu.Lock() + defer f.mu.Unlock() // estSenderQuota is the receiver's view of the maximum number of bytes the sender // can send without a window update. estSenderQuota := int32(f.limit - (f.pendingData + f.pendingUpdate)) @@ -169,10 +170,8 @@ func (f *inFlow) maybeAdjust(n uint32) uint32 { // is padded; We will fallback on the current available window(at least a 1/4th of the limit). f.delta = n } - f.mu.Unlock() return f.delta } - f.mu.Unlock() return 0 } diff --git a/vendor/google.golang.org/grpc/internal/transport/handler_server.go b/vendor/google.golang.org/grpc/internal/transport/handler_server.go index f2de84d4..78f9ddc3 100644 --- a/vendor/google.golang.org/grpc/internal/transport/handler_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/handler_server.go @@ -24,6 +24,7 @@ package transport import ( + "bytes" "context" "errors" "fmt" @@ -347,7 +348,7 @@ func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream), trace ht.stats.HandleRPC(s.ctx, inHeader) } s.trReader = &transportReader{ - reader: &recvBufferReader{ctx: s.ctx, ctxDone: s.ctx.Done(), recv: s.buf}, + reader: &recvBufferReader{ctx: s.ctx, ctxDone: s.ctx.Done(), recv: s.buf, freeBuffer: func(*bytes.Buffer) {}}, windowHandler: func(int) {}, } @@ -361,7 +362,7 @@ func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream), trace for buf := make([]byte, readSize); ; { n, err := req.Body.Read(buf) if n > 0 { - s.buf.put(recvMsg{data: buf[:n:n]}) + s.buf.put(recvMsg{buffer: bytes.NewBuffer(buf[:n:n])}) buf = buf[n:] } if err != nil { diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/vendor/google.golang.org/grpc/internal/transport/http2_client.go index e26e2814..41a79c56 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_client.go @@ -117,6 +117,8 @@ type http2Client struct { onGoAway func(GoAwayReason) onClose func() + + bufferPool *bufferPool } func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error), addr string) (net.Conn, error) { @@ -249,6 +251,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr TargetInfo, opts Conne onGoAway: onGoAway, onClose: onClose, keepaliveEnabled: keepaliveEnabled, + bufferPool: newBufferPool(), } t.controlBuf = newControlBuffer(t.ctxDone) if opts.InitialWindowSize >= defaultWindowSize { @@ -367,6 +370,7 @@ func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { closeStream: func(err error) { t.CloseStream(s, err) }, + freeBuffer: t.bufferPool.put, }, windowHandler: func(n int) { t.updateWindow(s, uint32(n)) @@ -437,6 +441,15 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) if md, added, ok := metadata.FromOutgoingContextRaw(ctx); ok { var k string + for k, vv := range md { + // HTTP doesn't allow you to set pseudoheaders after non pseudoheaders were set. + if isReservedHeader(k) { + continue + } + for _, v := range vv { + headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) + } + } for _, vv := range added { for i, v := range vv { if i%2 == 0 { @@ -450,15 +463,6 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) headerFields = append(headerFields, hpack.HeaderField{Name: strings.ToLower(k), Value: encodeMetadataHeader(k, v)}) } } - for k, vv := range md { - // HTTP doesn't allow you to set pseudoheaders after non pseudoheaders were set. - if isReservedHeader(k) { - continue - } - for _, v := range vv { - headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) - } - } } if md, ok := t.md.(*metadata.MD); ok { for k, vv := range *md { @@ -489,6 +493,9 @@ func (t *http2Client) createAudience(callHdr *CallHdr) string { } func (t *http2Client) getTrAuthData(ctx context.Context, audience string) (map[string]string, error) { + if len(t.perRPCCreds) == 0 { + return nil, nil + } authData := map[string]string{} for _, c := range t.perRPCCreds { data, err := c.GetRequestMetadata(ctx, audience) @@ -509,7 +516,7 @@ func (t *http2Client) getTrAuthData(ctx context.Context, audience string) (map[s } func (t *http2Client) getCallAuthData(ctx context.Context, audience string, callHdr *CallHdr) (map[string]string, error) { - callAuthData := map[string]string{} + var callAuthData map[string]string // Check if credentials.PerRPCCredentials were provided via call options. // Note: if these credentials are provided both via dial options and call // options, then both sets of credentials will be applied. @@ -521,6 +528,7 @@ func (t *http2Client) getCallAuthData(ctx context.Context, audience string, call if err != nil { return nil, status.Errorf(codes.Internal, "transport: %v", err) } + callAuthData = make(map[string]string, len(data)) for k, v := range data { // Capital header names are illegal in HTTP/2 k = strings.ToLower(k) @@ -552,7 +560,6 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea if atomic.CompareAndSwapUint32(&s.headerChanClosed, 0, 1) { close(s.headerChan) } - } hdr := &headerFrame{ hf: headerFields, @@ -765,6 +772,9 @@ func (t *http2Client) Close() error { t.mu.Unlock() return nil } + // Call t.onClose before setting the state to closing to prevent the client + // from attempting to create new streams ASAP. + t.onClose() t.state = closing streams := t.activeStreams t.activeStreams = nil @@ -785,7 +795,6 @@ func (t *http2Client) Close() error { } t.statsHandler.HandleConn(t.ctx, connEnd) } - t.onClose() return err } @@ -946,9 +955,10 @@ func (t *http2Client) handleData(f *http2.DataFrame) { // guarantee f.Data() is consumed before the arrival of next frame. // Can this copy be eliminated? if len(f.Data()) > 0 { - data := make([]byte, len(f.Data())) - copy(data, f.Data()) - s.write(recvMsg{data: data}) + buffer := t.bufferPool.get() + buffer.Reset() + buffer.Write(f.Data()) + s.write(recvMsg{buffer: buffer}) } } // The server has closed the stream without sending trailers. Record that @@ -973,9 +983,9 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { statusCode = codes.Unknown } if statusCode == codes.Canceled { - // Our deadline was already exceeded, and that was likely the cause of - // this cancelation. Alter the status code accordingly. - if d, ok := s.ctx.Deadline(); ok && d.After(time.Now()) { + if d, ok := s.ctx.Deadline(); ok && !d.After(time.Now()) { + // Our deadline was already exceeded, and that was likely the cause + // of this cancelation. Alter the status code accordingly. statusCode = codes.DeadlineExceeded } } @@ -1080,11 +1090,12 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { default: t.setGoAwayReason(f) close(t.goAway) - t.state = draining t.controlBuf.put(&incomingGoAway{}) - - // This has to be a new goroutine because we're still using the current goroutine to read in the transport. + // Notify the clientconn about the GOAWAY before we set the state to + // draining, to allow the client to stop attempting to create streams + // before disallowing new streams on this connection. t.onGoAway(t.goAwayReason) + t.state = draining } // All streams with IDs greater than the GoAwayId // and smaller than the previous GoAway ID should be killed. @@ -1234,6 +1245,7 @@ func (t *http2Client) reader() { // loop to keep reading incoming messages on this transport. for { + t.controlBuf.throttle() frame, err := t.framer.fr.ReadFrame() if t.keepaliveEnabled { atomic.CompareAndSwapUint32(&t.activity, 0, 1) @@ -1321,6 +1333,7 @@ func (t *http2Client) keepalive() { timer.Reset(t.kp.Time) continue } + infof("transport: closing client transport due to idleness.") t.Close() return case <-t.ctx.Done(): diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/vendor/google.golang.org/grpc/internal/transport/http2_server.go index 435092e5..83439b56 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_server.go @@ -35,9 +35,11 @@ import ( "golang.org/x/net/http2" "golang.org/x/net/http2/hpack" + spb "google.golang.org/genproto/googleapis/rpc/status" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/keepalive" @@ -55,6 +57,9 @@ var ( // ErrHeaderListSizeLimitViolation indicates that the header list size is larger // than the limit set by peer. ErrHeaderListSizeLimitViolation = errors.New("transport: trying to send header list size larger than the limit set by peer") + // statusRawProto is a function to get to the raw status proto wrapped in a + // status.Status without a proto.Clone(). + statusRawProto = internal.StatusRawProto.(func(*status.Status) *spb.Status) ) // http2Server implements the ServerTransport interface with HTTP2. @@ -119,6 +124,7 @@ type http2Server struct { // Fields below are for channelz metric collection. channelzID int64 // channelz unique identification number czData *channelzData + bufferPool *bufferPool } // newHTTP2Server constructs a ServerTransport based on HTTP2. ConnectionError is @@ -220,6 +226,7 @@ func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err kep: kep, initialWindowSize: iwz, czData: new(channelzData), + bufferPool: newBufferPool(), } t.controlBuf = newControlBuffer(t.ctxDone) if dynamicWindow { @@ -405,9 +412,10 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( s.wq = newWriteQuota(defaultWriteQuota, s.ctxDone) s.trReader = &transportReader{ reader: &recvBufferReader{ - ctx: s.ctx, - ctxDone: s.ctxDone, - recv: s.buf, + ctx: s.ctx, + ctxDone: s.ctxDone, + recv: s.buf, + freeBuffer: t.bufferPool.put, }, windowHandler: func(n int) { t.updateWindow(s, uint32(n)) @@ -428,6 +436,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.Context, string) context.Context) { defer close(t.readerDone) for { + t.controlBuf.throttle() frame, err := t.framer.fr.ReadFrame() atomic.StoreUint32(&t.activity, 1) if err != nil { @@ -591,9 +600,10 @@ func (t *http2Server) handleData(f *http2.DataFrame) { // guarantee f.Data() is consumed before the arrival of next frame. // Can this copy be eliminated? if len(f.Data()) > 0 { - data := make([]byte, len(f.Data())) - copy(data, f.Data()) - s.write(recvMsg{data: data}) + buffer := t.bufferPool.get() + buffer.Reset() + buffer.Write(f.Data()) + s.write(recvMsg{buffer: buffer}) } } if f.Header().Flags.Has(http2.FlagDataEndStream) { @@ -757,6 +767,10 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { return nil } +func (t *http2Server) setResetPingStrikes() { + atomic.StoreUint32(&t.resetPingStrikes, 1) +} + func (t *http2Server) writeHeaderLocked(s *Stream) error { // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields // first and create a slice of that exact size. @@ -771,9 +785,7 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error { streamID: s.id, hf: headerFields, endStream: false, - onWrite: func() { - atomic.StoreUint32(&t.resetPingStrikes, 1) - }, + onWrite: t.setResetPingStrikes, }) if !success { if err != nil { @@ -817,7 +829,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status", Value: strconv.Itoa(int(st.Code()))}) headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-message", Value: encodeGrpcMessage(st.Message())}) - if p := st.Proto(); p != nil && len(p.Details) > 0 { + if p := statusRawProto(st); p != nil && len(p.Details) > 0 { stBytes, err := proto.Marshal(p) if err != nil { // TODO: return error instead, when callers are able to handle it. @@ -833,9 +845,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { streamID: s.id, hf: headerFields, endStream: true, - onWrite: func() { - atomic.StoreUint32(&t.resetPingStrikes, 1) - }, + onWrite: t.setResetPingStrikes, } s.hdrMu.Unlock() success, err := t.controlBuf.execute(t.checkForHeaderListSize, trailingHeader) @@ -887,12 +897,10 @@ func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) e hdr = append(hdr, data[:emptyLen]...) data = data[emptyLen:] df := &dataFrame{ - streamID: s.id, - h: hdr, - d: data, - onEachWrite: func() { - atomic.StoreUint32(&t.resetPingStrikes, 1) - }, + streamID: s.id, + h: hdr, + d: data, + onEachWrite: t.setResetPingStrikes, } if err := s.wq.get(int32(len(hdr) + len(data))); err != nil { select { @@ -958,6 +966,7 @@ func (t *http2Server) keepalive() { select { case <-maxAge.C: // Close the connection after grace period. + infof("transport: closing server transport due to maximum connection age.") t.Close() // Resetting the timer so that the clean-up doesn't deadlock. maxAge.Reset(infinity) @@ -971,6 +980,7 @@ func (t *http2Server) keepalive() { continue } if pingSent { + infof("transport: closing server transport due to idleness.") t.Close() // Resetting the timer so that the clean-up doesn't deadlock. keepalive.Reset(infinity) @@ -1019,13 +1029,7 @@ func (t *http2Server) Close() error { } // deleteStream deletes the stream s from transport's active streams. -func (t *http2Server) deleteStream(s *Stream, eosReceived bool) (oldState streamState) { - oldState = s.swapState(streamDone) - if oldState == streamDone { - // If the stream was already done, return. - return oldState - } - +func (t *http2Server) deleteStream(s *Stream, eosReceived bool) { // In case stream sending and receiving are invoked in separate // goroutines (e.g., bi-directional streaming), cancel needs to be // called to interrupt the potential blocking on other goroutines. @@ -1047,15 +1051,13 @@ func (t *http2Server) deleteStream(s *Stream, eosReceived bool) (oldState stream atomic.AddInt64(&t.czData.streamsFailed, 1) } } - - return oldState } // finishStream closes the stream and puts the trailing headerFrame into controlbuf. func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, hdr *headerFrame, eosReceived bool) { - oldState := t.deleteStream(s, eosReceived) - // If the stream is already closed, then don't put trailing header to controlbuf. + oldState := s.swapState(streamDone) if oldState == streamDone { + // If the stream was already done, return. return } @@ -1063,14 +1065,18 @@ func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, h streamID: s.id, rst: rst, rstCode: rstCode, - onWrite: func() {}, + onWrite: func() { + t.deleteStream(s, eosReceived) + }, } t.controlBuf.put(hdr) } // closeStream clears the footprint of a stream when the stream is not needed any more. func (t *http2Server) closeStream(s *Stream, rst bool, rstCode http2.ErrCode, eosReceived bool) { + s.swapState(streamDone) t.deleteStream(s, eosReceived) + t.controlBuf.put(&cleanupStream{ streamID: s.id, rst: rst, diff --git a/vendor/google.golang.org/grpc/internal/transport/transport.go b/vendor/google.golang.org/grpc/internal/transport/transport.go index 4bf583ef..1c1d1067 100644 --- a/vendor/google.golang.org/grpc/internal/transport/transport.go +++ b/vendor/google.golang.org/grpc/internal/transport/transport.go @@ -22,6 +22,7 @@ package transport import ( + "bytes" "context" "errors" "fmt" @@ -39,10 +40,32 @@ import ( "google.golang.org/grpc/tap" ) +type bufferPool struct { + pool sync.Pool +} + +func newBufferPool() *bufferPool { + return &bufferPool{ + pool: sync.Pool{ + New: func() interface{} { + return new(bytes.Buffer) + }, + }, + } +} + +func (p *bufferPool) get() *bytes.Buffer { + return p.pool.Get().(*bytes.Buffer) +} + +func (p *bufferPool) put(b *bytes.Buffer) { + p.pool.Put(b) +} + // recvMsg represents the received msg from the transport. All transport // protocol specific info has been removed. type recvMsg struct { - data []byte + buffer *bytes.Buffer // nil: received some data // io.EOF: stream is completed. data is nil. // other non-nil error: transport failure. data is nil. @@ -117,8 +140,9 @@ type recvBufferReader struct { ctx context.Context ctxDone <-chan struct{} // cache of ctx.Done() (for performance). recv *recvBuffer - last []byte // Stores the remaining data in the previous calls. + last *bytes.Buffer // Stores the remaining data in the previous calls. err error + freeBuffer func(*bytes.Buffer) } // Read reads the next len(p) bytes from last. If last is drained, it tries to @@ -128,10 +152,13 @@ func (r *recvBufferReader) Read(p []byte) (n int, err error) { if r.err != nil { return 0, r.err } - if r.last != nil && len(r.last) > 0 { + if r.last != nil { // Read remaining data left in last call. - copied := copy(p, r.last) - r.last = r.last[copied:] + copied, _ := r.last.Read(p) + if r.last.Len() == 0 { + r.freeBuffer(r.last) + r.last = nil + } return copied, nil } if r.closeStream != nil { @@ -157,6 +184,19 @@ func (r *recvBufferReader) readClient(p []byte) (n int, err error) { // r.readAdditional acts on that message and returns the necessary error. select { case <-r.ctxDone: + // Note that this adds the ctx error to the end of recv buffer, and + // reads from the head. This will delay the error until recv buffer is + // empty, thus will delay ctx cancellation in Recv(). + // + // It's done this way to fix a race between ctx cancel and trailer. The + // race was, stream.Recv() may return ctx error if ctxDone wins the + // race, but stream.Trailer() may return a non-nil md because the stream + // was not marked as done when trailer is received. This closeStream + // call will mark stream as done, thus fix the race. + // + // TODO: delaying ctx error seems like a unnecessary side effect. What + // we really want is to mark the stream as done, and return ctx error + // faster. r.closeStream(ContextErr(r.ctx.Err())) m := <-r.recv.get() return r.readAdditional(m, p) @@ -170,8 +210,13 @@ func (r *recvBufferReader) readAdditional(m recvMsg, p []byte) (n int, err error if m.err != nil { return 0, m.err } - copied := copy(p, m.data) - r.last = m.data[copied:] + copied, _ := m.buffer.Read(p) + if m.buffer.Len() == 0 { + r.freeBuffer(m.buffer) + r.last = nil + } else { + r.last = m.buffer + } return copied, nil } @@ -266,6 +311,14 @@ func (s *Stream) waitOnHeader() error { } select { case <-s.ctx.Done(): + // We prefer success over failure when reading messages because we delay + // context error in stream.Read(). To keep behavior consistent, we also + // prefer success here. + select { + case <-s.headerChan: + return nil + default: + } return ContextErr(s.ctx.Err()) case <-s.headerChan: return nil diff --git a/vendor/google.golang.org/grpc/naming/naming.go b/vendor/google.golang.org/grpc/naming/naming.go index c99fdbef..f4c1c8b6 100644 --- a/vendor/google.golang.org/grpc/naming/naming.go +++ b/vendor/google.golang.org/grpc/naming/naming.go @@ -17,9 +17,8 @@ */ // Package naming defines the naming API and related data structures for gRPC. -// The interface is EXPERIMENTAL and may be subject to change. // -// Deprecated: please use package resolver. +// This package is deprecated: please use package resolver instead. package naming // Operation defines the corresponding operations for a name resolution change. diff --git a/vendor/google.golang.org/grpc/pickfirst.go b/vendor/google.golang.org/grpc/pickfirst.go index d1e38aad..ed05b02e 100644 --- a/vendor/google.golang.org/grpc/pickfirst.go +++ b/vendor/google.golang.org/grpc/pickfirst.go @@ -51,14 +51,18 @@ type pickfirstBalancer struct { func (b *pickfirstBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) { if err != nil { - grpclog.Infof("pickfirstBalancer: HandleResolvedAddrs called with error %v", err) + if grpclog.V(2) { + grpclog.Infof("pickfirstBalancer: HandleResolvedAddrs called with error %v", err) + } return } if b.sc == nil { b.sc, err = b.cc.NewSubConn(addrs, balancer.NewSubConnOptions{}) if err != nil { //TODO(yuxuanli): why not change the cc state to Idle? - grpclog.Errorf("pickfirstBalancer: failed to NewSubConn: %v", err) + if grpclog.V(2) { + grpclog.Errorf("pickfirstBalancer: failed to NewSubConn: %v", err) + } return } b.cc.UpdateBalancerState(connectivity.Idle, &picker{sc: b.sc}) @@ -70,9 +74,13 @@ func (b *pickfirstBalancer) HandleResolvedAddrs(addrs []resolver.Address, err er } func (b *pickfirstBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) { - grpclog.Infof("pickfirstBalancer: HandleSubConnStateChange: %p, %v", sc, s) + if grpclog.V(2) { + grpclog.Infof("pickfirstBalancer: HandleSubConnStateChange: %p, %v", sc, s) + } if b.sc != sc { - grpclog.Infof("pickfirstBalancer: ignored state change because sc is not recognized") + if grpclog.V(2) { + grpclog.Infof("pickfirstBalancer: ignored state change because sc is not recognized") + } return } if s == connectivity.Shutdown { diff --git a/vendor/google.golang.org/grpc/resolver/resolver.go b/vendor/google.golang.org/grpc/resolver/resolver.go index f6f6934d..e83da346 100644 --- a/vendor/google.golang.org/grpc/resolver/resolver.go +++ b/vendor/google.golang.org/grpc/resolver/resolver.go @@ -20,6 +20,10 @@ // All APIs in this package are experimental. package resolver +import ( + "google.golang.org/grpc/serviceconfig" +) + var ( // m is a map from scheme to resolver builder. m = make(map[string]Builder) @@ -100,11 +104,12 @@ type BuildOption struct { // State contains the current Resolver state relevant to the ClientConn. type State struct { - Addresses []Address // Resolved addresses for the target - ServiceConfig string // JSON representation of the service config + Addresses []Address // Resolved addresses for the target + // ServiceConfig is the parsed service config; obtained from + // serviceconfig.Parse. + ServiceConfig serviceconfig.Config // TODO: add Err error - // TODO: add ParsedServiceConfig interface{} } // ClientConn contains the callbacks for resolver to notify any updates diff --git a/vendor/google.golang.org/grpc/resolver_conn_wrapper.go b/vendor/google.golang.org/grpc/resolver_conn_wrapper.go index e9cef3a9..6934905b 100644 --- a/vendor/google.golang.org/grpc/resolver_conn_wrapper.go +++ b/vendor/google.golang.org/grpc/resolver_conn_wrapper.go @@ -138,19 +138,22 @@ func (ccr *ccResolverWrapper) NewServiceConfig(sc string) { return } grpclog.Infof("ccResolverWrapper: got new service config: %v", sc) - if channelz.IsOn() { - ccr.addChannelzTraceEvent(resolver.State{Addresses: ccr.curState.Addresses, ServiceConfig: sc}) + c, err := parseServiceConfig(sc) + if err != nil { + return } - ccr.curState.ServiceConfig = sc + if channelz.IsOn() { + ccr.addChannelzTraceEvent(resolver.State{Addresses: ccr.curState.Addresses, ServiceConfig: c}) + } + ccr.curState.ServiceConfig = c ccr.cc.updateResolverState(ccr.curState) } func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) { - if s.ServiceConfig == ccr.curState.ServiceConfig && (len(ccr.curState.Addresses) == 0) == (len(s.Addresses) == 0) { - return - } var updates []string - if s.ServiceConfig != ccr.curState.ServiceConfig { + oldSC, oldOK := ccr.curState.ServiceConfig.(*ServiceConfig) + newSC, newOK := s.ServiceConfig.(*ServiceConfig) + if oldOK != newOK || (oldOK && newOK && oldSC.rawJSONString != newSC.rawJSONString) { updates = append(updates, "service config updated") } if len(ccr.curState.Addresses) > 0 && len(s.Addresses) == 0 { diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go index 495a4f9b..f064b73e 100644 --- a/vendor/google.golang.org/grpc/server.go +++ b/vendor/google.golang.org/grpc/server.go @@ -42,6 +42,7 @@ import ( "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal/binarylog" "google.golang.org/grpc/internal/channelz" + "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/transport" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" @@ -56,6 +57,8 @@ const ( defaultServerMaxSendMessageSize = math.MaxInt32 ) +var statusOK = status.New(codes.OK, "") + type methodHandler func(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor UnaryServerInterceptor) (interface{}, error) // MethodDesc represents an RPC service's method specification. @@ -90,17 +93,15 @@ type Server struct { mu sync.Mutex // guards following lis map[net.Listener]bool - conns map[io.Closer]bool + conns map[transport.ServerTransport]bool serve bool drain bool cv *sync.Cond // signaled when connections close for GracefulStop m map[string]*service // service name -> service info events trace.EventLog - quit chan struct{} - done chan struct{} - quitOnce sync.Once - doneOnce sync.Once + quit *grpcsync.Event + done *grpcsync.Event channelzRemoveOnce sync.Once serveWG sync.WaitGroup // counts active Serve goroutines for GracefulStop @@ -386,10 +387,10 @@ func NewServer(opt ...ServerOption) *Server { s := &Server{ lis: make(map[net.Listener]bool), opts: opts, - conns: make(map[io.Closer]bool), + conns: make(map[transport.ServerTransport]bool), m: make(map[string]*service), - quit: make(chan struct{}), - done: make(chan struct{}), + quit: grpcsync.NewEvent(), + done: grpcsync.NewEvent(), czData: new(channelzData), } s.cv = sync.NewCond(&s.mu) @@ -556,11 +557,9 @@ func (s *Server) Serve(lis net.Listener) error { s.serveWG.Add(1) defer func() { s.serveWG.Done() - select { - // Stop or GracefulStop called; block until done and return nil. - case <-s.quit: - <-s.done - default: + if s.quit.HasFired() { + // Stop or GracefulStop called; block until done and return nil. + <-s.done.Done() } }() @@ -603,7 +602,7 @@ func (s *Server) Serve(lis net.Listener) error { timer := time.NewTimer(tempDelay) select { case <-timer.C: - case <-s.quit: + case <-s.quit.Done(): timer.Stop() return nil } @@ -613,10 +612,8 @@ func (s *Server) Serve(lis net.Listener) error { s.printf("done serving; Accept = %v", err) s.mu.Unlock() - select { - case <-s.quit: + if s.quit.HasFired() { return nil - default: } return err } @@ -637,6 +634,10 @@ func (s *Server) Serve(lis net.Listener) error { // handleRawConn forks a goroutine to handle a just-accepted connection that // has not had any I/O performed on it yet. func (s *Server) handleRawConn(rawConn net.Conn) { + if s.quit.HasFired() { + rawConn.Close() + return + } rawConn.SetDeadline(time.Now().Add(s.opts.connectionTimeout)) conn, authInfo, err := s.useTransportAuthenticator(rawConn) if err != nil { @@ -653,14 +654,6 @@ func (s *Server) handleRawConn(rawConn net.Conn) { return } - s.mu.Lock() - if s.conns == nil { - s.mu.Unlock() - conn.Close() - return - } - s.mu.Unlock() - // Finish handshaking (HTTP2) st := s.newHTTP2Transport(conn, authInfo) if st == nil { @@ -768,6 +761,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // traceInfo returns a traceInfo and associates it with stream, if tracing is enabled. // If tracing is not enabled, it returns nil. func (s *Server) traceInfo(st transport.ServerTransport, stream *transport.Stream) (trInfo *traceInfo) { + if !EnableTracing { + return nil + } tr, ok := trace.FromContext(stream.Context()) if !ok { return nil @@ -786,27 +782,27 @@ func (s *Server) traceInfo(st transport.ServerTransport, stream *transport.Strea return trInfo } -func (s *Server) addConn(c io.Closer) bool { +func (s *Server) addConn(st transport.ServerTransport) bool { s.mu.Lock() defer s.mu.Unlock() if s.conns == nil { - c.Close() + st.Close() return false } if s.drain { // Transport added after we drained our existing conns: drain it // immediately. - c.(transport.ServerTransport).Drain() + st.Drain() } - s.conns[c] = true + s.conns[st] = true return true } -func (s *Server) removeConn(c io.Closer) { +func (s *Server) removeConn(st transport.ServerTransport) { s.mu.Lock() defer s.mu.Unlock() if s.conns != nil { - delete(s.conns, c) + delete(s.conns, st) s.cv.Broadcast() } } @@ -978,10 +974,11 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. } if sh != nil { sh.HandleRPC(stream.Context(), &stats.InPayload{ - RecvTime: time.Now(), - Payload: v, - Data: d, - Length: len(d), + RecvTime: time.Now(), + Payload: v, + WireLength: payInfo.wireLength, + Data: d, + Length: len(d), }) } if binlog != nil { @@ -1077,7 +1074,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. // TODO: Should we be logging if writing status failed here, like above? // Should the logging be in WriteStatus? Should we ignore the WriteStatus // error or allow the stats handler to see it? - err = t.WriteStatus(stream, status.New(codes.OK, "")) + err = t.WriteStatus(stream, statusOK) if binlog != nil { binlog.Log(&binarylog.ServerTrailer{ Trailer: stream.Trailer(), @@ -1235,7 +1232,7 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp ss.trInfo.tr.LazyLog(stringer("OK"), false) ss.mu.Unlock() } - err = t.WriteStatus(ss.s, status.New(codes.OK, "")) + err = t.WriteStatus(ss.s, statusOK) if ss.binlog != nil { ss.binlog.Log(&binarylog.ServerTrailer{ Trailer: ss.s.Trailer(), @@ -1352,15 +1349,11 @@ func ServerTransportStreamFromContext(ctx context.Context) ServerTransportStream // pending RPCs on the client side will get notified by connection // errors. func (s *Server) Stop() { - s.quitOnce.Do(func() { - close(s.quit) - }) + s.quit.Fire() defer func() { s.serveWG.Wait() - s.doneOnce.Do(func() { - close(s.done) - }) + s.done.Fire() }() s.channelzRemoveOnce.Do(func() { @@ -1397,15 +1390,8 @@ func (s *Server) Stop() { // accepting new connections and RPCs and blocks until all the pending RPCs are // finished. func (s *Server) GracefulStop() { - s.quitOnce.Do(func() { - close(s.quit) - }) - - defer func() { - s.doneOnce.Do(func() { - close(s.done) - }) - }() + s.quit.Fire() + defer s.done.Fire() s.channelzRemoveOnce.Do(func() { if channelz.IsOn() { @@ -1423,8 +1409,8 @@ func (s *Server) GracefulStop() { } s.lis = nil if !s.drain { - for c := range s.conns { - c.(transport.ServerTransport).Drain() + for st := range s.conns { + st.Drain() } s.drain = true } diff --git a/vendor/google.golang.org/grpc/service_config.go b/vendor/google.golang.org/grpc/service_config.go index 1c522742..d0787f1e 100644 --- a/vendor/google.golang.org/grpc/service_config.go +++ b/vendor/google.golang.org/grpc/service_config.go @@ -25,8 +25,11 @@ import ( "strings" "time" + "google.golang.org/grpc/balancer" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal" + "google.golang.org/grpc/serviceconfig" ) const maxInt = int(^uint(0) >> 1) @@ -61,6 +64,11 @@ type MethodConfig struct { retryPolicy *retryPolicy } +type lbConfig struct { + name string + cfg serviceconfig.LoadBalancingConfig +} + // ServiceConfig is provided by the service provider and contains parameters for how // clients that connect to the service should behave. // @@ -68,10 +76,18 @@ type MethodConfig struct { // through name resolver, as specified here // https://github.com/grpc/grpc/blob/master/doc/service_config.md type ServiceConfig struct { - // LB is the load balancer the service providers recommends. The balancer specified - // via grpc.WithBalancer will override this. + serviceconfig.Config + + // LB is the load balancer the service providers recommends. The balancer + // specified via grpc.WithBalancer will override this. This is deprecated; + // lbConfigs is preferred. If lbConfig and LB are both present, lbConfig + // will be used. LB *string + // lbConfig is the service config's load balancing configuration. If + // lbConfig and LB are both present, lbConfig will be used. + lbConfig *lbConfig + // Methods contains a map for the methods in this service. If there is an // exact match for a method (i.e. /service/method) in the map, use the // corresponding MethodConfig. If there's no exact match, look for the @@ -233,15 +249,27 @@ type jsonMC struct { RetryPolicy *jsonRetryPolicy } +type loadBalancingConfig map[string]json.RawMessage + // TODO(lyuxuan): delete this struct after cleaning up old service config implementation. type jsonSC struct { LoadBalancingPolicy *string + LoadBalancingConfig *[]loadBalancingConfig MethodConfig *[]jsonMC RetryThrottling *retryThrottlingPolicy HealthCheckConfig *healthCheckConfig } +func init() { + internal.ParseServiceConfig = func(sc string) (interface{}, error) { + return parseServiceConfig(sc) + } +} + func parseServiceConfig(js string) (*ServiceConfig, error) { + if len(js) == 0 { + return nil, fmt.Errorf("no JSON service config provided") + } var rsc jsonSC err := json.Unmarshal([]byte(js), &rsc) if err != nil { @@ -255,10 +283,38 @@ func parseServiceConfig(js string) (*ServiceConfig, error) { healthCheckConfig: rsc.HealthCheckConfig, rawJSONString: js, } + if rsc.LoadBalancingConfig != nil { + for i, lbcfg := range *rsc.LoadBalancingConfig { + if len(lbcfg) != 1 { + err := fmt.Errorf("invalid loadBalancingConfig: entry %v does not contain exactly 1 policy/config pair: %q", i, lbcfg) + grpclog.Warningf(err.Error()) + return nil, err + } + var name string + var jsonCfg json.RawMessage + for name, jsonCfg = range lbcfg { + } + builder := balancer.Get(name) + if builder == nil { + continue + } + sc.lbConfig = &lbConfig{name: name} + if parser, ok := builder.(balancer.ConfigParser); ok { + var err error + sc.lbConfig.cfg, err = parser.ParseConfig(jsonCfg) + if err != nil { + return nil, fmt.Errorf("error parsing loadBalancingConfig for policy %q: %v", name, err) + } + } else if string(jsonCfg) != "{}" { + grpclog.Warningf("non-empty balancer configuration %q, but balancer does not implement ParseConfig", string(jsonCfg)) + } + break + } + } + if rsc.MethodConfig == nil { return &sc, nil } - for _, m := range *rsc.MethodConfig { if m.Name == nil { continue @@ -299,11 +355,11 @@ func parseServiceConfig(js string) (*ServiceConfig, error) { } if sc.retryThrottling != nil { - if sc.retryThrottling.MaxTokens <= 0 || - sc.retryThrottling.MaxTokens > 1000 || - sc.retryThrottling.TokenRatio <= 0 { - // Illegal throttling config; disable throttling. - sc.retryThrottling = nil + if mt := sc.retryThrottling.MaxTokens; mt <= 0 || mt > 1000 { + return nil, fmt.Errorf("invalid retry throttling config: maxTokens (%v) out of range (0, 1000]", mt) + } + if tr := sc.retryThrottling.TokenRatio; tr <= 0 { + return nil, fmt.Errorf("invalid retry throttling config: tokenRatio (%v) may not be negative", tr) } } return &sc, nil diff --git a/vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go b/vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go new file mode 100644 index 00000000..53b27875 --- /dev/null +++ b/vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go @@ -0,0 +1,48 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package serviceconfig defines types and methods for operating on gRPC +// service configs. +// +// This package is EXPERIMENTAL. +package serviceconfig + +import ( + "google.golang.org/grpc/internal" +) + +// Config represents an opaque data structure holding a service config. +type Config interface { + isConfig() +} + +// LoadBalancingConfig represents an opaque data structure holding a load +// balancer config. +type LoadBalancingConfig interface { + isLoadBalancingConfig() +} + +// Parse parses the JSON service config provided into an internal form or +// returns an error if the config is invalid. +func Parse(ServiceConfigJSON string) (Config, error) { + c, err := internal.ParseServiceConfig(ServiceConfigJSON) + if err != nil { + return nil, err + } + return c.(Config), err +} diff --git a/vendor/google.golang.org/grpc/status/status.go b/vendor/google.golang.org/grpc/status/status.go index ed36681b..a1348e9b 100644 --- a/vendor/google.golang.org/grpc/status/status.go +++ b/vendor/google.golang.org/grpc/status/status.go @@ -36,8 +36,15 @@ import ( "github.com/golang/protobuf/ptypes" spb "google.golang.org/genproto/googleapis/rpc/status" "google.golang.org/grpc/codes" + "google.golang.org/grpc/internal" ) +func init() { + internal.StatusRawProto = statusRawProto +} + +func statusRawProto(s *Status) *spb.Status { return s.s } + // statusError is an alias of a status proto. It implements error and Status, // and a nil statusError should never be returned by this package. type statusError spb.Status @@ -51,6 +58,17 @@ func (se *statusError) GRPCStatus() *Status { return &Status{s: (*spb.Status)(se)} } +// Is implements future error.Is functionality. +// A statusError is equivalent if the code and message are identical. +func (se *statusError) Is(target error) bool { + tse, ok := target.(*statusError) + if !ok { + return false + } + + return proto.Equal((*spb.Status)(se), (*spb.Status)(tse)) +} + // Status represents an RPC status code, message, and details. It is immutable // and should be created with New, Newf, or FromProto. type Status struct { @@ -125,7 +143,7 @@ func FromProto(s *spb.Status) *Status { // Status is returned with codes.Unknown and the original error message. func FromError(err error) (s *Status, ok bool) { if err == nil { - return &Status{s: &spb.Status{Code: int32(codes.OK)}}, true + return nil, true } if se, ok := err.(interface { GRPCStatus() *Status @@ -199,7 +217,7 @@ func Code(err error) codes.Code { func FromContextError(err error) *Status { switch err { case nil: - return New(codes.OK, "") + return nil case context.DeadlineExceeded: return New(codes.DeadlineExceeded, err.Error()) case context.Canceled: diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go index e10e6231..134a624a 100644 --- a/vendor/google.golang.org/grpc/stream.go +++ b/vendor/google.golang.org/grpc/stream.go @@ -30,7 +30,6 @@ import ( "golang.org/x/net/trace" "google.golang.org/grpc/balancer" "google.golang.org/grpc/codes" - "google.golang.org/grpc/connectivity" "google.golang.org/grpc/encoding" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal/balancerload" @@ -328,13 +327,23 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth return cs, nil } -func (cs *clientStream) newAttemptLocked(sh stats.Handler, trInfo *traceInfo) error { - cs.attempt = &csAttempt{ +// newAttemptLocked creates a new attempt with a transport. +// If it succeeds, then it replaces clientStream's attempt with this new attempt. +func (cs *clientStream) newAttemptLocked(sh stats.Handler, trInfo *traceInfo) (retErr error) { + newAttempt := &csAttempt{ cs: cs, dc: cs.cc.dopts.dc, statsHandler: sh, trInfo: trInfo, } + defer func() { + if retErr != nil { + // This attempt is not set in the clientStream, so it's finish won't + // be called. Call it here for stats and trace in case they are not + // nil. + newAttempt.finish(retErr) + } + }() if err := cs.ctx.Err(); err != nil { return toRPCErr(err) @@ -346,8 +355,9 @@ func (cs *clientStream) newAttemptLocked(sh stats.Handler, trInfo *traceInfo) er if trInfo != nil { trInfo.firstLine.SetRemoteAddr(t.RemoteAddr()) } - cs.attempt.t = t - cs.attempt.done = done + newAttempt.t = t + newAttempt.done = done + cs.attempt = newAttempt return nil } @@ -396,11 +406,18 @@ type clientStream struct { serverHeaderBinlogged bool mu sync.Mutex - firstAttempt bool // if true, transparent retry is valid - numRetries int // exclusive of transparent retry attempt(s) - numRetriesSincePushback int // retries since pushback; to reset backoff - finished bool // TODO: replace with atomic cmpxchg or sync.Once? - attempt *csAttempt // the active client stream attempt + firstAttempt bool // if true, transparent retry is valid + numRetries int // exclusive of transparent retry attempt(s) + numRetriesSincePushback int // retries since pushback; to reset backoff + finished bool // TODO: replace with atomic cmpxchg or sync.Once? + // attempt is the active client stream attempt. + // The only place where it is written is the newAttemptLocked method and this method never writes nil. + // So, attempt can be nil only inside newClientStream function when clientStream is first created. + // One of the first things done after clientStream's creation, is to call newAttemptLocked which either + // assigns a non nil value to the attempt or returns an error. If an error is returned from newAttemptLocked, + // then newClientStream calls finish on the clientStream and returns. So, finish method is the only + // place where we need to check if the attempt is nil. + attempt *csAttempt // TODO(hedging): hedging will have multiple attempts simultaneously. committed bool // active attempt committed for retry? buffer []func(a *csAttempt) error // operations to replay on retry @@ -458,8 +475,8 @@ func (cs *clientStream) shouldRetry(err error) error { if cs.attempt.s != nil { <-cs.attempt.s.Done() } - if cs.firstAttempt && !cs.callInfo.failFast && (cs.attempt.s == nil || cs.attempt.s.Unprocessed()) { - // First attempt, wait-for-ready, stream unprocessed: transparently retry. + if cs.firstAttempt && (cs.attempt.s == nil || cs.attempt.s.Unprocessed()) { + // First attempt, stream unprocessed: transparently retry. cs.firstAttempt = false return nil } @@ -806,11 +823,11 @@ func (cs *clientStream) finish(err error) { } if cs.attempt != nil { cs.attempt.finish(err) - } - // after functions all rely upon having a stream. - if cs.attempt.s != nil { - for _, o := range cs.opts { - o.after(cs.callInfo) + // after functions all rely upon having a stream. + if cs.attempt.s != nil { + for _, o := range cs.opts { + o.after(cs.callInfo) + } } } cs.cancel() @@ -965,19 +982,18 @@ func (a *csAttempt) finish(err error) { a.mu.Unlock() } -func (ac *addrConn) newClientStream(ctx context.Context, desc *StreamDesc, method string, t transport.ClientTransport, opts ...CallOption) (_ ClientStream, err error) { - ac.mu.Lock() - if ac.transport != t { - ac.mu.Unlock() - return nil, status.Error(codes.Canceled, "the provided transport is no longer valid to use") - } - // transition to CONNECTING state when an attempt starts - if ac.state != connectivity.Connecting { - ac.updateConnectivityState(connectivity.Connecting) - ac.cc.handleSubConnStateChange(ac.acbw, ac.state) - } - ac.mu.Unlock() - +// newClientStream creates a ClientStream with the specified transport, on the +// given addrConn. +// +// It's expected that the given transport is either the same one in addrConn, or +// is already closed. To avoid race, transport is specified separately, instead +// of using ac.transpot. +// +// Main difference between this and ClientConn.NewStream: +// - no retry +// - no service config (or wait for service config) +// - no tracing or stats +func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method string, t transport.ClientTransport, ac *addrConn, opts ...CallOption) (_ ClientStream, err error) { if t == nil { // TODO: return RPC error here? return nil, errors.New("transport provided is nil") @@ -985,14 +1001,6 @@ func (ac *addrConn) newClientStream(ctx context.Context, desc *StreamDesc, metho // defaultCallInfo contains unnecessary info(i.e. failfast, maxRetryRPCBufferSize), so we just initialize an empty struct. c := &callInfo{} - for _, o := range opts { - if err := o.before(c); err != nil { - return nil, toRPCErr(err) - } - } - c.maxReceiveMessageSize = getMaxSize(nil, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) - c.maxSendMessageSize = getMaxSize(nil, c.maxSendMessageSize, defaultServerMaxSendMessageSize) - // Possible context leak: // The cancel function for the child context we create will only be called // when RecvMsg returns a non-nil error, if the ClientConn is closed, or if @@ -1005,6 +1013,13 @@ func (ac *addrConn) newClientStream(ctx context.Context, desc *StreamDesc, metho } }() + for _, o := range opts { + if err := o.before(c); err != nil { + return nil, toRPCErr(err) + } + } + c.maxReceiveMessageSize = getMaxSize(nil, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) + c.maxSendMessageSize = getMaxSize(nil, c.maxSendMessageSize, defaultServerMaxSendMessageSize) if err := setCallInfoCodec(c); err != nil { return nil, err } @@ -1037,6 +1052,7 @@ func (ac *addrConn) newClientStream(ctx context.Context, desc *StreamDesc, metho callHdr.Creds = c.creds } + // Use a special addrConnStream to avoid retry. as := &addrConnStream{ callHdr: callHdr, ac: ac, diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go index 5c8cb709..5411a73a 100644 --- a/vendor/google.golang.org/grpc/version.go +++ b/vendor/google.golang.org/grpc/version.go @@ -19,4 +19,4 @@ package grpc // Version is the current grpc version. -const Version = "1.21.1" +const Version = "1.23.0" diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh index 11037b94..661e1e1d 100644 --- a/vendor/google.golang.org/grpc/vet.sh +++ b/vendor/google.golang.org/grpc/vet.sh @@ -105,12 +105,14 @@ if go help mod >& /dev/null; then fi # - Collection of static analysis checks -# TODO(menghanl): fix errors in transport_test. +# TODO(dfawley): don't use deprecated functions in examples. staticcheck -go 1.9 -checks 'inherit,-ST1015' -ignore ' google.golang.org/grpc/balancer.go:SA1019 +google.golang.org/grpc/balancer/grpclb/grpclb_remote_balancer.go:SA1019 google.golang.org/grpc/balancer/roundrobin/roundrobin_test.go:SA1019 -google.golang.org/grpc/balancer/xds/edsbalancer/balancergroup.go:SA1019 -google.golang.org/grpc/balancer/xds/xds.go:SA1019 +google.golang.org/grpc/xds/internal/balancer/edsbalancer/balancergroup.go:SA1019 +google.golang.org/grpc/xds/internal/balancer/xds.go:SA1019 +google.golang.org/grpc/xds/internal/balancer/xds_client.go:SA1019 google.golang.org/grpc/balancer_conn_wrappers.go:SA1019 google.golang.org/grpc/balancer_test.go:SA1019 google.golang.org/grpc/benchmark/benchmain/main.go:SA1019 @@ -118,10 +120,13 @@ google.golang.org/grpc/benchmark/worker/benchmark_client.go:SA1019 google.golang.org/grpc/clientconn.go:S1024 google.golang.org/grpc/clientconn_state_transition_test.go:SA1019 google.golang.org/grpc/clientconn_test.go:SA1019 +google.golang.org/grpc/examples/features/debugging/client/main.go:SA1019 +google.golang.org/grpc/examples/features/load_balancing/client/main.go:SA1019 google.golang.org/grpc/internal/transport/handler_server.go:SA1019 google.golang.org/grpc/internal/transport/handler_server_test.go:SA1019 google.golang.org/grpc/resolver/dns/dns_resolver.go:SA1019 google.golang.org/grpc/stats/stats_test.go:SA1019 +google.golang.org/grpc/test/balancer_test.go:SA1019 google.golang.org/grpc/test/channelz_test.go:SA1019 google.golang.org/grpc/test/end2end_test.go:SA1019 google.golang.org/grpc/test/healthcheck_test.go:SA1019 diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/OWNERS b/vendor/k8s.io/client-go/plugin/pkg/client/auth/OWNERS new file mode 100644 index 00000000..3e05d309 --- /dev/null +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/OWNERS @@ -0,0 +1,9 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: +- sig-auth-authenticators-approvers +reviewers: +- sig-auth-authenticators-reviewers +labels: +- sig/auth + diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/README.md b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/README.md new file mode 100644 index 00000000..21a39ae8 --- /dev/null +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/README.md @@ -0,0 +1,50 @@ +# Azure Active Directory plugin for client authentication + +This plugin provides an integration with Azure Active Directory device flow. If no tokens are present in the kubectl configuration, it will prompt a device code which can be used to login in a browser. After login it will automatically fetch the tokens and store them in the kubectl configuration. In addition it will refresh and update the tokens in the configuration when expired. + +## Usage + +1. Create an Azure Active Directory *Web App / API* application for `apiserver` following these [instructions](https://docs.microsoft.com/en-us/azure/active-directory/active-directory-app-registration). The callback URL does not matter (just cannot be empty). + +2. Create a second Azure Active Directory native application for `kubectl`. The callback URL does not matter (just cannot be empty). + +3. On `kubectl` application's configuration page in Azure portal grant permissions to `apiserver` application by clicking on *Required Permissions*, click the *Add* button and search for the apiserver application created in step 1. Select "Access apiserver" under the *DELEGATED PERMISSIONS*. Once added click the *Grant Permissions* button to apply the changes. + +4. Configure the `apiserver` to use the Azure Active Directory as an OIDC provider with following options + + ``` + --oidc-client-id="spn:APISERVER_APPLICATION_ID" \ + --oidc-issuer-url="https://sts.windows.net/TENANT_ID/" + --oidc-username-claim="sub" + ``` + + * Replace the `APISERVER_APPLICATION_ID` with the application ID of `apiserver` application + * Replace `TENANT_ID` with your tenant ID. +   * For a list of alternative username claims that are supported by the OIDC issuer check the JSON response at `https://sts.windows.net/TENANT_ID/.well-known/openid-configuration`. + +5. Configure `kubectl` to use the `azure` authentication provider + + ``` + kubectl config set-credentials "USER_NAME" --auth-provider=azure \ + --auth-provider-arg=environment=AzurePublicCloud \ + --auth-provider-arg=client-id=APPLICATION_ID \ + --auth-provider-arg=tenant-id=TENANT_ID \ + --auth-provider-arg=apiserver-id=APISERVER_APPLICATION_ID + ``` + + * Supported environments: `AzurePublicCloud`, `AzureUSGovernmentCloud`, `AzureChinaCloud`, `AzureGermanCloud` + * Replace `USER_NAME` and `TENANT_ID` with your user name and tenant ID + * Replace `APPLICATION_ID` with the application ID of your`kubectl` application ID + * Replace `APISERVER_APPLICATION_ID` with the application ID of your `apiserver` application ID + * Be sure to also (create and) select a context that uses above user + + 6. The access token is acquired when first `kubectl` command is executed + + ``` + kubectl get pods + + To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code DEC7D48GA to authenticate. + ``` + + * After signing in a web browser, the token is stored in the configuration, and it will be reused when executing further commands. + * The resulting username in Kubernetes depends on your [configuration of the `--oidc-username-claim` and `--oidc-username-prefix` flags on the API server](https://kubernetes.io/docs/admin/authentication/#configuring-the-api-server). If you are using any authorization method you need to give permissions to that user, e.g. by binding the user to a role in the case of RBAC. diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go new file mode 100644 index 00000000..e583100c --- /dev/null +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go @@ -0,0 +1,374 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package azure + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "os" + "sync" + + "github.com/Azure/go-autorest/autorest" + "github.com/Azure/go-autorest/autorest/adal" + "github.com/Azure/go-autorest/autorest/azure" + "k8s.io/klog" + + "k8s.io/apimachinery/pkg/util/net" + restclient "k8s.io/client-go/rest" +) + +const ( + azureTokenKey = "azureTokenKey" + tokenType = "Bearer" + authHeader = "Authorization" + + cfgClientID = "client-id" + cfgTenantID = "tenant-id" + cfgAccessToken = "access-token" + cfgRefreshToken = "refresh-token" + cfgExpiresIn = "expires-in" + cfgExpiresOn = "expires-on" + cfgEnvironment = "environment" + cfgApiserverID = "apiserver-id" +) + +func init() { + if err := restclient.RegisterAuthProviderPlugin("azure", newAzureAuthProvider); err != nil { + klog.Fatalf("Failed to register azure auth plugin: %v", err) + } +} + +var cache = newAzureTokenCache() + +type azureTokenCache struct { + lock sync.Mutex + cache map[string]*azureToken +} + +func newAzureTokenCache() *azureTokenCache { + return &azureTokenCache{cache: make(map[string]*azureToken)} +} + +func (c *azureTokenCache) getToken(tokenKey string) *azureToken { + c.lock.Lock() + defer c.lock.Unlock() + return c.cache[tokenKey] +} + +func (c *azureTokenCache) setToken(tokenKey string, token *azureToken) { + c.lock.Lock() + defer c.lock.Unlock() + c.cache[tokenKey] = token +} + +func newAzureAuthProvider(_ string, cfg map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { + var ts tokenSource + + environment, err := azure.EnvironmentFromName(cfg[cfgEnvironment]) + if err != nil { + environment = azure.PublicCloud + } + ts, err = newAzureTokenSourceDeviceCode(environment, cfg[cfgClientID], cfg[cfgTenantID], cfg[cfgApiserverID]) + if err != nil { + return nil, fmt.Errorf("creating a new azure token source for device code authentication: %v", err) + } + cacheSource := newAzureTokenSource(ts, cache, cfg, persister) + + return &azureAuthProvider{ + tokenSource: cacheSource, + }, nil +} + +type azureAuthProvider struct { + tokenSource tokenSource +} + +func (p *azureAuthProvider) Login() error { + return errors.New("not yet implemented") +} + +func (p *azureAuthProvider) WrapTransport(rt http.RoundTripper) http.RoundTripper { + return &azureRoundTripper{ + tokenSource: p.tokenSource, + roundTripper: rt, + } +} + +type azureRoundTripper struct { + tokenSource tokenSource + roundTripper http.RoundTripper +} + +var _ net.RoundTripperWrapper = &azureRoundTripper{} + +func (r *azureRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if len(req.Header.Get(authHeader)) != 0 { + return r.roundTripper.RoundTrip(req) + } + + token, err := r.tokenSource.Token() + if err != nil { + klog.Errorf("Failed to acquire a token: %v", err) + return nil, fmt.Errorf("acquiring a token for authorization header: %v", err) + } + + // clone the request in order to avoid modifying the headers of the original request + req2 := new(http.Request) + *req2 = *req + req2.Header = make(http.Header, len(req.Header)) + for k, s := range req.Header { + req2.Header[k] = append([]string(nil), s...) + } + + req2.Header.Set(authHeader, fmt.Sprintf("%s %s", tokenType, token.token.AccessToken)) + + return r.roundTripper.RoundTrip(req2) +} + +func (r *azureRoundTripper) WrappedRoundTripper() http.RoundTripper { return r.roundTripper } + +type azureToken struct { + token adal.Token + environment string + clientID string + tenantID string + apiserverID string +} + +type tokenSource interface { + Token() (*azureToken, error) +} + +type azureTokenSource struct { + source tokenSource + cache *azureTokenCache + lock sync.Mutex + cfg map[string]string + persister restclient.AuthProviderConfigPersister +} + +func newAzureTokenSource(source tokenSource, cache *azureTokenCache, cfg map[string]string, persister restclient.AuthProviderConfigPersister) tokenSource { + return &azureTokenSource{ + source: source, + cache: cache, + cfg: cfg, + persister: persister, + } +} + +// Token fetches a token from the cache of configuration if present otherwise +// acquires a new token from the configured source. Automatically refreshes +// the token if expired. +func (ts *azureTokenSource) Token() (*azureToken, error) { + ts.lock.Lock() + defer ts.lock.Unlock() + + var err error + token := ts.cache.getToken(azureTokenKey) + if token == nil { + token, err = ts.retrieveTokenFromCfg() + if err != nil { + token, err = ts.source.Token() + if err != nil { + return nil, fmt.Errorf("acquiring a new fresh token: %v", err) + } + } + if !token.token.IsExpired() { + ts.cache.setToken(azureTokenKey, token) + err = ts.storeTokenInCfg(token) + if err != nil { + return nil, fmt.Errorf("storing the token in configuration: %v", err) + } + } + } + if token.token.IsExpired() { + token, err = ts.refreshToken(token) + if err != nil { + return nil, fmt.Errorf("refreshing the expired token: %v", err) + } + ts.cache.setToken(azureTokenKey, token) + err = ts.storeTokenInCfg(token) + if err != nil { + return nil, fmt.Errorf("storing the refreshed token in configuration: %v", err) + } + } + return token, nil +} + +func (ts *azureTokenSource) retrieveTokenFromCfg() (*azureToken, error) { + accessToken := ts.cfg[cfgAccessToken] + if accessToken == "" { + return nil, fmt.Errorf("no access token in cfg: %s", cfgAccessToken) + } + refreshToken := ts.cfg[cfgRefreshToken] + if refreshToken == "" { + return nil, fmt.Errorf("no refresh token in cfg: %s", cfgRefreshToken) + } + environment := ts.cfg[cfgEnvironment] + if environment == "" { + return nil, fmt.Errorf("no environment in cfg: %s", cfgEnvironment) + } + clientID := ts.cfg[cfgClientID] + if clientID == "" { + return nil, fmt.Errorf("no client ID in cfg: %s", cfgClientID) + } + tenantID := ts.cfg[cfgTenantID] + if tenantID == "" { + return nil, fmt.Errorf("no tenant ID in cfg: %s", cfgTenantID) + } + apiserverID := ts.cfg[cfgApiserverID] + if apiserverID == "" { + return nil, fmt.Errorf("no apiserver ID in cfg: %s", apiserverID) + } + expiresIn := ts.cfg[cfgExpiresIn] + if expiresIn == "" { + return nil, fmt.Errorf("no expiresIn in cfg: %s", cfgExpiresIn) + } + expiresOn := ts.cfg[cfgExpiresOn] + if expiresOn == "" { + return nil, fmt.Errorf("no expiresOn in cfg: %s", cfgExpiresOn) + } + + return &azureToken{ + token: adal.Token{ + AccessToken: accessToken, + RefreshToken: refreshToken, + ExpiresIn: json.Number(expiresIn), + ExpiresOn: json.Number(expiresOn), + NotBefore: json.Number(expiresOn), + Resource: fmt.Sprintf("spn:%s", apiserverID), + Type: tokenType, + }, + environment: environment, + clientID: clientID, + tenantID: tenantID, + apiserverID: apiserverID, + }, nil +} + +func (ts *azureTokenSource) storeTokenInCfg(token *azureToken) error { + newCfg := make(map[string]string) + newCfg[cfgAccessToken] = token.token.AccessToken + newCfg[cfgRefreshToken] = token.token.RefreshToken + newCfg[cfgEnvironment] = token.environment + newCfg[cfgClientID] = token.clientID + newCfg[cfgTenantID] = token.tenantID + newCfg[cfgApiserverID] = token.apiserverID + newCfg[cfgExpiresIn] = string(token.token.ExpiresIn) + newCfg[cfgExpiresOn] = string(token.token.ExpiresOn) + + err := ts.persister.Persist(newCfg) + if err != nil { + return fmt.Errorf("persisting the configuration: %v", err) + } + ts.cfg = newCfg + return nil +} + +func (ts *azureTokenSource) refreshToken(token *azureToken) (*azureToken, error) { + env, err := azure.EnvironmentFromName(token.environment) + if err != nil { + return nil, err + } + + oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, token.tenantID) + if err != nil { + return nil, fmt.Errorf("building the OAuth configuration for token refresh: %v", err) + } + + callback := func(t adal.Token) error { + return nil + } + spt, err := adal.NewServicePrincipalTokenFromManualToken( + *oauthConfig, + token.clientID, + token.apiserverID, + token.token, + callback) + if err != nil { + return nil, fmt.Errorf("creating new service principal for token refresh: %v", err) + } + + if err := spt.Refresh(); err != nil { + return nil, fmt.Errorf("refreshing token: %v", err) + } + + return &azureToken{ + token: spt.Token(), + environment: token.environment, + clientID: token.clientID, + tenantID: token.tenantID, + apiserverID: token.apiserverID, + }, nil +} + +type azureTokenSourceDeviceCode struct { + environment azure.Environment + clientID string + tenantID string + apiserverID string +} + +func newAzureTokenSourceDeviceCode(environment azure.Environment, clientID string, tenantID string, apiserverID string) (tokenSource, error) { + if clientID == "" { + return nil, errors.New("client-id is empty") + } + if tenantID == "" { + return nil, errors.New("tenant-id is empty") + } + if apiserverID == "" { + return nil, errors.New("apiserver-id is empty") + } + return &azureTokenSourceDeviceCode{ + environment: environment, + clientID: clientID, + tenantID: tenantID, + apiserverID: apiserverID, + }, nil +} + +func (ts *azureTokenSourceDeviceCode) Token() (*azureToken, error) { + oauthConfig, err := adal.NewOAuthConfig(ts.environment.ActiveDirectoryEndpoint, ts.tenantID) + if err != nil { + return nil, fmt.Errorf("building the OAuth configuration for device code authentication: %v", err) + } + client := &autorest.Client{} + deviceCode, err := adal.InitiateDeviceAuth(client, *oauthConfig, ts.clientID, ts.apiserverID) + if err != nil { + return nil, fmt.Errorf("initialing the device code authentication: %v", err) + } + + _, err = fmt.Fprintln(os.Stderr, *deviceCode.Message) + if err != nil { + return nil, fmt.Errorf("prompting the device code message: %v", err) + } + + token, err := adal.WaitForUserCompletion(client, deviceCode) + if err != nil { + return nil, fmt.Errorf("waiting for device code authentication to complete: %v", err) + } + + return &azureToken{ + token: *token, + environment: ts.environment.Name, + clientID: ts.clientID, + tenantID: ts.tenantID, + apiserverID: ts.apiserverID, + }, nil +} diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/OWNERS b/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/OWNERS new file mode 100644 index 00000000..97fcd3dd --- /dev/null +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/OWNERS @@ -0,0 +1,8 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: +- cjcullen +- jlowdermilk +reviewers: +- cjcullen +- jlowdermilk diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go new file mode 100644 index 00000000..e44c2ada --- /dev/null +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go @@ -0,0 +1,383 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package gcp + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" + "os/exec" + "strings" + "sync" + "time" + + "golang.org/x/oauth2" + "golang.org/x/oauth2/google" + "k8s.io/apimachinery/pkg/util/net" + "k8s.io/apimachinery/pkg/util/yaml" + restclient "k8s.io/client-go/rest" + "k8s.io/client-go/util/jsonpath" + "k8s.io/klog" +) + +func init() { + if err := restclient.RegisterAuthProviderPlugin("gcp", newGCPAuthProvider); err != nil { + klog.Fatalf("Failed to register gcp auth plugin: %v", err) + } +} + +var ( + // Stubbable for testing + execCommand = exec.Command + + // defaultScopes: + // - cloud-platform is the base scope to authenticate to GCP. + // - userinfo.email is used to authenticate to GKE APIs with gserviceaccount + // email instead of numeric uniqueID. + defaultScopes = []string{ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/userinfo.email"} +) + +// gcpAuthProvider is an auth provider plugin that uses GCP credentials to provide +// tokens for kubectl to authenticate itself to the apiserver. A sample json config +// is provided below with all recognized options described. +// +// { +// 'auth-provider': { +// # Required +// "name": "gcp", +// +// 'config': { +// # Authentication options +// # These options are used while getting a token. +// +// # comma-separated list of GCP API scopes. default value of this field +// # is "https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email". +// # to override the API scopes, specify this field explicitly. +// "scopes": "https://www.googleapis.com/auth/cloud-platform" +// +// # Caching options +// +// # Raw string data representing cached access token. +// "access-token": "ya29.CjWdA4GiBPTt", +// # RFC3339Nano expiration timestamp for cached access token. +// "expiry": "2016-10-31 22:31:9.123", +// +// # Command execution options +// # These options direct the plugin to execute a specified command and parse +// # token and expiry time from the output of the command. +// +// # Command to execute for access token. Command output will be parsed as JSON. +// # If "cmd-args" is not present, this value will be split on whitespace, with +// # the first element interpreted as the command, remaining elements as args. +// "cmd-path": "/usr/bin/gcloud", +// +// # Arguments to pass to command to execute for access token. +// "cmd-args": "config config-helper --output=json" +// +// # JSONPath to the string field that represents the access token in +// # command output. If omitted, defaults to "{.access_token}". +// "token-key": "{.credential.access_token}", +// +// # JSONPath to the string field that represents expiration timestamp +// # of the access token in the command output. If omitted, defaults to +// # "{.token_expiry}" +// "expiry-key": ""{.credential.token_expiry}", +// +// # golang reference time in the format that the expiration timestamp uses. +// # If omitted, defaults to time.RFC3339Nano +// "time-fmt": "2006-01-02 15:04:05.999999999" +// } +// } +// } +// +type gcpAuthProvider struct { + tokenSource oauth2.TokenSource + persister restclient.AuthProviderConfigPersister +} + +func newGCPAuthProvider(_ string, gcpConfig map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { + ts, err := tokenSource(isCmdTokenSource(gcpConfig), gcpConfig) + if err != nil { + return nil, err + } + cts, err := newCachedTokenSource(gcpConfig["access-token"], gcpConfig["expiry"], persister, ts, gcpConfig) + if err != nil { + return nil, err + } + return &gcpAuthProvider{cts, persister}, nil +} + +func isCmdTokenSource(gcpConfig map[string]string) bool { + _, ok := gcpConfig["cmd-path"] + return ok +} + +func tokenSource(isCmd bool, gcpConfig map[string]string) (oauth2.TokenSource, error) { + // Command-based token source + if isCmd { + cmd := gcpConfig["cmd-path"] + if len(cmd) == 0 { + return nil, fmt.Errorf("missing access token cmd") + } + if gcpConfig["scopes"] != "" { + return nil, fmt.Errorf("scopes can only be used when kubectl is using a gcp service account key") + } + var args []string + if cmdArgs, ok := gcpConfig["cmd-args"]; ok { + args = strings.Fields(cmdArgs) + } else { + fields := strings.Fields(cmd) + cmd = fields[0] + args = fields[1:] + } + return newCmdTokenSource(cmd, args, gcpConfig["token-key"], gcpConfig["expiry-key"], gcpConfig["time-fmt"]), nil + } + + // Google Application Credentials-based token source + scopes := parseScopes(gcpConfig) + ts, err := google.DefaultTokenSource(context.Background(), scopes...) + if err != nil { + return nil, fmt.Errorf("cannot construct google default token source: %v", err) + } + return ts, nil +} + +// parseScopes constructs a list of scopes that should be included in token source +// from the config map. +func parseScopes(gcpConfig map[string]string) []string { + scopes, ok := gcpConfig["scopes"] + if !ok { + return defaultScopes + } + if scopes == "" { + return []string{} + } + return strings.Split(gcpConfig["scopes"], ",") +} + +func (g *gcpAuthProvider) WrapTransport(rt http.RoundTripper) http.RoundTripper { + var resetCache map[string]string + if cts, ok := g.tokenSource.(*cachedTokenSource); ok { + resetCache = cts.baseCache() + } else { + resetCache = make(map[string]string) + } + return &conditionalTransport{&oauth2.Transport{Source: g.tokenSource, Base: rt}, g.persister, resetCache} +} + +func (g *gcpAuthProvider) Login() error { return nil } + +type cachedTokenSource struct { + lk sync.Mutex + source oauth2.TokenSource + accessToken string + expiry time.Time + persister restclient.AuthProviderConfigPersister + cache map[string]string +} + +func newCachedTokenSource(accessToken, expiry string, persister restclient.AuthProviderConfigPersister, ts oauth2.TokenSource, cache map[string]string) (*cachedTokenSource, error) { + var expiryTime time.Time + if parsedTime, err := time.Parse(time.RFC3339Nano, expiry); err == nil { + expiryTime = parsedTime + } + if cache == nil { + cache = make(map[string]string) + } + return &cachedTokenSource{ + source: ts, + accessToken: accessToken, + expiry: expiryTime, + persister: persister, + cache: cache, + }, nil +} + +func (t *cachedTokenSource) Token() (*oauth2.Token, error) { + tok := t.cachedToken() + if tok.Valid() && !tok.Expiry.IsZero() { + return tok, nil + } + tok, err := t.source.Token() + if err != nil { + return nil, err + } + cache := t.update(tok) + if t.persister != nil { + if err := t.persister.Persist(cache); err != nil { + klog.V(4).Infof("Failed to persist token: %v", err) + } + } + return tok, nil +} + +func (t *cachedTokenSource) cachedToken() *oauth2.Token { + t.lk.Lock() + defer t.lk.Unlock() + return &oauth2.Token{ + AccessToken: t.accessToken, + TokenType: "Bearer", + Expiry: t.expiry, + } +} + +func (t *cachedTokenSource) update(tok *oauth2.Token) map[string]string { + t.lk.Lock() + defer t.lk.Unlock() + t.accessToken = tok.AccessToken + t.expiry = tok.Expiry + ret := map[string]string{} + for k, v := range t.cache { + ret[k] = v + } + ret["access-token"] = t.accessToken + ret["expiry"] = t.expiry.Format(time.RFC3339Nano) + return ret +} + +// baseCache is the base configuration value for this TokenSource, without any cached ephemeral tokens. +func (t *cachedTokenSource) baseCache() map[string]string { + t.lk.Lock() + defer t.lk.Unlock() + ret := map[string]string{} + for k, v := range t.cache { + ret[k] = v + } + delete(ret, "access-token") + delete(ret, "expiry") + return ret +} + +type commandTokenSource struct { + cmd string + args []string + tokenKey string + expiryKey string + timeFmt string +} + +func newCmdTokenSource(cmd string, args []string, tokenKey, expiryKey, timeFmt string) *commandTokenSource { + if len(timeFmt) == 0 { + timeFmt = time.RFC3339Nano + } + if len(tokenKey) == 0 { + tokenKey = "{.access_token}" + } + if len(expiryKey) == 0 { + expiryKey = "{.token_expiry}" + } + return &commandTokenSource{ + cmd: cmd, + args: args, + tokenKey: tokenKey, + expiryKey: expiryKey, + timeFmt: timeFmt, + } +} + +func (c *commandTokenSource) Token() (*oauth2.Token, error) { + fullCmd := strings.Join(append([]string{c.cmd}, c.args...), " ") + cmd := execCommand(c.cmd, c.args...) + var stderr bytes.Buffer + cmd.Stderr = &stderr + output, err := cmd.Output() + if err != nil { + return nil, fmt.Errorf("error executing access token command %q: err=%v output=%s stderr=%s", fullCmd, err, output, string(stderr.Bytes())) + } + token, err := c.parseTokenCmdOutput(output) + if err != nil { + return nil, fmt.Errorf("error parsing output for access token command %q: %v", fullCmd, err) + } + return token, nil +} + +func (c *commandTokenSource) parseTokenCmdOutput(output []byte) (*oauth2.Token, error) { + output, err := yaml.ToJSON(output) + if err != nil { + return nil, err + } + var data interface{} + if err := json.Unmarshal(output, &data); err != nil { + return nil, err + } + + accessToken, err := parseJSONPath(data, "token-key", c.tokenKey) + if err != nil { + return nil, fmt.Errorf("error parsing token-key %q from %q: %v", c.tokenKey, string(output), err) + } + expiryStr, err := parseJSONPath(data, "expiry-key", c.expiryKey) + if err != nil { + return nil, fmt.Errorf("error parsing expiry-key %q from %q: %v", c.expiryKey, string(output), err) + } + var expiry time.Time + if t, err := time.Parse(c.timeFmt, expiryStr); err != nil { + klog.V(4).Infof("Failed to parse token expiry from %s (fmt=%s): %v", expiryStr, c.timeFmt, err) + } else { + expiry = t + } + + return &oauth2.Token{ + AccessToken: accessToken, + TokenType: "Bearer", + Expiry: expiry, + }, nil +} + +func parseJSONPath(input interface{}, name, template string) (string, error) { + j := jsonpath.New(name) + buf := new(bytes.Buffer) + if err := j.Parse(template); err != nil { + return "", err + } + if err := j.Execute(buf, input); err != nil { + return "", err + } + return buf.String(), nil +} + +type conditionalTransport struct { + oauthTransport *oauth2.Transport + persister restclient.AuthProviderConfigPersister + resetCache map[string]string +} + +var _ net.RoundTripperWrapper = &conditionalTransport{} + +func (t *conditionalTransport) RoundTrip(req *http.Request) (*http.Response, error) { + if len(req.Header.Get("Authorization")) != 0 { + return t.oauthTransport.Base.RoundTrip(req) + } + + res, err := t.oauthTransport.RoundTrip(req) + + if err != nil { + return nil, err + } + + if res.StatusCode == 401 { + klog.V(4).Infof("The credentials that were supplied are invalid for the target cluster") + t.persister.Persist(t.resetCache) + } + + return res, nil +} + +func (t *conditionalTransport) WrappedRoundTripper() http.RoundTripper { return t.oauthTransport.Base } diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/OWNERS b/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/OWNERS new file mode 100644 index 00000000..03fb44ea --- /dev/null +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/OWNERS @@ -0,0 +1,7 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: +- ericchiang +reviewers: +- ericchiang +- rithujohn191 diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/oidc.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/oidc.go new file mode 100644 index 00000000..1383a97c --- /dev/null +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/oidc.go @@ -0,0 +1,379 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package oidc + +import ( + "context" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/http" + "strings" + "sync" + "time" + + "golang.org/x/oauth2" + "k8s.io/apimachinery/pkg/util/net" + restclient "k8s.io/client-go/rest" + "k8s.io/klog" +) + +const ( + cfgIssuerUrl = "idp-issuer-url" + cfgClientID = "client-id" + cfgClientSecret = "client-secret" + cfgCertificateAuthority = "idp-certificate-authority" + cfgCertificateAuthorityData = "idp-certificate-authority-data" + cfgIDToken = "id-token" + cfgRefreshToken = "refresh-token" + + // Unused. Scopes aren't sent during refreshing. + cfgExtraScopes = "extra-scopes" +) + +func init() { + if err := restclient.RegisterAuthProviderPlugin("oidc", newOIDCAuthProvider); err != nil { + klog.Fatalf("Failed to register oidc auth plugin: %v", err) + } +} + +// expiryDelta determines how earlier a token should be considered +// expired than its actual expiration time. It is used to avoid late +// expirations due to client-server time mismatches. +// +// NOTE(ericchiang): this is take from golang.org/x/oauth2 +const expiryDelta = 10 * time.Second + +var cache = newClientCache() + +// Like TLS transports, keep a cache of OIDC clients indexed by issuer URL. This ensures +// current requests from different clients don't concurrently attempt to refresh the same +// set of credentials. +type clientCache struct { + mu sync.RWMutex + + cache map[cacheKey]*oidcAuthProvider +} + +func newClientCache() *clientCache { + return &clientCache{cache: make(map[cacheKey]*oidcAuthProvider)} +} + +type cacheKey struct { + // Canonical issuer URL string of the provider. + issuerURL string + clientID string +} + +func (c *clientCache) getClient(issuer, clientID string) (*oidcAuthProvider, bool) { + c.mu.RLock() + defer c.mu.RUnlock() + client, ok := c.cache[cacheKey{issuer, clientID}] + return client, ok +} + +// setClient attempts to put the client in the cache but may return any clients +// with the same keys set before. This is so there's only ever one client for a provider. +func (c *clientCache) setClient(issuer, clientID string, client *oidcAuthProvider) *oidcAuthProvider { + c.mu.Lock() + defer c.mu.Unlock() + key := cacheKey{issuer, clientID} + + // If another client has already initialized a client for the given provider we want + // to use that client instead of the one we're trying to set. This is so all transports + // share a client and can coordinate around the same mutex when refreshing and writing + // to the kubeconfig. + if oldClient, ok := c.cache[key]; ok { + return oldClient + } + + c.cache[key] = client + return client +} + +func newOIDCAuthProvider(_ string, cfg map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { + issuer := cfg[cfgIssuerUrl] + if issuer == "" { + return nil, fmt.Errorf("Must provide %s", cfgIssuerUrl) + } + + clientID := cfg[cfgClientID] + if clientID == "" { + return nil, fmt.Errorf("Must provide %s", cfgClientID) + } + + // Check cache for existing provider. + if provider, ok := cache.getClient(issuer, clientID); ok { + return provider, nil + } + + if len(cfg[cfgExtraScopes]) > 0 { + klog.V(2).Infof("%s auth provider field depricated, refresh request don't send scopes", + cfgExtraScopes) + } + + var certAuthData []byte + var err error + if cfg[cfgCertificateAuthorityData] != "" { + certAuthData, err = base64.StdEncoding.DecodeString(cfg[cfgCertificateAuthorityData]) + if err != nil { + return nil, err + } + } + + clientConfig := restclient.Config{ + TLSClientConfig: restclient.TLSClientConfig{ + CAFile: cfg[cfgCertificateAuthority], + CAData: certAuthData, + }, + } + + trans, err := restclient.TransportFor(&clientConfig) + if err != nil { + return nil, err + } + hc := &http.Client{Transport: trans} + + provider := &oidcAuthProvider{ + client: hc, + now: time.Now, + cfg: cfg, + persister: persister, + } + + return cache.setClient(issuer, clientID, provider), nil +} + +type oidcAuthProvider struct { + client *http.Client + + // Method for determining the current time. + now func() time.Time + + // Mutex guards persisting to the kubeconfig file and allows synchronized + // updates to the in-memory config. It also ensures concurrent calls to + // the RoundTripper only trigger a single refresh request. + mu sync.Mutex + cfg map[string]string + persister restclient.AuthProviderConfigPersister +} + +func (p *oidcAuthProvider) WrapTransport(rt http.RoundTripper) http.RoundTripper { + return &roundTripper{ + wrapped: rt, + provider: p, + } +} + +func (p *oidcAuthProvider) Login() error { + return errors.New("not yet implemented") +} + +type roundTripper struct { + provider *oidcAuthProvider + wrapped http.RoundTripper +} + +var _ net.RoundTripperWrapper = &roundTripper{} + +func (r *roundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if len(req.Header.Get("Authorization")) != 0 { + return r.wrapped.RoundTrip(req) + } + token, err := r.provider.idToken() + if err != nil { + return nil, err + } + + // shallow copy of the struct + r2 := new(http.Request) + *r2 = *req + // deep copy of the Header so we don't modify the original + // request's Header (as per RoundTripper contract). + r2.Header = make(http.Header) + for k, s := range req.Header { + r2.Header[k] = s + } + r2.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) + + return r.wrapped.RoundTrip(r2) +} + +func (t *roundTripper) WrappedRoundTripper() http.RoundTripper { return t.wrapped } + +func (p *oidcAuthProvider) idToken() (string, error) { + p.mu.Lock() + defer p.mu.Unlock() + + if idToken, ok := p.cfg[cfgIDToken]; ok && len(idToken) > 0 { + valid, err := idTokenExpired(p.now, idToken) + if err != nil { + return "", err + } + if valid { + // If the cached id token is still valid use it. + return idToken, nil + } + } + + // Try to request a new token using the refresh token. + rt, ok := p.cfg[cfgRefreshToken] + if !ok || len(rt) == 0 { + return "", errors.New("No valid id-token, and cannot refresh without refresh-token") + } + + // Determine provider's OAuth2 token endpoint. + tokenURL, err := tokenEndpoint(p.client, p.cfg[cfgIssuerUrl]) + if err != nil { + return "", err + } + + config := oauth2.Config{ + ClientID: p.cfg[cfgClientID], + ClientSecret: p.cfg[cfgClientSecret], + Endpoint: oauth2.Endpoint{TokenURL: tokenURL}, + } + + ctx := context.WithValue(context.Background(), oauth2.HTTPClient, p.client) + token, err := config.TokenSource(ctx, &oauth2.Token{RefreshToken: rt}).Token() + if err != nil { + return "", fmt.Errorf("failed to refresh token: %v", err) + } + + idToken, ok := token.Extra("id_token").(string) + if !ok { + // id_token isn't a required part of a refresh token response, so some + // providers (Okta) don't return this value. + // + // See https://github.com/kubernetes/kubernetes/issues/36847 + return "", fmt.Errorf("token response did not contain an id_token, either the scope \"openid\" wasn't requested upon login, or the provider doesn't support id_tokens as part of the refresh response.") + } + + // Create a new config to persist. + newCfg := make(map[string]string) + for key, val := range p.cfg { + newCfg[key] = val + } + + // Update the refresh token if the server returned another one. + if token.RefreshToken != "" && token.RefreshToken != rt { + newCfg[cfgRefreshToken] = token.RefreshToken + } + newCfg[cfgIDToken] = idToken + + // Persist new config and if successful, update the in memory config. + if err = p.persister.Persist(newCfg); err != nil { + return "", fmt.Errorf("could not persist new tokens: %v", err) + } + p.cfg = newCfg + + return idToken, nil +} + +// tokenEndpoint uses OpenID Connect discovery to determine the OAuth2 token +// endpoint for the provider, the endpoint the client will use the refresh +// token against. +func tokenEndpoint(client *http.Client, issuer string) (string, error) { + // Well known URL for getting OpenID Connect metadata. + // + // https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig + wellKnown := strings.TrimSuffix(issuer, "/") + "/.well-known/openid-configuration" + resp, err := client.Get(wellKnown) + if err != nil { + return "", err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + if resp.StatusCode != http.StatusOK { + // Don't produce an error that's too huge (e.g. if we get HTML back for some reason). + const n = 80 + if len(body) > n { + body = append(body[:n], []byte("...")...) + } + return "", fmt.Errorf("oidc: failed to query metadata endpoint %s: %q", resp.Status, body) + } + + // Metadata object. We only care about the token_endpoint, the thing endpoint + // we'll be refreshing against. + // + // https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata + var metadata struct { + TokenURL string `json:"token_endpoint"` + } + if err := json.Unmarshal(body, &metadata); err != nil { + return "", fmt.Errorf("oidc: failed to decode provider discovery object: %v", err) + } + if metadata.TokenURL == "" { + return "", fmt.Errorf("oidc: discovery object doesn't contain a token_endpoint") + } + return metadata.TokenURL, nil +} + +func idTokenExpired(now func() time.Time, idToken string) (bool, error) { + parts := strings.Split(idToken, ".") + if len(parts) != 3 { + return false, fmt.Errorf("ID Token is not a valid JWT") + } + + payload, err := base64.RawURLEncoding.DecodeString(parts[1]) + if err != nil { + return false, err + } + var claims struct { + Expiry jsonTime `json:"exp"` + } + if err := json.Unmarshal(payload, &claims); err != nil { + return false, fmt.Errorf("parsing claims: %v", err) + } + + return now().Add(expiryDelta).Before(time.Time(claims.Expiry)), nil +} + +// jsonTime is a json.Unmarshaler that parses a unix timestamp. +// Because JSON numbers don't differentiate between ints and floats, +// we want to ensure we can parse either. +type jsonTime time.Time + +func (j *jsonTime) UnmarshalJSON(b []byte) error { + var n json.Number + if err := json.Unmarshal(b, &n); err != nil { + return err + } + var unix int64 + + if t, err := n.Int64(); err == nil { + unix = t + } else { + f, err := n.Float64() + if err != nil { + return err + } + unix = int64(f) + } + *j = jsonTime(time.Unix(unix, 0)) + return nil +} + +func (j jsonTime) MarshalJSON() ([]byte, error) { + return json.Marshal(time.Time(j).Unix()) +} diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go new file mode 100644 index 00000000..fab5104e --- /dev/null +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go @@ -0,0 +1,193 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package openstack + +import ( + "fmt" + "net/http" + "sync" + "time" + + "github.com/gophercloud/gophercloud" + "github.com/gophercloud/gophercloud/openstack" + "k8s.io/klog" + + "k8s.io/apimachinery/pkg/util/net" + restclient "k8s.io/client-go/rest" +) + +func init() { + if err := restclient.RegisterAuthProviderPlugin("openstack", newOpenstackAuthProvider); err != nil { + klog.Fatalf("Failed to register openstack auth plugin: %s", err) + } +} + +// DefaultTTLDuration is the time before a token gets expired. +const DefaultTTLDuration = 10 * time.Minute + +// openstackAuthProvider is an authprovider for openstack. this provider reads +// the environment variables to determine the client identity, and generates a +// token which will be inserted into the request header later. +type openstackAuthProvider struct { + ttl time.Duration + tokenGetter TokenGetter +} + +// TokenGetter returns a bearer token that can be inserted into request. +type TokenGetter interface { + Token() (string, error) +} + +type tokenGetter struct { + authOpt *gophercloud.AuthOptions +} + +// Token creates a token by authenticate with keystone. +func (t *tokenGetter) Token() (string, error) { + var options gophercloud.AuthOptions + var err error + if t.authOpt == nil { + // reads the config from the environment + klog.V(4).Info("reading openstack config from the environment variables") + options, err = openstack.AuthOptionsFromEnv() + if err != nil { + return "", fmt.Errorf("failed to read openstack env vars: %s", err) + } + } else { + options = *t.authOpt + } + client, err := openstack.AuthenticatedClient(options) + if err != nil { + return "", fmt.Errorf("authentication failed: %s", err) + } + return client.TokenID, nil +} + +// cachedGetter caches a token until it gets expired, after the expiration, it will +// generate another token and cache it. +type cachedGetter struct { + mutex sync.Mutex + tokenGetter TokenGetter + + token string + born time.Time + ttl time.Duration +} + +// Token returns the current available token, create a new one if expired. +func (c *cachedGetter) Token() (string, error) { + c.mutex.Lock() + defer c.mutex.Unlock() + + var err error + // no token or exceeds the TTL + if c.token == "" || time.Since(c.born) > c.ttl { + c.token, err = c.tokenGetter.Token() + if err != nil { + return "", fmt.Errorf("failed to get token: %s", err) + } + c.born = time.Now() + } + return c.token, nil +} + +// tokenRoundTripper implements the RoundTripper interface: adding the bearer token +// into the request header. +type tokenRoundTripper struct { + http.RoundTripper + + tokenGetter TokenGetter +} + +var _ net.RoundTripperWrapper = &tokenRoundTripper{} + +// RoundTrip adds the bearer token into the request. +func (t *tokenRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + // if the authorization header already present, use it. + if req.Header.Get("Authorization") != "" { + return t.RoundTripper.RoundTrip(req) + } + + token, err := t.tokenGetter.Token() + if err == nil { + req.Header.Set("Authorization", "Bearer "+token) + } else { + klog.V(4).Infof("failed to get token: %s", err) + } + + return t.RoundTripper.RoundTrip(req) +} + +func (t *tokenRoundTripper) WrappedRoundTripper() http.RoundTripper { return t.RoundTripper } + +// newOpenstackAuthProvider creates an auth provider which works with openstack +// environment. +func newOpenstackAuthProvider(_ string, config map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { + var ttlDuration time.Duration + var err error + + klog.Warningf("WARNING: in-tree openstack auth plugin is now deprecated. please use the \"client-keystone-auth\" kubectl/client-go credential plugin instead") + ttl, found := config["ttl"] + if !found { + ttlDuration = DefaultTTLDuration + // persist to config + config["ttl"] = ttlDuration.String() + if err = persister.Persist(config); err != nil { + return nil, fmt.Errorf("failed to persist config: %s", err) + } + } else { + ttlDuration, err = time.ParseDuration(ttl) + if err != nil { + return nil, fmt.Errorf("failed to parse ttl config: %s", err) + } + } + + authOpt := gophercloud.AuthOptions{ + IdentityEndpoint: config["identityEndpoint"], + Username: config["username"], + Password: config["password"], + DomainName: config["name"], + TenantID: config["tenantId"], + TenantName: config["tenantName"], + } + + getter := tokenGetter{} + // not empty + if (authOpt != gophercloud.AuthOptions{}) { + if len(authOpt.IdentityEndpoint) == 0 { + return nil, fmt.Errorf("empty %q in the config for openstack auth provider", "identityEndpoint") + } + getter.authOpt = &authOpt + } + + return &openstackAuthProvider{ + ttl: ttlDuration, + tokenGetter: &getter, + }, nil +} + +func (oap *openstackAuthProvider) WrapTransport(rt http.RoundTripper) http.RoundTripper { + return &tokenRoundTripper{ + RoundTripper: rt, + tokenGetter: &cachedGetter{ + tokenGetter: oap.tokenGetter, + ttl: oap.ttl, + }, + } +} + +func (oap *openstackAuthProvider) Login() error { return nil } diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/plugins.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/plugins.go new file mode 100644 index 00000000..42085d7a --- /dev/null +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/plugins.go @@ -0,0 +1,25 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package auth + +import ( + // Initialize all known client auth plugins. + _ "k8s.io/client-go/plugin/pkg/client/auth/azure" + _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" + _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" + _ "k8s.io/client-go/plugin/pkg/client/auth/openstack" +) diff --git a/vendor/k8s.io/client-go/third_party/forked/golang/template/exec.go b/vendor/k8s.io/client-go/third_party/forked/golang/template/exec.go new file mode 100644 index 00000000..739fd350 --- /dev/null +++ b/vendor/k8s.io/client-go/third_party/forked/golang/template/exec.go @@ -0,0 +1,94 @@ +//This package is copied from Go library text/template. +//The original private functions indirect and printableValue +//are exported as public functions. +package template + +import ( + "fmt" + "reflect" +) + +var Indirect = indirect +var PrintableValue = printableValue + +var ( + errorType = reflect.TypeOf((*error)(nil)).Elem() + fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem() +) + +// indirect returns the item at the end of indirection, and a bool to indicate if it's nil. +// We indirect through pointers and empty interfaces (only) because +// non-empty interfaces have methods we might need. +func indirect(v reflect.Value) (rv reflect.Value, isNil bool) { + for ; v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface; v = v.Elem() { + if v.IsNil() { + return v, true + } + if v.Kind() == reflect.Interface && v.NumMethod() > 0 { + break + } + } + return v, false +} + +// printableValue returns the, possibly indirected, interface value inside v that +// is best for a call to formatted printer. +func printableValue(v reflect.Value) (interface{}, bool) { + if v.Kind() == reflect.Ptr { + v, _ = indirect(v) // fmt.Fprint handles nil. + } + if !v.IsValid() { + return "", true + } + + if !v.Type().Implements(errorType) && !v.Type().Implements(fmtStringerType) { + if v.CanAddr() && (reflect.PtrTo(v.Type()).Implements(errorType) || reflect.PtrTo(v.Type()).Implements(fmtStringerType)) { + v = v.Addr() + } else { + switch v.Kind() { + case reflect.Chan, reflect.Func: + return nil, false + } + } + } + return v.Interface(), true +} + +// canBeNil reports whether an untyped nil can be assigned to the type. See reflect.Zero. +func canBeNil(typ reflect.Type) bool { + switch typ.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return true + } + return false +} + +// isTrue reports whether the value is 'true', in the sense of not the zero of its type, +// and whether the value has a meaningful truth value. +func isTrue(val reflect.Value) (truth, ok bool) { + if !val.IsValid() { + // Something like var x interface{}, never set. It's a form of nil. + return false, true + } + switch val.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + truth = val.Len() > 0 + case reflect.Bool: + truth = val.Bool() + case reflect.Complex64, reflect.Complex128: + truth = val.Complex() != 0 + case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Interface: + truth = !val.IsNil() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + truth = val.Int() != 0 + case reflect.Float32, reflect.Float64: + truth = val.Float() != 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + truth = val.Uint() != 0 + case reflect.Struct: + truth = true // Struct values are always true. + default: + return + } + return truth, true +} diff --git a/vendor/k8s.io/client-go/third_party/forked/golang/template/funcs.go b/vendor/k8s.io/client-go/third_party/forked/golang/template/funcs.go new file mode 100644 index 00000000..27a008b0 --- /dev/null +++ b/vendor/k8s.io/client-go/third_party/forked/golang/template/funcs.go @@ -0,0 +1,599 @@ +//This package is copied from Go library text/template. +//The original private functions eq, ge, gt, le, lt, and ne +//are exported as public functions. +package template + +import ( + "bytes" + "errors" + "fmt" + "io" + "net/url" + "reflect" + "strings" + "unicode" + "unicode/utf8" +) + +var Equal = eq +var GreaterEqual = ge +var Greater = gt +var LessEqual = le +var Less = lt +var NotEqual = ne + +// FuncMap is the type of the map defining the mapping from names to functions. +// Each function must have either a single return value, or two return values of +// which the second has type error. In that case, if the second (error) +// return value evaluates to non-nil during execution, execution terminates and +// Execute returns that error. +type FuncMap map[string]interface{} + +var builtins = FuncMap{ + "and": and, + "call": call, + "html": HTMLEscaper, + "index": index, + "js": JSEscaper, + "len": length, + "not": not, + "or": or, + "print": fmt.Sprint, + "printf": fmt.Sprintf, + "println": fmt.Sprintln, + "urlquery": URLQueryEscaper, + + // Comparisons + "eq": eq, // == + "ge": ge, // >= + "gt": gt, // > + "le": le, // <= + "lt": lt, // < + "ne": ne, // != +} + +var builtinFuncs = createValueFuncs(builtins) + +// createValueFuncs turns a FuncMap into a map[string]reflect.Value +func createValueFuncs(funcMap FuncMap) map[string]reflect.Value { + m := make(map[string]reflect.Value) + addValueFuncs(m, funcMap) + return m +} + +// addValueFuncs adds to values the functions in funcs, converting them to reflect.Values. +func addValueFuncs(out map[string]reflect.Value, in FuncMap) { + for name, fn := range in { + v := reflect.ValueOf(fn) + if v.Kind() != reflect.Func { + panic("value for " + name + " not a function") + } + if !goodFunc(v.Type()) { + panic(fmt.Errorf("can't install method/function %q with %d results", name, v.Type().NumOut())) + } + out[name] = v + } +} + +// AddFuncs adds to values the functions in funcs. It does no checking of the input - +// call addValueFuncs first. +func addFuncs(out, in FuncMap) { + for name, fn := range in { + out[name] = fn + } +} + +// goodFunc checks that the function or method has the right result signature. +func goodFunc(typ reflect.Type) bool { + // We allow functions with 1 result or 2 results where the second is an error. + switch { + case typ.NumOut() == 1: + return true + case typ.NumOut() == 2 && typ.Out(1) == errorType: + return true + } + return false +} + +// findFunction looks for a function in the template, and global map. +func findFunction(name string) (reflect.Value, bool) { + if fn := builtinFuncs[name]; fn.IsValid() { + return fn, true + } + return reflect.Value{}, false +} + +// Indexing. + +// index returns the result of indexing its first argument by the following +// arguments. Thus "index x 1 2 3" is, in Go syntax, x[1][2][3]. Each +// indexed item must be a map, slice, or array. +func index(item interface{}, indices ...interface{}) (interface{}, error) { + v := reflect.ValueOf(item) + for _, i := range indices { + index := reflect.ValueOf(i) + var isNil bool + if v, isNil = indirect(v); isNil { + return nil, fmt.Errorf("index of nil pointer") + } + switch v.Kind() { + case reflect.Array, reflect.Slice, reflect.String: + var x int64 + switch index.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + x = index.Int() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + x = int64(index.Uint()) + default: + return nil, fmt.Errorf("cannot index slice/array with type %s", index.Type()) + } + if x < 0 || x >= int64(v.Len()) { + return nil, fmt.Errorf("index out of range: %d", x) + } + v = v.Index(int(x)) + case reflect.Map: + if !index.IsValid() { + index = reflect.Zero(v.Type().Key()) + } + if !index.Type().AssignableTo(v.Type().Key()) { + return nil, fmt.Errorf("%s is not index type for %s", index.Type(), v.Type()) + } + if x := v.MapIndex(index); x.IsValid() { + v = x + } else { + v = reflect.Zero(v.Type().Elem()) + } + default: + return nil, fmt.Errorf("can't index item of type %s", v.Type()) + } + } + return v.Interface(), nil +} + +// Length + +// length returns the length of the item, with an error if it has no defined length. +func length(item interface{}) (int, error) { + v, isNil := indirect(reflect.ValueOf(item)) + if isNil { + return 0, fmt.Errorf("len of nil pointer") + } + switch v.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String: + return v.Len(), nil + } + return 0, fmt.Errorf("len of type %s", v.Type()) +} + +// Function invocation + +// call returns the result of evaluating the first argument as a function. +// The function must return 1 result, or 2 results, the second of which is an error. +func call(fn interface{}, args ...interface{}) (interface{}, error) { + v := reflect.ValueOf(fn) + typ := v.Type() + if typ.Kind() != reflect.Func { + return nil, fmt.Errorf("non-function of type %s", typ) + } + if !goodFunc(typ) { + return nil, fmt.Errorf("function called with %d args; should be 1 or 2", typ.NumOut()) + } + numIn := typ.NumIn() + var dddType reflect.Type + if typ.IsVariadic() { + if len(args) < numIn-1 { + return nil, fmt.Errorf("wrong number of args: got %d want at least %d", len(args), numIn-1) + } + dddType = typ.In(numIn - 1).Elem() + } else { + if len(args) != numIn { + return nil, fmt.Errorf("wrong number of args: got %d want %d", len(args), numIn) + } + } + argv := make([]reflect.Value, len(args)) + for i, arg := range args { + value := reflect.ValueOf(arg) + // Compute the expected type. Clumsy because of variadics. + var argType reflect.Type + if !typ.IsVariadic() || i < numIn-1 { + argType = typ.In(i) + } else { + argType = dddType + } + if !value.IsValid() && canBeNil(argType) { + value = reflect.Zero(argType) + } + if !value.Type().AssignableTo(argType) { + return nil, fmt.Errorf("arg %d has type %s; should be %s", i, value.Type(), argType) + } + argv[i] = value + } + result := v.Call(argv) + if len(result) == 2 && !result[1].IsNil() { + return result[0].Interface(), result[1].Interface().(error) + } + return result[0].Interface(), nil +} + +// Boolean logic. + +func truth(a interface{}) bool { + t, _ := isTrue(reflect.ValueOf(a)) + return t +} + +// and computes the Boolean AND of its arguments, returning +// the first false argument it encounters, or the last argument. +func and(arg0 interface{}, args ...interface{}) interface{} { + if !truth(arg0) { + return arg0 + } + for i := range args { + arg0 = args[i] + if !truth(arg0) { + break + } + } + return arg0 +} + +// or computes the Boolean OR of its arguments, returning +// the first true argument it encounters, or the last argument. +func or(arg0 interface{}, args ...interface{}) interface{} { + if truth(arg0) { + return arg0 + } + for i := range args { + arg0 = args[i] + if truth(arg0) { + break + } + } + return arg0 +} + +// not returns the Boolean negation of its argument. +func not(arg interface{}) (truth bool) { + truth, _ = isTrue(reflect.ValueOf(arg)) + return !truth +} + +// Comparison. + +// TODO: Perhaps allow comparison between signed and unsigned integers. + +var ( + errBadComparisonType = errors.New("invalid type for comparison") + errBadComparison = errors.New("incompatible types for comparison") + errNoComparison = errors.New("missing argument for comparison") +) + +type kind int + +const ( + invalidKind kind = iota + boolKind + complexKind + intKind + floatKind + integerKind + stringKind + uintKind +) + +func basicKind(v reflect.Value) (kind, error) { + switch v.Kind() { + case reflect.Bool: + return boolKind, nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return intKind, nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return uintKind, nil + case reflect.Float32, reflect.Float64: + return floatKind, nil + case reflect.Complex64, reflect.Complex128: + return complexKind, nil + case reflect.String: + return stringKind, nil + } + return invalidKind, errBadComparisonType +} + +// eq evaluates the comparison a == b || a == c || ... +func eq(arg1 interface{}, arg2 ...interface{}) (bool, error) { + v1 := reflect.ValueOf(arg1) + k1, err := basicKind(v1) + if err != nil { + return false, err + } + if len(arg2) == 0 { + return false, errNoComparison + } + for _, arg := range arg2 { + v2 := reflect.ValueOf(arg) + k2, err := basicKind(v2) + if err != nil { + return false, err + } + truth := false + if k1 != k2 { + // Special case: Can compare integer values regardless of type's sign. + switch { + case k1 == intKind && k2 == uintKind: + truth = v1.Int() >= 0 && uint64(v1.Int()) == v2.Uint() + case k1 == uintKind && k2 == intKind: + truth = v2.Int() >= 0 && v1.Uint() == uint64(v2.Int()) + default: + return false, errBadComparison + } + } else { + switch k1 { + case boolKind: + truth = v1.Bool() == v2.Bool() + case complexKind: + truth = v1.Complex() == v2.Complex() + case floatKind: + truth = v1.Float() == v2.Float() + case intKind: + truth = v1.Int() == v2.Int() + case stringKind: + truth = v1.String() == v2.String() + case uintKind: + truth = v1.Uint() == v2.Uint() + default: + panic("invalid kind") + } + } + if truth { + return true, nil + } + } + return false, nil +} + +// ne evaluates the comparison a != b. +func ne(arg1, arg2 interface{}) (bool, error) { + // != is the inverse of ==. + equal, err := eq(arg1, arg2) + return !equal, err +} + +// lt evaluates the comparison a < b. +func lt(arg1, arg2 interface{}) (bool, error) { + v1 := reflect.ValueOf(arg1) + k1, err := basicKind(v1) + if err != nil { + return false, err + } + v2 := reflect.ValueOf(arg2) + k2, err := basicKind(v2) + if err != nil { + return false, err + } + truth := false + if k1 != k2 { + // Special case: Can compare integer values regardless of type's sign. + switch { + case k1 == intKind && k2 == uintKind: + truth = v1.Int() < 0 || uint64(v1.Int()) < v2.Uint() + case k1 == uintKind && k2 == intKind: + truth = v2.Int() >= 0 && v1.Uint() < uint64(v2.Int()) + default: + return false, errBadComparison + } + } else { + switch k1 { + case boolKind, complexKind: + return false, errBadComparisonType + case floatKind: + truth = v1.Float() < v2.Float() + case intKind: + truth = v1.Int() < v2.Int() + case stringKind: + truth = v1.String() < v2.String() + case uintKind: + truth = v1.Uint() < v2.Uint() + default: + panic("invalid kind") + } + } + return truth, nil +} + +// le evaluates the comparison <= b. +func le(arg1, arg2 interface{}) (bool, error) { + // <= is < or ==. + lessThan, err := lt(arg1, arg2) + if lessThan || err != nil { + return lessThan, err + } + return eq(arg1, arg2) +} + +// gt evaluates the comparison a > b. +func gt(arg1, arg2 interface{}) (bool, error) { + // > is the inverse of <=. + lessOrEqual, err := le(arg1, arg2) + if err != nil { + return false, err + } + return !lessOrEqual, nil +} + +// ge evaluates the comparison a >= b. +func ge(arg1, arg2 interface{}) (bool, error) { + // >= is the inverse of <. + lessThan, err := lt(arg1, arg2) + if err != nil { + return false, err + } + return !lessThan, nil +} + +// HTML escaping. + +var ( + htmlQuot = []byte(""") // shorter than """ + htmlApos = []byte("'") // shorter than "'" and apos was not in HTML until HTML5 + htmlAmp = []byte("&") + htmlLt = []byte("<") + htmlGt = []byte(">") +) + +// HTMLEscape writes to w the escaped HTML equivalent of the plain text data b. +func HTMLEscape(w io.Writer, b []byte) { + last := 0 + for i, c := range b { + var html []byte + switch c { + case '"': + html = htmlQuot + case '\'': + html = htmlApos + case '&': + html = htmlAmp + case '<': + html = htmlLt + case '>': + html = htmlGt + default: + continue + } + w.Write(b[last:i]) + w.Write(html) + last = i + 1 + } + w.Write(b[last:]) +} + +// HTMLEscapeString returns the escaped HTML equivalent of the plain text data s. +func HTMLEscapeString(s string) string { + // Avoid allocation if we can. + if strings.IndexAny(s, `'"&<>`) < 0 { + return s + } + var b bytes.Buffer + HTMLEscape(&b, []byte(s)) + return b.String() +} + +// HTMLEscaper returns the escaped HTML equivalent of the textual +// representation of its arguments. +func HTMLEscaper(args ...interface{}) string { + return HTMLEscapeString(evalArgs(args)) +} + +// JavaScript escaping. + +var ( + jsLowUni = []byte(`\u00`) + hex = []byte("0123456789ABCDEF") + + jsBackslash = []byte(`\\`) + jsApos = []byte(`\'`) + jsQuot = []byte(`\"`) + jsLt = []byte(`\x3C`) + jsGt = []byte(`\x3E`) +) + +// JSEscape writes to w the escaped JavaScript equivalent of the plain text data b. +func JSEscape(w io.Writer, b []byte) { + last := 0 + for i := 0; i < len(b); i++ { + c := b[i] + + if !jsIsSpecial(rune(c)) { + // fast path: nothing to do + continue + } + w.Write(b[last:i]) + + if c < utf8.RuneSelf { + // Quotes, slashes and angle brackets get quoted. + // Control characters get written as \u00XX. + switch c { + case '\\': + w.Write(jsBackslash) + case '\'': + w.Write(jsApos) + case '"': + w.Write(jsQuot) + case '<': + w.Write(jsLt) + case '>': + w.Write(jsGt) + default: + w.Write(jsLowUni) + t, b := c>>4, c&0x0f + w.Write(hex[t : t+1]) + w.Write(hex[b : b+1]) + } + } else { + // Unicode rune. + r, size := utf8.DecodeRune(b[i:]) + if unicode.IsPrint(r) { + w.Write(b[i : i+size]) + } else { + fmt.Fprintf(w, "\\u%04X", r) + } + i += size - 1 + } + last = i + 1 + } + w.Write(b[last:]) +} + +// JSEscapeString returns the escaped JavaScript equivalent of the plain text data s. +func JSEscapeString(s string) string { + // Avoid allocation if we can. + if strings.IndexFunc(s, jsIsSpecial) < 0 { + return s + } + var b bytes.Buffer + JSEscape(&b, []byte(s)) + return b.String() +} + +func jsIsSpecial(r rune) bool { + switch r { + case '\\', '\'', '"', '<', '>': + return true + } + return r < ' ' || utf8.RuneSelf <= r +} + +// JSEscaper returns the escaped JavaScript equivalent of the textual +// representation of its arguments. +func JSEscaper(args ...interface{}) string { + return JSEscapeString(evalArgs(args)) +} + +// URLQueryEscaper returns the escaped value of the textual representation of +// its arguments in a form suitable for embedding in a URL query. +func URLQueryEscaper(args ...interface{}) string { + return url.QueryEscape(evalArgs(args)) +} + +// evalArgs formats the list of arguments into a string. It is therefore equivalent to +// fmt.Sprint(args...) +// except that each argument is indirected (if a pointer), as required, +// using the same rules as the default string evaluation during template +// execution. +func evalArgs(args []interface{}) string { + ok := false + var s string + // Fast path for simple common case. + if len(args) == 1 { + s, ok = args[0].(string) + } + if !ok { + for i, arg := range args { + a, ok := printableValue(reflect.ValueOf(arg)) + if ok { + args[i] = a + } // else left fmt do its thing + } + s = fmt.Sprint(args...) + } + return s +} diff --git a/vendor/k8s.io/client-go/util/jsonpath/doc.go b/vendor/k8s.io/client-go/util/jsonpath/doc.go new file mode 100644 index 00000000..0effb15c --- /dev/null +++ b/vendor/k8s.io/client-go/util/jsonpath/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// package jsonpath is a template engine using jsonpath syntax, +// which can be seen at http://goessner.net/articles/JsonPath/. +// In addition, it has {range} {end} function to iterate list and slice. +package jsonpath // import "k8s.io/client-go/util/jsonpath" diff --git a/vendor/k8s.io/client-go/util/jsonpath/jsonpath.go b/vendor/k8s.io/client-go/util/jsonpath/jsonpath.go new file mode 100644 index 00000000..78b6b678 --- /dev/null +++ b/vendor/k8s.io/client-go/util/jsonpath/jsonpath.go @@ -0,0 +1,525 @@ +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package jsonpath + +import ( + "bytes" + "fmt" + "io" + "reflect" + "strings" + + "k8s.io/client-go/third_party/forked/golang/template" +) + +type JSONPath struct { + name string + parser *Parser + stack [][]reflect.Value // push and pop values in different scopes + cur []reflect.Value // current scope values + beginRange int + inRange int + endRange int + + allowMissingKeys bool +} + +// New creates a new JSONPath with the given name. +func New(name string) *JSONPath { + return &JSONPath{ + name: name, + beginRange: 0, + inRange: 0, + endRange: 0, + } +} + +// AllowMissingKeys allows a caller to specify whether they want an error if a field or map key +// cannot be located, or simply an empty result. The receiver is returned for chaining. +func (j *JSONPath) AllowMissingKeys(allow bool) *JSONPath { + j.allowMissingKeys = allow + return j +} + +// Parse parses the given template and returns an error. +func (j *JSONPath) Parse(text string) error { + var err error + j.parser, err = Parse(j.name, text) + return err +} + +// Execute bounds data into template and writes the result. +func (j *JSONPath) Execute(wr io.Writer, data interface{}) error { + fullResults, err := j.FindResults(data) + if err != nil { + return err + } + for ix := range fullResults { + if err := j.PrintResults(wr, fullResults[ix]); err != nil { + return err + } + } + return nil +} + +func (j *JSONPath) FindResults(data interface{}) ([][]reflect.Value, error) { + if j.parser == nil { + return nil, fmt.Errorf("%s is an incomplete jsonpath template", j.name) + } + + j.cur = []reflect.Value{reflect.ValueOf(data)} + nodes := j.parser.Root.Nodes + fullResult := [][]reflect.Value{} + for i := 0; i < len(nodes); i++ { + node := nodes[i] + results, err := j.walk(j.cur, node) + if err != nil { + return nil, err + } + + // encounter an end node, break the current block + if j.endRange > 0 && j.endRange <= j.inRange { + j.endRange-- + break + } + // encounter a range node, start a range loop + if j.beginRange > 0 { + j.beginRange-- + j.inRange++ + for k, value := range results { + j.parser.Root.Nodes = nodes[i+1:] + if k == len(results)-1 { + j.inRange-- + } + nextResults, err := j.FindResults(value.Interface()) + if err != nil { + return nil, err + } + fullResult = append(fullResult, nextResults...) + } + break + } + fullResult = append(fullResult, results) + } + return fullResult, nil +} + +// PrintResults writes the results into writer +func (j *JSONPath) PrintResults(wr io.Writer, results []reflect.Value) error { + for i, r := range results { + text, err := j.evalToText(r) + if err != nil { + return err + } + if i != len(results)-1 { + text = append(text, ' ') + } + if _, err = wr.Write(text); err != nil { + return err + } + } + return nil +} + +// walk visits tree rooted at the given node in DFS order +func (j *JSONPath) walk(value []reflect.Value, node Node) ([]reflect.Value, error) { + switch node := node.(type) { + case *ListNode: + return j.evalList(value, node) + case *TextNode: + return []reflect.Value{reflect.ValueOf(node.Text)}, nil + case *FieldNode: + return j.evalField(value, node) + case *ArrayNode: + return j.evalArray(value, node) + case *FilterNode: + return j.evalFilter(value, node) + case *IntNode: + return j.evalInt(value, node) + case *BoolNode: + return j.evalBool(value, node) + case *FloatNode: + return j.evalFloat(value, node) + case *WildcardNode: + return j.evalWildcard(value, node) + case *RecursiveNode: + return j.evalRecursive(value, node) + case *UnionNode: + return j.evalUnion(value, node) + case *IdentifierNode: + return j.evalIdentifier(value, node) + default: + return value, fmt.Errorf("unexpected Node %v", node) + } +} + +// evalInt evaluates IntNode +func (j *JSONPath) evalInt(input []reflect.Value, node *IntNode) ([]reflect.Value, error) { + result := make([]reflect.Value, len(input)) + for i := range input { + result[i] = reflect.ValueOf(node.Value) + } + return result, nil +} + +// evalFloat evaluates FloatNode +func (j *JSONPath) evalFloat(input []reflect.Value, node *FloatNode) ([]reflect.Value, error) { + result := make([]reflect.Value, len(input)) + for i := range input { + result[i] = reflect.ValueOf(node.Value) + } + return result, nil +} + +// evalBool evaluates BoolNode +func (j *JSONPath) evalBool(input []reflect.Value, node *BoolNode) ([]reflect.Value, error) { + result := make([]reflect.Value, len(input)) + for i := range input { + result[i] = reflect.ValueOf(node.Value) + } + return result, nil +} + +// evalList evaluates ListNode +func (j *JSONPath) evalList(value []reflect.Value, node *ListNode) ([]reflect.Value, error) { + var err error + curValue := value + for _, node := range node.Nodes { + curValue, err = j.walk(curValue, node) + if err != nil { + return curValue, err + } + } + return curValue, nil +} + +// evalIdentifier evaluates IdentifierNode +func (j *JSONPath) evalIdentifier(input []reflect.Value, node *IdentifierNode) ([]reflect.Value, error) { + results := []reflect.Value{} + switch node.Name { + case "range": + j.stack = append(j.stack, j.cur) + j.beginRange++ + results = input + case "end": + if j.endRange < j.inRange { // inside a loop, break the current block + j.endRange++ + break + } + // the loop is about to end, pop value and continue the following execution + if len(j.stack) > 0 { + j.cur, j.stack = j.stack[len(j.stack)-1], j.stack[:len(j.stack)-1] + } else { + return results, fmt.Errorf("not in range, nothing to end") + } + default: + return input, fmt.Errorf("unrecognized identifier %v", node.Name) + } + return results, nil +} + +// evalArray evaluates ArrayNode +func (j *JSONPath) evalArray(input []reflect.Value, node *ArrayNode) ([]reflect.Value, error) { + result := []reflect.Value{} + for _, value := range input { + + value, isNil := template.Indirect(value) + if isNil { + continue + } + if value.Kind() != reflect.Array && value.Kind() != reflect.Slice { + return input, fmt.Errorf("%v is not array or slice", value.Type()) + } + params := node.Params + if !params[0].Known { + params[0].Value = 0 + } + if params[0].Value < 0 { + params[0].Value += value.Len() + } + if !params[1].Known { + params[1].Value = value.Len() + } + + if params[1].Value < 0 || (params[1].Value == 0 && params[1].Derived) { + params[1].Value += value.Len() + } + sliceLength := value.Len() + if params[1].Value != params[0].Value { // if you're requesting zero elements, allow it through. + if params[0].Value >= sliceLength || params[0].Value < 0 { + return input, fmt.Errorf("array index out of bounds: index %d, length %d", params[0].Value, sliceLength) + } + if params[1].Value > sliceLength || params[1].Value < 0 { + return input, fmt.Errorf("array index out of bounds: index %d, length %d", params[1].Value-1, sliceLength) + } + if params[0].Value > params[1].Value { + return input, fmt.Errorf("starting index %d is greater than ending index %d", params[0].Value, params[1].Value) + } + } else { + return result, nil + } + + value = value.Slice(params[0].Value, params[1].Value) + + step := 1 + if params[2].Known { + if params[2].Value <= 0 { + return input, fmt.Errorf("step must be > 0") + } + step = params[2].Value + } + for i := 0; i < value.Len(); i += step { + result = append(result, value.Index(i)) + } + } + return result, nil +} + +// evalUnion evaluates UnionNode +func (j *JSONPath) evalUnion(input []reflect.Value, node *UnionNode) ([]reflect.Value, error) { + result := []reflect.Value{} + for _, listNode := range node.Nodes { + temp, err := j.evalList(input, listNode) + if err != nil { + return input, err + } + result = append(result, temp...) + } + return result, nil +} + +func (j *JSONPath) findFieldInValue(value *reflect.Value, node *FieldNode) (reflect.Value, error) { + t := value.Type() + var inlineValue *reflect.Value + for ix := 0; ix < t.NumField(); ix++ { + f := t.Field(ix) + jsonTag := f.Tag.Get("json") + parts := strings.Split(jsonTag, ",") + if len(parts) == 0 { + continue + } + if parts[0] == node.Value { + return value.Field(ix), nil + } + if len(parts[0]) == 0 { + val := value.Field(ix) + inlineValue = &val + } + } + if inlineValue != nil { + if inlineValue.Kind() == reflect.Struct { + // handle 'inline' + match, err := j.findFieldInValue(inlineValue, node) + if err != nil { + return reflect.Value{}, err + } + if match.IsValid() { + return match, nil + } + } + } + return value.FieldByName(node.Value), nil +} + +// evalField evaluates field of struct or key of map. +func (j *JSONPath) evalField(input []reflect.Value, node *FieldNode) ([]reflect.Value, error) { + results := []reflect.Value{} + // If there's no input, there's no output + if len(input) == 0 { + return results, nil + } + for _, value := range input { + var result reflect.Value + value, isNil := template.Indirect(value) + if isNil { + continue + } + + if value.Kind() == reflect.Struct { + var err error + if result, err = j.findFieldInValue(&value, node); err != nil { + return nil, err + } + } else if value.Kind() == reflect.Map { + mapKeyType := value.Type().Key() + nodeValue := reflect.ValueOf(node.Value) + // node value type must be convertible to map key type + if !nodeValue.Type().ConvertibleTo(mapKeyType) { + return results, fmt.Errorf("%s is not convertible to %s", nodeValue, mapKeyType) + } + result = value.MapIndex(nodeValue.Convert(mapKeyType)) + } + if result.IsValid() { + results = append(results, result) + } + } + if len(results) == 0 { + if j.allowMissingKeys { + return results, nil + } + return results, fmt.Errorf("%s is not found", node.Value) + } + return results, nil +} + +// evalWildcard extracts all contents of the given value +func (j *JSONPath) evalWildcard(input []reflect.Value, node *WildcardNode) ([]reflect.Value, error) { + results := []reflect.Value{} + for _, value := range input { + value, isNil := template.Indirect(value) + if isNil { + continue + } + + kind := value.Kind() + if kind == reflect.Struct { + for i := 0; i < value.NumField(); i++ { + results = append(results, value.Field(i)) + } + } else if kind == reflect.Map { + for _, key := range value.MapKeys() { + results = append(results, value.MapIndex(key)) + } + } else if kind == reflect.Array || kind == reflect.Slice || kind == reflect.String { + for i := 0; i < value.Len(); i++ { + results = append(results, value.Index(i)) + } + } + } + return results, nil +} + +// evalRecursive visits the given value recursively and pushes all of them to result +func (j *JSONPath) evalRecursive(input []reflect.Value, node *RecursiveNode) ([]reflect.Value, error) { + result := []reflect.Value{} + for _, value := range input { + results := []reflect.Value{} + value, isNil := template.Indirect(value) + if isNil { + continue + } + + kind := value.Kind() + if kind == reflect.Struct { + for i := 0; i < value.NumField(); i++ { + results = append(results, value.Field(i)) + } + } else if kind == reflect.Map { + for _, key := range value.MapKeys() { + results = append(results, value.MapIndex(key)) + } + } else if kind == reflect.Array || kind == reflect.Slice || kind == reflect.String { + for i := 0; i < value.Len(); i++ { + results = append(results, value.Index(i)) + } + } + if len(results) != 0 { + result = append(result, value) + output, err := j.evalRecursive(results, node) + if err != nil { + return result, err + } + result = append(result, output...) + } + } + return result, nil +} + +// evalFilter filters array according to FilterNode +func (j *JSONPath) evalFilter(input []reflect.Value, node *FilterNode) ([]reflect.Value, error) { + results := []reflect.Value{} + for _, value := range input { + value, _ = template.Indirect(value) + + if value.Kind() != reflect.Array && value.Kind() != reflect.Slice { + return input, fmt.Errorf("%v is not array or slice and cannot be filtered", value) + } + for i := 0; i < value.Len(); i++ { + temp := []reflect.Value{value.Index(i)} + lefts, err := j.evalList(temp, node.Left) + + //case exists + if node.Operator == "exists" { + if len(lefts) > 0 { + results = append(results, value.Index(i)) + } + continue + } + + if err != nil { + return input, err + } + + var left, right interface{} + switch { + case len(lefts) == 0: + continue + case len(lefts) > 1: + return input, fmt.Errorf("can only compare one element at a time") + } + left = lefts[0].Interface() + + rights, err := j.evalList(temp, node.Right) + if err != nil { + return input, err + } + switch { + case len(rights) == 0: + continue + case len(rights) > 1: + return input, fmt.Errorf("can only compare one element at a time") + } + right = rights[0].Interface() + + pass := false + switch node.Operator { + case "<": + pass, err = template.Less(left, right) + case ">": + pass, err = template.Greater(left, right) + case "==": + pass, err = template.Equal(left, right) + case "!=": + pass, err = template.NotEqual(left, right) + case "<=": + pass, err = template.LessEqual(left, right) + case ">=": + pass, err = template.GreaterEqual(left, right) + default: + return results, fmt.Errorf("unrecognized filter operator %s", node.Operator) + } + if err != nil { + return results, err + } + if pass { + results = append(results, value.Index(i)) + } + } + } + return results, nil +} + +// evalToText translates reflect value to corresponding text +func (j *JSONPath) evalToText(v reflect.Value) ([]byte, error) { + iface, ok := template.PrintableValue(v) + if !ok { + return nil, fmt.Errorf("can't print type %s", v.Type()) + } + var buffer bytes.Buffer + fmt.Fprint(&buffer, iface) + return buffer.Bytes(), nil +} diff --git a/vendor/k8s.io/client-go/util/jsonpath/node.go b/vendor/k8s.io/client-go/util/jsonpath/node.go new file mode 100644 index 00000000..83abe8b0 --- /dev/null +++ b/vendor/k8s.io/client-go/util/jsonpath/node.go @@ -0,0 +1,256 @@ +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package jsonpath + +import "fmt" + +// NodeType identifies the type of a parse tree node. +type NodeType int + +// Type returns itself and provides an easy default implementation +func (t NodeType) Type() NodeType { + return t +} + +func (t NodeType) String() string { + return NodeTypeName[t] +} + +const ( + NodeText NodeType = iota + NodeArray + NodeList + NodeField + NodeIdentifier + NodeFilter + NodeInt + NodeFloat + NodeWildcard + NodeRecursive + NodeUnion + NodeBool +) + +var NodeTypeName = map[NodeType]string{ + NodeText: "NodeText", + NodeArray: "NodeArray", + NodeList: "NodeList", + NodeField: "NodeField", + NodeIdentifier: "NodeIdentifier", + NodeFilter: "NodeFilter", + NodeInt: "NodeInt", + NodeFloat: "NodeFloat", + NodeWildcard: "NodeWildcard", + NodeRecursive: "NodeRecursive", + NodeUnion: "NodeUnion", + NodeBool: "NodeBool", +} + +type Node interface { + Type() NodeType + String() string +} + +// ListNode holds a sequence of nodes. +type ListNode struct { + NodeType + Nodes []Node // The element nodes in lexical order. +} + +func newList() *ListNode { + return &ListNode{NodeType: NodeList} +} + +func (l *ListNode) append(n Node) { + l.Nodes = append(l.Nodes, n) +} + +func (l *ListNode) String() string { + return l.Type().String() +} + +// TextNode holds plain text. +type TextNode struct { + NodeType + Text string // The text; may span newlines. +} + +func newText(text string) *TextNode { + return &TextNode{NodeType: NodeText, Text: text} +} + +func (t *TextNode) String() string { + return fmt.Sprintf("%s: %s", t.Type(), t.Text) +} + +// FieldNode holds field of struct +type FieldNode struct { + NodeType + Value string +} + +func newField(value string) *FieldNode { + return &FieldNode{NodeType: NodeField, Value: value} +} + +func (f *FieldNode) String() string { + return fmt.Sprintf("%s: %s", f.Type(), f.Value) +} + +// IdentifierNode holds an identifier +type IdentifierNode struct { + NodeType + Name string +} + +func newIdentifier(value string) *IdentifierNode { + return &IdentifierNode{ + NodeType: NodeIdentifier, + Name: value, + } +} + +func (f *IdentifierNode) String() string { + return fmt.Sprintf("%s: %s", f.Type(), f.Name) +} + +// ParamsEntry holds param information for ArrayNode +type ParamsEntry struct { + Value int + Known bool // whether the value is known when parse it + Derived bool +} + +// ArrayNode holds start, end, step information for array index selection +type ArrayNode struct { + NodeType + Params [3]ParamsEntry // start, end, step +} + +func newArray(params [3]ParamsEntry) *ArrayNode { + return &ArrayNode{ + NodeType: NodeArray, + Params: params, + } +} + +func (a *ArrayNode) String() string { + return fmt.Sprintf("%s: %v", a.Type(), a.Params) +} + +// FilterNode holds operand and operator information for filter +type FilterNode struct { + NodeType + Left *ListNode + Right *ListNode + Operator string +} + +func newFilter(left, right *ListNode, operator string) *FilterNode { + return &FilterNode{ + NodeType: NodeFilter, + Left: left, + Right: right, + Operator: operator, + } +} + +func (f *FilterNode) String() string { + return fmt.Sprintf("%s: %s %s %s", f.Type(), f.Left, f.Operator, f.Right) +} + +// IntNode holds integer value +type IntNode struct { + NodeType + Value int +} + +func newInt(num int) *IntNode { + return &IntNode{NodeType: NodeInt, Value: num} +} + +func (i *IntNode) String() string { + return fmt.Sprintf("%s: %d", i.Type(), i.Value) +} + +// FloatNode holds float value +type FloatNode struct { + NodeType + Value float64 +} + +func newFloat(num float64) *FloatNode { + return &FloatNode{NodeType: NodeFloat, Value: num} +} + +func (i *FloatNode) String() string { + return fmt.Sprintf("%s: %f", i.Type(), i.Value) +} + +// WildcardNode means a wildcard +type WildcardNode struct { + NodeType +} + +func newWildcard() *WildcardNode { + return &WildcardNode{NodeType: NodeWildcard} +} + +func (i *WildcardNode) String() string { + return i.Type().String() +} + +// RecursiveNode means a recursive descent operator +type RecursiveNode struct { + NodeType +} + +func newRecursive() *RecursiveNode { + return &RecursiveNode{NodeType: NodeRecursive} +} + +func (r *RecursiveNode) String() string { + return r.Type().String() +} + +// UnionNode is union of ListNode +type UnionNode struct { + NodeType + Nodes []*ListNode +} + +func newUnion(nodes []*ListNode) *UnionNode { + return &UnionNode{NodeType: NodeUnion, Nodes: nodes} +} + +func (u *UnionNode) String() string { + return u.Type().String() +} + +// BoolNode holds bool value +type BoolNode struct { + NodeType + Value bool +} + +func newBool(value bool) *BoolNode { + return &BoolNode{NodeType: NodeBool, Value: value} +} + +func (b *BoolNode) String() string { + return fmt.Sprintf("%s: %t", b.Type(), b.Value) +} diff --git a/vendor/k8s.io/client-go/util/jsonpath/parser.go b/vendor/k8s.io/client-go/util/jsonpath/parser.go new file mode 100644 index 00000000..1af8f269 --- /dev/null +++ b/vendor/k8s.io/client-go/util/jsonpath/parser.go @@ -0,0 +1,526 @@ +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package jsonpath + +import ( + "errors" + "fmt" + "regexp" + "strconv" + "strings" + "unicode" + "unicode/utf8" +) + +const eof = -1 + +const ( + leftDelim = "{" + rightDelim = "}" +) + +type Parser struct { + Name string + Root *ListNode + input string + cur *ListNode + pos int + start int + width int +} + +var ( + ErrSyntax = errors.New("invalid syntax") + dictKeyRex = regexp.MustCompile(`^'([^']*)'$`) + sliceOperatorRex = regexp.MustCompile(`^(-?[\d]*)(:-?[\d]*)?(:-?[\d]*)?$`) +) + +// Parse parsed the given text and return a node Parser. +// If an error is encountered, parsing stops and an empty +// Parser is returned with the error +func Parse(name, text string) (*Parser, error) { + p := NewParser(name) + err := p.Parse(text) + if err != nil { + p = nil + } + return p, err +} + +func NewParser(name string) *Parser { + return &Parser{ + Name: name, + } +} + +// parseAction parsed the expression inside delimiter +func parseAction(name, text string) (*Parser, error) { + p, err := Parse(name, fmt.Sprintf("%s%s%s", leftDelim, text, rightDelim)) + // when error happens, p will be nil, so we need to return here + if err != nil { + return p, err + } + p.Root = p.Root.Nodes[0].(*ListNode) + return p, nil +} + +func (p *Parser) Parse(text string) error { + p.input = text + p.Root = newList() + p.pos = 0 + return p.parseText(p.Root) +} + +// consumeText return the parsed text since last cosumeText +func (p *Parser) consumeText() string { + value := p.input[p.start:p.pos] + p.start = p.pos + return value +} + +// next returns the next rune in the input. +func (p *Parser) next() rune { + if p.pos >= len(p.input) { + p.width = 0 + return eof + } + r, w := utf8.DecodeRuneInString(p.input[p.pos:]) + p.width = w + p.pos += p.width + return r +} + +// peek returns but does not consume the next rune in the input. +func (p *Parser) peek() rune { + r := p.next() + p.backup() + return r +} + +// backup steps back one rune. Can only be called once per call of next. +func (p *Parser) backup() { + p.pos -= p.width +} + +func (p *Parser) parseText(cur *ListNode) error { + for { + if strings.HasPrefix(p.input[p.pos:], leftDelim) { + if p.pos > p.start { + cur.append(newText(p.consumeText())) + } + return p.parseLeftDelim(cur) + } + if p.next() == eof { + break + } + } + // Correctly reached EOF. + if p.pos > p.start { + cur.append(newText(p.consumeText())) + } + return nil +} + +// parseLeftDelim scans the left delimiter, which is known to be present. +func (p *Parser) parseLeftDelim(cur *ListNode) error { + p.pos += len(leftDelim) + p.consumeText() + newNode := newList() + cur.append(newNode) + cur = newNode + return p.parseInsideAction(cur) +} + +func (p *Parser) parseInsideAction(cur *ListNode) error { + prefixMap := map[string]func(*ListNode) error{ + rightDelim: p.parseRightDelim, + "[?(": p.parseFilter, + "..": p.parseRecursive, + } + for prefix, parseFunc := range prefixMap { + if strings.HasPrefix(p.input[p.pos:], prefix) { + return parseFunc(cur) + } + } + + switch r := p.next(); { + case r == eof || isEndOfLine(r): + return fmt.Errorf("unclosed action") + case r == ' ': + p.consumeText() + case r == '@' || r == '$': //the current object, just pass it + p.consumeText() + case r == '[': + return p.parseArray(cur) + case r == '"' || r == '\'': + return p.parseQuote(cur, r) + case r == '.': + return p.parseField(cur) + case r == '+' || r == '-' || unicode.IsDigit(r): + p.backup() + return p.parseNumber(cur) + case isAlphaNumeric(r): + p.backup() + return p.parseIdentifier(cur) + default: + return fmt.Errorf("unrecognized character in action: %#U", r) + } + return p.parseInsideAction(cur) +} + +// parseRightDelim scans the right delimiter, which is known to be present. +func (p *Parser) parseRightDelim(cur *ListNode) error { + p.pos += len(rightDelim) + p.consumeText() + cur = p.Root + return p.parseText(cur) +} + +// parseIdentifier scans build-in keywords, like "range" "end" +func (p *Parser) parseIdentifier(cur *ListNode) error { + var r rune + for { + r = p.next() + if isTerminator(r) { + p.backup() + break + } + } + value := p.consumeText() + + if isBool(value) { + v, err := strconv.ParseBool(value) + if err != nil { + return fmt.Errorf("can not parse bool '%s': %s", value, err.Error()) + } + + cur.append(newBool(v)) + } else { + cur.append(newIdentifier(value)) + } + + return p.parseInsideAction(cur) +} + +// parseRecursive scans the recursive desent operator .. +func (p *Parser) parseRecursive(cur *ListNode) error { + p.pos += len("..") + p.consumeText() + cur.append(newRecursive()) + if r := p.peek(); isAlphaNumeric(r) { + return p.parseField(cur) + } + return p.parseInsideAction(cur) +} + +// parseNumber scans number +func (p *Parser) parseNumber(cur *ListNode) error { + r := p.peek() + if r == '+' || r == '-' { + r = p.next() + } + for { + r = p.next() + if r != '.' && !unicode.IsDigit(r) { + p.backup() + break + } + } + value := p.consumeText() + i, err := strconv.Atoi(value) + if err == nil { + cur.append(newInt(i)) + return p.parseInsideAction(cur) + } + d, err := strconv.ParseFloat(value, 64) + if err == nil { + cur.append(newFloat(d)) + return p.parseInsideAction(cur) + } + return fmt.Errorf("cannot parse number %s", value) +} + +// parseArray scans array index selection +func (p *Parser) parseArray(cur *ListNode) error { +Loop: + for { + switch p.next() { + case eof, '\n': + return fmt.Errorf("unterminated array") + case ']': + break Loop + } + } + text := p.consumeText() + text = text[1 : len(text)-1] + if text == "*" { + text = ":" + } + + //union operator + strs := strings.Split(text, ",") + if len(strs) > 1 { + union := []*ListNode{} + for _, str := range strs { + parser, err := parseAction("union", fmt.Sprintf("[%s]", strings.Trim(str, " "))) + if err != nil { + return err + } + union = append(union, parser.Root) + } + cur.append(newUnion(union)) + return p.parseInsideAction(cur) + } + + // dict key + value := dictKeyRex.FindStringSubmatch(text) + if value != nil { + parser, err := parseAction("arraydict", fmt.Sprintf(".%s", value[1])) + if err != nil { + return err + } + for _, node := range parser.Root.Nodes { + cur.append(node) + } + return p.parseInsideAction(cur) + } + + //slice operator + value = sliceOperatorRex.FindStringSubmatch(text) + if value == nil { + return fmt.Errorf("invalid array index %s", text) + } + value = value[1:] + params := [3]ParamsEntry{} + for i := 0; i < 3; i++ { + if value[i] != "" { + if i > 0 { + value[i] = value[i][1:] + } + if i > 0 && value[i] == "" { + params[i].Known = false + } else { + var err error + params[i].Known = true + params[i].Value, err = strconv.Atoi(value[i]) + if err != nil { + return fmt.Errorf("array index %s is not a number", value[i]) + } + } + } else { + if i == 1 { + params[i].Known = true + params[i].Value = params[0].Value + 1 + params[i].Derived = true + } else { + params[i].Known = false + params[i].Value = 0 + } + } + } + cur.append(newArray(params)) + return p.parseInsideAction(cur) +} + +// parseFilter scans filter inside array selection +func (p *Parser) parseFilter(cur *ListNode) error { + p.pos += len("[?(") + p.consumeText() + begin := false + end := false + var pair rune + +Loop: + for { + r := p.next() + switch r { + case eof, '\n': + return fmt.Errorf("unterminated filter") + case '"', '\'': + if begin == false { + //save the paired rune + begin = true + pair = r + continue + } + //only add when met paired rune + if p.input[p.pos-2] != '\\' && r == pair { + end = true + } + case ')': + //in rightParser below quotes only appear zero or once + //and must be paired at the beginning and end + if begin == end { + break Loop + } + } + } + if p.next() != ']' { + return fmt.Errorf("unclosed array expect ]") + } + reg := regexp.MustCompile(`^([^!<>=]+)([!<>=]+)(.+?)$`) + text := p.consumeText() + text = text[:len(text)-2] + value := reg.FindStringSubmatch(text) + if value == nil { + parser, err := parseAction("text", text) + if err != nil { + return err + } + cur.append(newFilter(parser.Root, newList(), "exists")) + } else { + leftParser, err := parseAction("left", value[1]) + if err != nil { + return err + } + rightParser, err := parseAction("right", value[3]) + if err != nil { + return err + } + cur.append(newFilter(leftParser.Root, rightParser.Root, value[2])) + } + return p.parseInsideAction(cur) +} + +// parseQuote unquotes string inside double or single quote +func (p *Parser) parseQuote(cur *ListNode, end rune) error { +Loop: + for { + switch p.next() { + case eof, '\n': + return fmt.Errorf("unterminated quoted string") + case end: + //if it's not escape break the Loop + if p.input[p.pos-2] != '\\' { + break Loop + } + } + } + value := p.consumeText() + s, err := UnquoteExtend(value) + if err != nil { + return fmt.Errorf("unquote string %s error %v", value, err) + } + cur.append(newText(s)) + return p.parseInsideAction(cur) +} + +// parseField scans a field until a terminator +func (p *Parser) parseField(cur *ListNode) error { + p.consumeText() + for p.advance() { + } + value := p.consumeText() + if value == "*" { + cur.append(newWildcard()) + } else { + cur.append(newField(strings.Replace(value, "\\", "", -1))) + } + return p.parseInsideAction(cur) +} + +// advance scans until next non-escaped terminator +func (p *Parser) advance() bool { + r := p.next() + if r == '\\' { + p.next() + } else if isTerminator(r) { + p.backup() + return false + } + return true +} + +// isTerminator reports whether the input is at valid termination character to appear after an identifier. +func isTerminator(r rune) bool { + if isSpace(r) || isEndOfLine(r) { + return true + } + switch r { + case eof, '.', ',', '[', ']', '$', '@', '{', '}': + return true + } + return false +} + +// isSpace reports whether r is a space character. +func isSpace(r rune) bool { + return r == ' ' || r == '\t' +} + +// isEndOfLine reports whether r is an end-of-line character. +func isEndOfLine(r rune) bool { + return r == '\r' || r == '\n' +} + +// isAlphaNumeric reports whether r is an alphabetic, digit, or underscore. +func isAlphaNumeric(r rune) bool { + return r == '_' || unicode.IsLetter(r) || unicode.IsDigit(r) +} + +// isBool reports whether s is a boolean value. +func isBool(s string) bool { + return s == "true" || s == "false" +} + +//UnquoteExtend is almost same as strconv.Unquote(), but it support parse single quotes as a string +func UnquoteExtend(s string) (string, error) { + n := len(s) + if n < 2 { + return "", ErrSyntax + } + quote := s[0] + if quote != s[n-1] { + return "", ErrSyntax + } + s = s[1 : n-1] + + if quote != '"' && quote != '\'' { + return "", ErrSyntax + } + + // Is it trivial? Avoid allocation. + if !contains(s, '\\') && !contains(s, quote) { + return s, nil + } + + var runeTmp [utf8.UTFMax]byte + buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations. + for len(s) > 0 { + c, multibyte, ss, err := strconv.UnquoteChar(s, quote) + if err != nil { + return "", err + } + s = ss + if c < utf8.RuneSelf || !multibyte { + buf = append(buf, byte(c)) + } else { + n := utf8.EncodeRune(runeTmp[:], c) + buf = append(buf, runeTmp[:n]...) + } + } + return string(buf), nil +} + +func contains(s string, c byte) bool { + for i := 0; i < len(s); i++ { + if s[i] == c { + return true + } + } + return false +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 9805839b..2b710cbe 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,7 +1,17 @@ -# cloud.google.com/go v0.40.0 +# cloud.google.com/go v0.45.1 cloud.google.com/go/compute/metadata # code.cloudfoundry.org/bytefmt v0.0.0-20180906201452-2aa6f33b730c code.cloudfoundry.org/bytefmt +# github.com/Azure/go-autorest v11.1.2+incompatible +github.com/Azure/go-autorest/autorest +github.com/Azure/go-autorest/autorest/adal +github.com/Azure/go-autorest/autorest/azure +github.com/Azure/go-autorest/autorest/date +github.com/Azure/go-autorest/logger +github.com/Azure/go-autorest/version +# github.com/Microsoft/go-winio v0.4.14 +github.com/Microsoft/go-winio +github.com/Microsoft/go-winio/pkg/guid # github.com/PagerDuty/go-pagerduty v0.0.0-20190503230806-cf1437c7c8d6 github.com/PagerDuty/go-pagerduty # github.com/PuerkitoBio/goquery v1.5.0 @@ -11,11 +21,10 @@ github.com/StackExchange/wmi # github.com/adlio/trello v1.0.0 github.com/adlio/trello # github.com/alecthomas/chroma v0.6.3 -github.com/alecthomas/chroma/formatters -github.com/alecthomas/chroma/lexers -github.com/alecthomas/chroma/styles github.com/alecthomas/chroma +github.com/alecthomas/chroma/formatters github.com/alecthomas/chroma/formatters/html +github.com/alecthomas/chroma/lexers github.com/alecthomas/chroma/lexers/a github.com/alecthomas/chroma/lexers/b github.com/alecthomas/chroma/lexers/c @@ -42,6 +51,7 @@ github.com/alecthomas/chroma/lexers/v github.com/alecthomas/chroma/lexers/w github.com/alecthomas/chroma/lexers/x github.com/alecthomas/chroma/lexers/y +github.com/alecthomas/chroma/styles # github.com/andybalholm/cascadia v1.0.0 github.com/andybalholm/cascadia # github.com/andygrunwald/go-gerrit v0.0.0-20190625080919-64931d233c2d @@ -56,29 +66,104 @@ github.com/danwakefield/fnmatch github.com/darkSasori/todoist # github.com/davecgh/go-spew v1.1.1 github.com/davecgh/go-spew/spew +# github.com/dgrijalva/jwt-go v3.2.0+incompatible +github.com/dgrijalva/jwt-go # github.com/dlclark/regexp2 v1.1.6 github.com/dlclark/regexp2 github.com/dlclark/regexp2/syntax +# github.com/docker/distribution v2.7.1+incompatible +github.com/docker/distribution/digestset +github.com/docker/distribution/reference +# github.com/docker/docker v1.13.1 +github.com/docker/docker/api/types +github.com/docker/docker/api/types/blkiodev +github.com/docker/docker/api/types/container +github.com/docker/docker/api/types/events +github.com/docker/docker/api/types/filters +github.com/docker/docker/api/types/mount +github.com/docker/docker/api/types/network +github.com/docker/docker/api/types/reference +github.com/docker/docker/api/types/registry +github.com/docker/docker/api/types/strslice +github.com/docker/docker/api/types/swarm +github.com/docker/docker/api/types/time +github.com/docker/docker/api/types/versions +github.com/docker/docker/api/types/volume +github.com/docker/docker/client +github.com/docker/docker/pkg/tlsconfig +# github.com/docker/go-connections v0.4.0 +github.com/docker/go-connections/nat +github.com/docker/go-connections/sockets +github.com/docker/go-connections/tlsconfig +# github.com/docker/go-units v0.4.0 +github.com/docker/go-units # github.com/dustin/go-humanize v1.0.0 github.com/dustin/go-humanize # github.com/gdamore/encoding v1.0.0 github.com/gdamore/encoding -# github.com/gdamore/tcell v1.1.4 +# github.com/gdamore/tcell v1.2.0 github.com/gdamore/tcell github.com/gdamore/tcell/terminfo +github.com/gdamore/tcell/terminfo/a/adm3a +github.com/gdamore/tcell/terminfo/a/aixterm +github.com/gdamore/tcell/terminfo/a/ansi +github.com/gdamore/tcell/terminfo/a/aterm +github.com/gdamore/tcell/terminfo/b/beterm +github.com/gdamore/tcell/terminfo/b/bsdos_pc +github.com/gdamore/tcell/terminfo/base +github.com/gdamore/tcell/terminfo/c/cygwin +github.com/gdamore/tcell/terminfo/d/d200 +github.com/gdamore/tcell/terminfo/d/d210 +github.com/gdamore/tcell/terminfo/d/dtterm github.com/gdamore/tcell/terminfo/dynamic +github.com/gdamore/tcell/terminfo/e/emacs +github.com/gdamore/tcell/terminfo/e/eterm +github.com/gdamore/tcell/terminfo/extended +github.com/gdamore/tcell/terminfo/g/gnome +github.com/gdamore/tcell/terminfo/h/hpterm +github.com/gdamore/tcell/terminfo/h/hz1500 +github.com/gdamore/tcell/terminfo/k/konsole +github.com/gdamore/tcell/terminfo/k/kterm +github.com/gdamore/tcell/terminfo/l/linux +github.com/gdamore/tcell/terminfo/p/pcansi +github.com/gdamore/tcell/terminfo/r/rxvt +github.com/gdamore/tcell/terminfo/s/screen +github.com/gdamore/tcell/terminfo/s/simpleterm +github.com/gdamore/tcell/terminfo/s/sun +github.com/gdamore/tcell/terminfo/t/termite +github.com/gdamore/tcell/terminfo/t/tvi910 +github.com/gdamore/tcell/terminfo/t/tvi912 +github.com/gdamore/tcell/terminfo/t/tvi921 +github.com/gdamore/tcell/terminfo/t/tvi925 +github.com/gdamore/tcell/terminfo/t/tvi950 +github.com/gdamore/tcell/terminfo/t/tvi970 +github.com/gdamore/tcell/terminfo/v/vt100 +github.com/gdamore/tcell/terminfo/v/vt102 +github.com/gdamore/tcell/terminfo/v/vt220 +github.com/gdamore/tcell/terminfo/v/vt320 +github.com/gdamore/tcell/terminfo/v/vt400 +github.com/gdamore/tcell/terminfo/v/vt420 +github.com/gdamore/tcell/terminfo/v/vt52 +github.com/gdamore/tcell/terminfo/w/wy50 +github.com/gdamore/tcell/terminfo/w/wy60 +github.com/gdamore/tcell/terminfo/w/wy99_ansi +github.com/gdamore/tcell/terminfo/x/xfce +github.com/gdamore/tcell/terminfo/x/xnuppc +github.com/gdamore/tcell/terminfo/x/xterm # github.com/go-ole/go-ole v1.2.4 github.com/go-ole/go-ole github.com/go-ole/go-ole/oleutil # github.com/godbus/dbus v5.0.1+incompatible github.com/godbus/dbus -# github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d +# github.com/gogo/protobuf v1.3.0 github.com/gogo/protobuf/proto github.com/gogo/protobuf/sortkeys -# github.com/golang/protobuf v1.3.1 +# github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 +github.com/golang/groupcache/lru +# github.com/golang/protobuf v1.3.2 github.com/golang/protobuf/proto -github.com/golang/protobuf/ptypes/any github.com/golang/protobuf/ptypes +github.com/golang/protobuf/ptypes/any github.com/golang/protobuf/ptypes/duration github.com/golang/protobuf/ptypes/timestamp # github.com/google/go-github/v26 v26.0.9 @@ -87,14 +172,22 @@ github.com/google/go-github/v26/github github.com/google/go-querystring/query # github.com/google/gofuzz v1.0.0 github.com/google/gofuzz +# github.com/googleapis/gax-go/v2 v2.0.5 +github.com/googleapis/gax-go/v2 # github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d github.com/googleapis/gnostic/OpenAPIv2 github.com/googleapis/gnostic/compiler github.com/googleapis/gnostic/extensions +# github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8 +github.com/gophercloud/gophercloud +github.com/gophercloud/gophercloud/openstack +github.com/gophercloud/gophercloud/openstack/identity/v2/tenants +github.com/gophercloud/gophercloud/openstack/identity/v2/tokens +github.com/gophercloud/gophercloud/openstack/identity/v3/tokens +github.com/gophercloud/gophercloud/openstack/utils +github.com/gophercloud/gophercloud/pagination # github.com/hashicorp/go-cleanhttp v0.5.1 github.com/hashicorp/go-cleanhttp -# github.com/hashicorp/golang-lru v0.5.1 -github.com/hashicorp/golang-lru/simplelru # github.com/hekmon/cunits v2.0.1+incompatible github.com/hekmon/cunits # github.com/hekmon/transmissionrpc v0.0.0-20190525133028-1d589625bacd @@ -103,7 +196,7 @@ github.com/hekmon/transmissionrpc github.com/imdario/mergo # github.com/jessevdk/go-flags v1.4.0 github.com/jessevdk/go-flags -# github.com/json-iterator/go v1.1.6 +# github.com/json-iterator/go v1.1.7 github.com/json-iterator/go # github.com/logrusorgru/aurora v0.0.0-20190428105938-cea283e61946 github.com/logrusorgru/aurora @@ -125,6 +218,8 @@ github.com/modern-go/concurrent github.com/modern-go/reflect2 # github.com/olebedev/config v0.0.0-20190528211619-364964f3a8e4 github.com/olebedev/config +# github.com/opencontainers/go-digest v1.0.0-rc1 +github.com/opencontainers/go-digest # github.com/pkg/errors v0.8.1 github.com/pkg/errors # github.com/pkg/profile v1.3.0 @@ -133,19 +228,19 @@ github.com/pkg/profile github.com/pmezard/go-difflib/difflib # github.com/radovskyb/watcher v1.0.6 github.com/radovskyb/watcher -# github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4 +# github.com/rivo/tview v0.0.0-20190829161255-f8bc69b90341 github.com/rivo/tview # github.com/rivo/uniseg v0.1.0 github.com/rivo/uniseg # github.com/shirou/gopsutil v2.18.12+incompatible github.com/shirou/gopsutil/cpu -github.com/shirou/gopsutil/mem github.com/shirou/gopsutil/internal/common +github.com/shirou/gopsutil/mem # github.com/spf13/pflag v1.0.3 github.com/spf13/pflag # github.com/sticreations/spotigopher v0.0.0-20181009182052-98632f6f94b0 github.com/sticreations/spotigopher/spotigopher -# github.com/stretchr/testify v1.3.0 +# github.com/stretchr/testify v1.4.0 github.com/stretchr/testify/assert # github.com/xanzy/go-gitlab v0.18.0 github.com/xanzy/go-gitlab @@ -155,109 +250,114 @@ github.com/yfronto/newrelic github.com/zmb3/spotify # github.com/zorkian/go-datadog-api v2.21.0+incompatible github.com/zorkian/go-datadog-api -# go.opencensus.io v0.22.0 +# go.opencensus.io v0.22.1 +go.opencensus.io +go.opencensus.io/internal +go.opencensus.io/internal/tagencoding +go.opencensus.io/metric/metricdata +go.opencensus.io/metric/metricproducer go.opencensus.io/plugin/ochttp go.opencensus.io/plugin/ochttp/propagation/b3 +go.opencensus.io/resource go.opencensus.io/stats +go.opencensus.io/stats/internal go.opencensus.io/stats/view go.opencensus.io/tag go.opencensus.io/trace -go.opencensus.io/trace/propagation -go.opencensus.io/metric/metricdata -go.opencensus.io/stats/internal -go.opencensus.io/internal/tagencoding -go.opencensus.io/metric/metricproducer -go.opencensus.io/internal go.opencensus.io/trace/internal +go.opencensus.io/trace/propagation go.opencensus.io/trace/tracestate -go.opencensus.io/resource -go.opencensus.io -# golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 +# golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472 +golang.org/x/crypto/cast5 golang.org/x/crypto/openpgp -golang.org/x/crypto/ssh/terminal golang.org/x/crypto/openpgp/armor +golang.org/x/crypto/openpgp/elgamal golang.org/x/crypto/openpgp/errors golang.org/x/crypto/openpgp/packet golang.org/x/crypto/openpgp/s2k -golang.org/x/crypto/cast5 -golang.org/x/crypto/openpgp/elgamal -# golang.org/x/net v0.0.0-20190628185345-da137c7871d7 -golang.org/x/net/html -golang.org/x/net/html/charset -golang.org/x/net/context/ctxhttp +golang.org/x/crypto/ssh/terminal +# golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 golang.org/x/net/context -golang.org/x/net/http2 +golang.org/x/net/context/ctxhttp +golang.org/x/net/html golang.org/x/net/html/atom -golang.org/x/net/trace +golang.org/x/net/html/charset golang.org/x/net/http/httpguts +golang.org/x/net/http2 golang.org/x/net/http2/hpack golang.org/x/net/idna +golang.org/x/net/internal/socks golang.org/x/net/internal/timeseries +golang.org/x/net/proxy +golang.org/x/net/trace # golang.org/x/oauth2 v0.0.0-20190614102709-0f29369cfe45 golang.org/x/oauth2 golang.org/x/oauth2/google golang.org/x/oauth2/internal golang.org/x/oauth2/jws golang.org/x/oauth2/jwt -# golang.org/x/sys v0.0.0-20190730174312-6a60838ec25 +# golang.org/x/sys v0.0.0-20190902133755-9109b7679e13 golang.org/x/sys/unix golang.org/x/sys/windows # golang.org/x/text v0.3.2 golang.org/x/text/encoding -golang.org/x/text/transform -golang.org/x/text/encoding/internal/identifier golang.org/x/text/encoding/charmap golang.org/x/text/encoding/htmlindex golang.org/x/text/encoding/internal +golang.org/x/text/encoding/internal/identifier golang.org/x/text/encoding/japanese golang.org/x/text/encoding/korean golang.org/x/text/encoding/simplifiedchinese golang.org/x/text/encoding/traditionalchinese golang.org/x/text/encoding/unicode -golang.org/x/text/language -golang.org/x/text/secure/bidirule -golang.org/x/text/unicode/bidi -golang.org/x/text/unicode/norm -golang.org/x/text/internal/utf8internal -golang.org/x/text/runes golang.org/x/text/internal/language golang.org/x/text/internal/language/compact golang.org/x/text/internal/tag -# golang.org/x/time v0.0.0-20181108054448-85acf8d2951c +golang.org/x/text/internal/utf8internal +golang.org/x/text/language +golang.org/x/text/runes +golang.org/x/text/secure/bidirule +golang.org/x/text/transform +golang.org/x/text/unicode/bidi +golang.org/x/text/unicode/norm +# golang.org/x/time v0.0.0-20190513212739-9d24e82272b4 golang.org/x/time/rate -# google.golang.org/api v0.7.0 -google.golang.org/api/calendar/v3 +# google.golang.org/api v0.9.0 +google.golang.org/api/analytics/v3 google.golang.org/api/analyticsreporting/v4 -google.golang.org/api/sheets/v4 +google.golang.org/api/calendar/v3 google.golang.org/api/gensupport google.golang.org/api/googleapi -google.golang.org/api/option -google.golang.org/api/transport/http google.golang.org/api/googleapi/internal/uritemplates -google.golang.org/api/internal google.golang.org/api/googleapi/transport +google.golang.org/api/internal +google.golang.org/api/option +google.golang.org/api/sheets/v4 +google.golang.org/api/transport/http google.golang.org/api/transport/http/internal/propagation -# google.golang.org/appengine v1.6.1 +# google.golang.org/appengine v1.6.2 google.golang.org/appengine -google.golang.org/appengine/urlfetch google.golang.org/appengine/internal google.golang.org/appengine/internal/app_identity -google.golang.org/appengine/internal/modules -google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/internal/base google.golang.org/appengine/internal/datastore google.golang.org/appengine/internal/log +google.golang.org/appengine/internal/modules google.golang.org/appengine/internal/remote_api -# google.golang.org/genproto v0.0.0-20190627203621-eb59cef1c072 +google.golang.org/appengine/internal/urlfetch +google.golang.org/appengine/urlfetch +# google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 google.golang.org/genproto/googleapis/rpc/status -# google.golang.org/grpc v1.21.1 +# google.golang.org/grpc v1.23.0 google.golang.org/grpc -google.golang.org/grpc/naming google.golang.org/grpc/balancer +google.golang.org/grpc/balancer/base google.golang.org/grpc/balancer/roundrobin +google.golang.org/grpc/binarylog/grpc_binarylog_v1 google.golang.org/grpc/codes google.golang.org/grpc/connectivity google.golang.org/grpc/credentials +google.golang.org/grpc/credentials/internal google.golang.org/grpc/encoding google.golang.org/grpc/encoding/proto google.golang.org/grpc/grpclog @@ -269,20 +369,19 @@ google.golang.org/grpc/internal/channelz google.golang.org/grpc/internal/envconfig google.golang.org/grpc/internal/grpcrand google.golang.org/grpc/internal/grpcsync +google.golang.org/grpc/internal/syscall google.golang.org/grpc/internal/transport google.golang.org/grpc/keepalive google.golang.org/grpc/metadata +google.golang.org/grpc/naming google.golang.org/grpc/peer google.golang.org/grpc/resolver google.golang.org/grpc/resolver/dns google.golang.org/grpc/resolver/passthrough +google.golang.org/grpc/serviceconfig google.golang.org/grpc/stats google.golang.org/grpc/status google.golang.org/grpc/tap -google.golang.org/grpc/balancer/base -google.golang.org/grpc/credentials/internal -google.golang.org/grpc/binarylog/grpc_binarylog_v1 -google.golang.org/grpc/internal/syscall # gopkg.in/inf.v0 v0.9.0 gopkg.in/inf.v0 # gopkg.in/yaml.v2 v2.2.2 @@ -290,7 +389,6 @@ gopkg.in/yaml.v2 # k8s.io/api v0.0.0-20190620084959-7cf5895f2711 k8s.io/api/admissionregistration/v1beta1 k8s.io/api/apps/v1 -k8s.io/api/autoscaling/v1 k8s.io/api/apps/v1beta1 k8s.io/api/apps/v1beta2 k8s.io/api/auditregistration/v1alpha1 @@ -298,6 +396,7 @@ k8s.io/api/authentication/v1 k8s.io/api/authentication/v1beta1 k8s.io/api/authorization/v1 k8s.io/api/authorization/v1beta1 +k8s.io/api/autoscaling/v1 k8s.io/api/autoscaling/v2beta1 k8s.io/api/autoscaling/v2beta2 k8s.io/api/batch/v1 @@ -307,13 +406,13 @@ k8s.io/api/certificates/v1beta1 k8s.io/api/coordination/v1 k8s.io/api/coordination/v1beta1 k8s.io/api/core/v1 -k8s.io/api/policy/v1beta1 k8s.io/api/events/v1beta1 k8s.io/api/extensions/v1beta1 k8s.io/api/networking/v1 k8s.io/api/networking/v1beta1 k8s.io/api/node/v1alpha1 k8s.io/api/node/v1beta1 +k8s.io/api/policy/v1beta1 k8s.io/api/rbac/v1 k8s.io/api/rbac/v1alpha1 k8s.io/api/rbac/v1beta1 @@ -325,44 +424,44 @@ k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 # k8s.io/apimachinery v0.0.0-20190802060556-6fa4771c83b3 -k8s.io/apimachinery/pkg/apis/meta/v1 +k8s.io/apimachinery/pkg/api/errors +k8s.io/apimachinery/pkg/api/meta k8s.io/apimachinery/pkg/api/resource +k8s.io/apimachinery/pkg/apis/meta/v1 +k8s.io/apimachinery/pkg/apis/meta/v1/unstructured k8s.io/apimachinery/pkg/conversion +k8s.io/apimachinery/pkg/conversion/queryparams k8s.io/apimachinery/pkg/fields k8s.io/apimachinery/pkg/labels k8s.io/apimachinery/pkg/runtime k8s.io/apimachinery/pkg/runtime/schema +k8s.io/apimachinery/pkg/runtime/serializer +k8s.io/apimachinery/pkg/runtime/serializer/json +k8s.io/apimachinery/pkg/runtime/serializer/protobuf +k8s.io/apimachinery/pkg/runtime/serializer/recognizer +k8s.io/apimachinery/pkg/runtime/serializer/streaming +k8s.io/apimachinery/pkg/runtime/serializer/versioning k8s.io/apimachinery/pkg/selection k8s.io/apimachinery/pkg/types -k8s.io/apimachinery/pkg/util/intstr -k8s.io/apimachinery/pkg/util/runtime -k8s.io/apimachinery/pkg/watch +k8s.io/apimachinery/pkg/util/clock k8s.io/apimachinery/pkg/util/errors -k8s.io/apimachinery/pkg/util/validation -k8s.io/apimachinery/third_party/forked/golang/reflect -k8s.io/apimachinery/pkg/util/sets -k8s.io/apimachinery/pkg/conversion/queryparams +k8s.io/apimachinery/pkg/util/framer +k8s.io/apimachinery/pkg/util/intstr k8s.io/apimachinery/pkg/util/json k8s.io/apimachinery/pkg/util/naming k8s.io/apimachinery/pkg/util/net -k8s.io/apimachinery/pkg/api/errors -k8s.io/apimachinery/pkg/runtime/serializer -k8s.io/apimachinery/pkg/version -k8s.io/apimachinery/pkg/runtime/serializer/streaming -k8s.io/apimachinery/pkg/util/clock +k8s.io/apimachinery/pkg/util/runtime +k8s.io/apimachinery/pkg/util/sets +k8s.io/apimachinery/pkg/util/validation k8s.io/apimachinery/pkg/util/validation/field -k8s.io/apimachinery/pkg/runtime/serializer/json -k8s.io/apimachinery/pkg/runtime/serializer/versioning -k8s.io/apimachinery/pkg/runtime/serializer/protobuf -k8s.io/apimachinery/pkg/runtime/serializer/recognizer -k8s.io/apimachinery/pkg/api/meta -k8s.io/apimachinery/pkg/util/framer k8s.io/apimachinery/pkg/util/yaml -k8s.io/apimachinery/pkg/apis/meta/v1/unstructured +k8s.io/apimachinery/pkg/version +k8s.io/apimachinery/pkg/watch +k8s.io/apimachinery/third_party/forked/golang/reflect # k8s.io/client-go v12.0.0+incompatible -k8s.io/client-go/kubernetes -k8s.io/client-go/tools/clientcmd k8s.io/client-go/discovery +k8s.io/client-go/kubernetes +k8s.io/client-go/kubernetes/scheme k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1 k8s.io/client-go/kubernetes/typed/apps/v1 k8s.io/client-go/kubernetes/typed/apps/v1beta1 @@ -399,25 +498,32 @@ k8s.io/client-go/kubernetes/typed/settings/v1alpha1 k8s.io/client-go/kubernetes/typed/storage/v1 k8s.io/client-go/kubernetes/typed/storage/v1alpha1 k8s.io/client-go/kubernetes/typed/storage/v1beta1 -k8s.io/client-go/rest -k8s.io/client-go/util/flowcontrol -k8s.io/client-go/tools/auth -k8s.io/client-go/tools/clientcmd/api -k8s.io/client-go/tools/clientcmd/api/latest -k8s.io/client-go/util/homedir -k8s.io/client-go/kubernetes/scheme -k8s.io/client-go/tools/reference -k8s.io/client-go/pkg/version -k8s.io/client-go/plugin/pkg/client/auth/exec -k8s.io/client-go/rest/watch -k8s.io/client-go/tools/metrics -k8s.io/client-go/transport -k8s.io/client-go/util/cert -k8s.io/client-go/tools/clientcmd/api/v1 k8s.io/client-go/pkg/apis/clientauthentication k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1 k8s.io/client-go/pkg/apis/clientauthentication/v1beta1 +k8s.io/client-go/pkg/version +k8s.io/client-go/plugin/pkg/client/auth +k8s.io/client-go/plugin/pkg/client/auth/azure +k8s.io/client-go/plugin/pkg/client/auth/exec +k8s.io/client-go/plugin/pkg/client/auth/gcp +k8s.io/client-go/plugin/pkg/client/auth/oidc +k8s.io/client-go/plugin/pkg/client/auth/openstack +k8s.io/client-go/rest +k8s.io/client-go/rest/watch +k8s.io/client-go/third_party/forked/golang/template +k8s.io/client-go/tools/auth +k8s.io/client-go/tools/clientcmd +k8s.io/client-go/tools/clientcmd/api +k8s.io/client-go/tools/clientcmd/api/latest +k8s.io/client-go/tools/clientcmd/api/v1 +k8s.io/client-go/tools/metrics +k8s.io/client-go/tools/reference +k8s.io/client-go/transport +k8s.io/client-go/util/cert k8s.io/client-go/util/connrotation +k8s.io/client-go/util/flowcontrol +k8s.io/client-go/util/homedir +k8s.io/client-go/util/jsonpath k8s.io/client-go/util/keyutil # k8s.io/klog v0.3.1 k8s.io/klog