├── prometheus.yaml ├── docs ├── img │ ├── demo │ │ ├── rgb.gif │ │ ├── bitmap.gif │ │ └── grayscale.png │ └── rgb_grafana.png ├── jukebox.md └── renderer.md ├── .bingo ├── go.mod ├── bingo.mod ├── jb.mod ├── jsonnet.mod ├── jsonnetfmt.mod ├── .gitignore ├── jsonnet-lint.mod ├── grafana-image-renderer-cli.mod ├── promtool.mod ├── variables.env ├── README.md └── Variables.mk ├── grafana ├── lib │ ├── targets_grayscale.libsonnet │ ├── timeseries_overrides_grayscale.libsonnet │ ├── targets_rgb.libsonnet │ ├── timeseries_overrides_rgb.libsonnet │ ├── prometheus_video_renderer.libsonnet │ ├── prometheus_video_renderer_8.libsonnet │ └── prometheus_video_renderer_8_audio.libsonnet ├── datasources.yaml ├── jsonnetfile.json ├── dashboards.yaml ├── jsonnetfile.lock.json ├── dashboards.jsonnet └── dashboards │ └── prometheus-video-renderer.json ├── scripts ├── load.ps1 ├── prom_record.ahk └── load.sh ├── go.mod ├── .gitignore ├── Makefile ├── pkg └── backfiller │ └── backfiller.go ├── docker-compose.yaml ├── README.md ├── cmd ├── prometheus_video_renderer │ └── main.go └── prometheus_jukebox │ └── main.go ├── LICENSE └── go.sum /prometheus.yaml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/img/demo/rgb.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MacroPower/prometheus_video_renderer/HEAD/docs/img/demo/rgb.gif -------------------------------------------------------------------------------- /docs/img/demo/bitmap.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MacroPower/prometheus_video_renderer/HEAD/docs/img/demo/bitmap.gif -------------------------------------------------------------------------------- /docs/img/rgb_grafana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MacroPower/prometheus_video_renderer/HEAD/docs/img/rgb_grafana.png -------------------------------------------------------------------------------- /docs/img/demo/grayscale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MacroPower/prometheus_video_renderer/HEAD/docs/img/demo/grayscale.png -------------------------------------------------------------------------------- /.bingo/go.mod: -------------------------------------------------------------------------------- 1 | module _ // Fake go.mod auto-created by 'bingo' for go -moddir compatibility with non-Go projects. Commit this file, together with other .mod files. -------------------------------------------------------------------------------- /.bingo/bingo.mod: -------------------------------------------------------------------------------- 1 | module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT 2 | 3 | go 1.16 4 | 5 | require github.com/bwplotka/bingo v0.4.3 6 | -------------------------------------------------------------------------------- /.bingo/jb.mod: -------------------------------------------------------------------------------- 1 | module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT 2 | 3 | go 1.16 4 | 5 | require github.com/jsonnet-bundler/jsonnet-bundler v0.4.0 // cmd/jb 6 | -------------------------------------------------------------------------------- /.bingo/jsonnet.mod: -------------------------------------------------------------------------------- 1 | module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT 2 | 3 | go 1.16 4 | 5 | require github.com/google/go-jsonnet v0.17.0 // cmd/jsonnet 6 | -------------------------------------------------------------------------------- /.bingo/jsonnetfmt.mod: -------------------------------------------------------------------------------- 1 | module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT 2 | 3 | go 1.16 4 | 5 | require github.com/google/go-jsonnet v0.17.0 // cmd/jsonnetfmt 6 | -------------------------------------------------------------------------------- /.bingo/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Ignore everything 3 | * 4 | 5 | # But not these files: 6 | !.gitignore 7 | !*.mod 8 | !README.md 9 | !Variables.mk 10 | !variables.env 11 | 12 | *tmp.mod 13 | -------------------------------------------------------------------------------- /.bingo/jsonnet-lint.mod: -------------------------------------------------------------------------------- 1 | module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT 2 | 3 | go 1.16 4 | 5 | require github.com/google/go-jsonnet v0.17.0 // cmd/jsonnet-lint 6 | -------------------------------------------------------------------------------- /grafana/lib/targets_grayscale.libsonnet: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | expr: 'y', 4 | format: 'time_series', 5 | intervalFactor: 1, 6 | legendFormat: 'y{{l}}', 7 | refId: 'A', 8 | }, 9 | ] 10 | -------------------------------------------------------------------------------- /scripts/load.ps1: -------------------------------------------------------------------------------- 1 | $project = "bad_apple" 2 | 3 | Get-ChildItem ".\metrics\$project\" | ForEach-Object { 4 | Write-Host "Loading $_" 5 | promtool tsdb create-blocks-from openmetrics $_.FullName 6 | } 7 | -------------------------------------------------------------------------------- /.bingo/grafana-image-renderer-cli.mod: -------------------------------------------------------------------------------- 1 | module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT 2 | 3 | go 1.16 4 | 5 | require github.com/MacroPower/grafana-image-renderer-sdk-go v0.0.2 // cmd/grafana-image-renderer-cli 6 | -------------------------------------------------------------------------------- /grafana/datasources.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | datasources: 4 | - name: Prometheus 5 | type: prometheus 6 | access: proxy 7 | orgId: 1 8 | uid: UZMX8ZeGz 9 | url: http://prometheus:9090 10 | version: 1 11 | editable: false 12 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/MacroPower/prometheus_video_renderer 2 | 3 | go 1.16 4 | 5 | require ( 6 | github.com/faiface/beep v1.0.2 7 | github.com/go-kit/kit v0.10.0 // indirect 8 | github.com/prometheus/client_golang v1.10.0 9 | github.com/prometheus/common v0.27.0 10 | github.com/youpy/go-wav v0.1.0 11 | ) 12 | -------------------------------------------------------------------------------- /grafana/jsonnetfile.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "dependencies": [ 4 | { 5 | "source": { 6 | "git": { 7 | "remote": "https://github.com/grafana/grafonnet-lib", 8 | "subdir": "grafonnet" 9 | } 10 | }, 11 | "version": "master" 12 | } 13 | ], 14 | "legacyImports": false 15 | } 16 | -------------------------------------------------------------------------------- /grafana/dashboards.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: 'prometheus-video-renderer' 5 | orgId: 1 6 | folder: '' 7 | folderUid: '' 8 | type: file 9 | disableDeletion: false 10 | updateIntervalSeconds: 10 11 | allowUiUpdates: false 12 | options: 13 | path: /etc/dashboards 14 | foldersFromFilesStructure: false 15 | -------------------------------------------------------------------------------- /.bingo/promtool.mod: -------------------------------------------------------------------------------- 1 | module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT 2 | 3 | go 1.16 4 | 5 | replace k8s.io/klog => github.com/simonpasquier/klog-gokit v0.3.0 6 | 7 | replace k8s.io/klog/v2 => github.com/simonpasquier/klog-gokit/v2 v2.1.0 8 | 9 | require github.com/prometheus/prometheus v1.8.2-0.20210701133801-b0944590a1c9 // cmd/promtool 10 | -------------------------------------------------------------------------------- /grafana/lib/timeseries_overrides_grayscale.libsonnet: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | matcher: { 4 | id: 'byName', 5 | options: 'y%s' % l, 6 | }, 7 | properties: [ 8 | { 9 | id: 'color', 10 | value: { 11 | fixedColor: 'rgba(%s, %s, %s, 1)' % [l, l, l], 12 | mode: 'fixed', 13 | }, 14 | }, 15 | ], 16 | } 17 | for l in std.range(0, 255) 18 | ] 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | 14 | # Dependency directories (remove the comment below to include it) 15 | vendor/ 16 | 17 | # Working data 18 | data/ 19 | metrics/ 20 | frames/ 21 | videos/ 22 | -------------------------------------------------------------------------------- /scripts/prom_record.ahk: -------------------------------------------------------------------------------- 1 | #NoEnv 2 | #Persistent 3 | #SingleInstance, force 4 | 5 | SetMouseDelay, 10 6 | SendMode, event 7 | 8 | f12:: 9 | clicktoggle := !clicktoggle 10 | 11 | if (!clicktoggle) 12 | { 13 | SetTimer, startclick, off 14 | return 15 | } 16 | 17 | startclick: 18 | click 19 | sleep 500 20 | click 21 | sleep 500 22 | send, {p} 23 | sleep 500 24 | SetTimer, startclick, -500 25 | return 26 | -------------------------------------------------------------------------------- /grafana/jsonnetfile.lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "dependencies": [ 4 | { 5 | "source": { 6 | "git": { 7 | "remote": "https://github.com/grafana/grafonnet-lib.git", 8 | "subdir": "grafonnet" 9 | } 10 | }, 11 | "version": "3082bfca110166cd69533fa3c0875fdb1b68c329", 12 | "sum": "4/sUV0Kk+o8I+wlYxL9R6EPhL/NiLfYHk+NXlU64RUk=" 13 | } 14 | ], 15 | "legacyImports": false 16 | } 17 | -------------------------------------------------------------------------------- /scripts/load.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 4 | # Usage: 5 | # scripts/load.sh bad_apple 6 | # 7 | 8 | set -eu 9 | 10 | source .bingo/variables.env 11 | 12 | project=$1 13 | 14 | if [[ ! -d metrics/$project ]]; then 15 | echo "No project found in metrics/$project" 16 | fi 17 | 18 | for file in metrics/$project/*; do 19 | filename=$(basename $file) 20 | echo "Loading $filename" 21 | $PROMTOOL tsdb create-blocks-from openmetrics "metrics/$project/$filename" 22 | done 23 | -------------------------------------------------------------------------------- /grafana/lib/targets_rgb.libsonnet: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | expr: 'r', 4 | format: 'time_series', 5 | intervalFactor: 1, 6 | legendFormat: 'r{{l}}', 7 | refId: 'A', 8 | }, 9 | { 10 | expr: 'g', 11 | format: 'time_series', 12 | intervalFactor: 1, 13 | legendFormat: 'g{{l}}', 14 | refId: 'B', 15 | }, 16 | { 17 | expr: 'b', 18 | format: 'time_series', 19 | intervalFactor: 1, 20 | legendFormat: 'b{{l}}', 21 | refId: 'C', 22 | }, 23 | ] 24 | -------------------------------------------------------------------------------- /.bingo/variables.env: -------------------------------------------------------------------------------- 1 | # Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.4.3. DO NOT EDIT. 2 | # All tools are designed to be build inside $GOBIN. 3 | # Those variables will work only until 'bingo get' was invoked, or if tools were installed via Makefile's Variables.mk. 4 | GOBIN=${GOBIN:=$(go env GOBIN)} 5 | 6 | if [ -z "$GOBIN" ]; then 7 | GOBIN="$(go env GOPATH)/bin" 8 | fi 9 | 10 | 11 | BINGO="${GOBIN}/bingo-v0.4.3" 12 | 13 | GRAFANA_IMAGE_RENDERER_CLI="${GOBIN}/grafana-image-renderer-cli-v0.0.2" 14 | 15 | JB="${GOBIN}/jb-v0.4.0" 16 | 17 | JSONNET_LINT="${GOBIN}/jsonnet-lint-v0.17.0" 18 | 19 | JSONNET="${GOBIN}/jsonnet-v0.17.0" 20 | 21 | JSONNETFMT="${GOBIN}/jsonnetfmt-v0.17.0" 22 | 23 | PROMTOOL="${GOBIN}/promtool-v1.8.2-0.20210701133801-b0944590a1c9" 24 | 25 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | include .bingo/Variables.mk 2 | 3 | JSONNET_VENDOR_DIR ?= grafana/vendor 4 | 5 | JSONNETFMT_CMD := $(JSONNETFMT) -n 2 --max-blank-lines 2 --string-style s --comment-style s 6 | 7 | .PHONY: jsonnet-format 8 | jsonnet-format: $(JSONNETFMT) 9 | find . -name 'vendor' -prune -o -name '*.libsonnet' -print -o -name '*.jsonnet' -print | \ 10 | xargs -n 1 -- $(JSONNETFMT_CMD) -i 11 | 12 | .PHONY: jsonnet-lint 13 | jsonnet-lint: $(JSONNET_LINT) ${JSONNET_VENDOR_DIR} 14 | find . -name 'vendor' -prune -o -name '*.libsonnet' -print -o -name '*.jsonnet' -print | \ 15 | xargs -n 1 -- $(JSONNET_LINT) -J ${JSONNET_VENDOR_DIR} 16 | 17 | .PHONY: dashboards 18 | dashboards: $(JSONNET) 19 | -rm -rf grafana/dashboards/* 20 | $(JSONNET) -J ${JSONNET_VENDOR_DIR} -m grafana/dashboards grafana/dashboards.jsonnet 21 | -------------------------------------------------------------------------------- /.bingo/README.md: -------------------------------------------------------------------------------- 1 | # Project Development Dependencies. 2 | 3 | This is directory which stores Go modules with pinned buildable package that is used within this repository, managed by https://github.com/bwplotka/bingo. 4 | 5 | * Run `bingo get` to install all tools having each own module file in this directory. 6 | * Run `bingo get ` to install that have own module file in this directory. 7 | * For Makefile: Make sure to put `include .bingo/Variables.mk` in your Makefile, then use $() variable where is the .bingo/.mod. 8 | * For shell: Run `source .bingo/variables.env` to source all environment variable for each tool. 9 | * For go: Import `.bingo/variables.go` to for variable names. 10 | * See https://github.com/bwplotka/bingo or -h on how to add, remove or change binaries dependencies. 11 | 12 | ## Requirements 13 | 14 | * Go 1.14+ 15 | -------------------------------------------------------------------------------- /grafana/lib/timeseries_overrides_rgb.libsonnet: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | matcher: { 4 | id: 'byName', 5 | options: 'r%s' % l, 6 | }, 7 | properties: [ 8 | { 9 | id: 'color', 10 | value: { 11 | fixedColor: 'rgba(%s, 0, 0, 1)' % l, 12 | mode: 'fixed', 13 | }, 14 | }, 15 | ], 16 | } 17 | for l in std.range(0, 255) 18 | ] + [ 19 | { 20 | matcher: { 21 | id: 'byName', 22 | options: 'g%s' % l, 23 | }, 24 | properties: [ 25 | { 26 | id: 'color', 27 | value: { 28 | fixedColor: 'rgba(0, %s, 0, 1)' % l, 29 | mode: 'fixed', 30 | }, 31 | }, 32 | ], 33 | } 34 | for l in std.range(0, 255) 35 | ] + [ 36 | { 37 | matcher: { 38 | id: 'byName', 39 | options: 'b%s' % l, 40 | }, 41 | properties: [ 42 | { 43 | id: 'color', 44 | value: { 45 | fixedColor: 'rgba(0, 0, %s, 1)' % (l * 2), 46 | mode: 'fixed', 47 | }, 48 | }, 49 | ], 50 | } 51 | for l in std.range(0, 127) 52 | ] 53 | -------------------------------------------------------------------------------- /pkg/backfiller/backfiller.go: -------------------------------------------------------------------------------- 1 | // Backfiller assists with backfilling via promtool. 2 | package backfiller 3 | 4 | import ( 5 | "bytes" 6 | "fmt" 7 | "time" 8 | 9 | "github.com/youpy/go-wav" 10 | ) 11 | 12 | func Help(metric string) string { 13 | return fmt.Sprintf("# HELP %s The metric.\n# TYPE %s gauge\n", metric, metric) 14 | } 15 | 16 | func WriteHelp(b *bytes.Buffer, metric ...string) { 17 | if b.Len() == 0 { 18 | for _, m := range metric { 19 | b.WriteString(fmt.Sprintf("# HELP %s The metric.\n# TYPE %s gauge\n", m, m)) 20 | } 21 | } 22 | } 23 | 24 | func FromUnixMs(ms int64) time.Time { 25 | return time.Unix(ms/int64(1000), (ms%int64(1000))*int64(1000000)) 26 | } 27 | 28 | func WriteWaveSample(b *bytes.Buffer, t time.Time, trackName string, sample wav.Sample, value int, format *wav.WavFormat) { 29 | WriteHelp(b, trackName) 30 | 31 | b.WriteString( 32 | fmt.Sprintf( 33 | `%s{audio_format="%d",bits_per_sample="%d",block_align="%d",byte_rate="%d",sample_rate="%d"} %d %d%s`, 34 | trackName, 35 | format.AudioFormat, 36 | format.BitsPerSample, 37 | format.BlockAlign, 38 | format.ByteRate, 39 | format.SampleRate, 40 | value, 41 | t.Unix(), 42 | "\n", 43 | ), 44 | ) 45 | } 46 | 47 | func WriteEnd(b *bytes.Buffer) { 48 | b.WriteString("# EOF") 49 | } 50 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | networks: 4 | prometheus-video-renderer: 5 | 6 | services: 7 | prometheus: 8 | image: prom/prometheus:v2.27.0 9 | ports: 10 | - 9090:9090 11 | volumes: 12 | - ./data:/prometheus 13 | - ./prometheus.yaml:/etc/prometheus/prometheus.yaml 14 | command: 15 | - '--config.file=/etc/prometheus/prometheus.yaml' 16 | - '--storage.tsdb.path=/prometheus' 17 | - '--storage.tsdb.retention.time=20y' 18 | - '--storage.tsdb.allow-overlapping-blocks' 19 | - '--query.lookback-delta=1s' 20 | networks: 21 | - prometheus-video-renderer 22 | 23 | grafana: 24 | image: grafana/grafana:8.0.1 25 | ports: 26 | - 3000:3000 27 | volumes: 28 | - ./grafana/dashboards:/etc/dashboards 29 | - ./grafana/dashboards.yaml:/etc/grafana/provisioning/dashboards/dashboards.yaml 30 | - ./grafana/datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml 31 | environment: 32 | GF_INSTALL_PLUGINS: grafana-image-renderer 33 | GF_RENDERING_SERVER_URL: http://renderer:8081/render 34 | GF_RENDERING_CALLBACK_URL: http://grafana:3000/ 35 | GF_LOG_FILTERS: rendering:debug 36 | GF_AUTH_ANONYMOUS_ENABLED: 'true' 37 | networks: 38 | - prometheus-video-renderer 39 | 40 | renderer: 41 | image: grafana/grafana-image-renderer:3.0.1 42 | ports: 43 | - 8081:8081 44 | environment: 45 | RENDERING_DUMPIO: 'true' 46 | RENDERING_MODE: clustered 47 | RENDERING_CLUSTERING_MODE: default 48 | RENDERING_CLUSTERING_MAX_CONCURRENCY: 5 49 | networks: 50 | - prometheus-video-renderer 51 | -------------------------------------------------------------------------------- /grafana/dashboards.jsonnet: -------------------------------------------------------------------------------- 1 | local prometheus_video_renderer = import 'lib/prometheus_video_renderer.libsonnet'; 2 | local prometheus_video_renderer_8 = import 'lib/prometheus_video_renderer_8.libsonnet'; 3 | local prometheus_video_renderer_8_audio = import 'lib/prometheus_video_renderer_8_audio.libsonnet'; 4 | 5 | local timeseries_overrides_grayscale = import 'lib/timeseries_overrides_grayscale.libsonnet'; 6 | local timeseries_overrides_rgb = import 'lib/timeseries_overrides_rgb.libsonnet'; 7 | 8 | local targets_grayscale = import 'lib/targets_grayscale.libsonnet'; 9 | local targets_rgb = import 'lib/targets_rgb.libsonnet'; 10 | 11 | { 12 | 'prometheus-video-renderer.json': 13 | prometheus_video_renderer, 14 | 15 | 'prometheus-video-renderer-8.json': 16 | prometheus_video_renderer_8.new( 17 | 'pvr-dash-8-rgb', 18 | 'Prometheus Video Renderer (8.0)', 19 | targets_rgb, 20 | timeseries_overrides_rgb, 21 | ), 22 | 'prometheus-video-renderer-8-grayscale.json': 23 | prometheus_video_renderer_8.new( 24 | 'pvr-dash-8-grayscale', 25 | 'Prometheus Video Renderer (8.0) Grayscale', 26 | targets_grayscale, 27 | timeseries_overrides_grayscale, 28 | ), 29 | 30 | 'prometheus-video-renderer-8-audio.json': 31 | prometheus_video_renderer_8_audio.new( 32 | 'pvr-dash-8-rgb-audio', 33 | 'Prometheus Video Renderer (8.0) +Audio', 34 | targets_rgb, 35 | timeseries_overrides_rgb, 36 | ), 37 | 'prometheus-video-renderer-8-audio-grayscale.json': 38 | prometheus_video_renderer_8_audio.new( 39 | 'pvr-dash-8-grayscale-audio', 40 | 'Prometheus Video Renderer (8.0) Grayscale +Audio', 41 | targets_grayscale, 42 | timeseries_overrides_grayscale, 43 | ), 44 | } 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # prometheus_video_renderer 2 | 3 | Encode media into [Prometheus](https://prometheus.io/) metrics, display/render through the Prometheus UI or [Grafana](https://grafana.com/). 4 | 5 | Works with: PNG, WAV, and PNG sequences (aka Video)! 6 | 7 | ## Modes 8 | 9 | Currently 3 different modes are supported. 10 | 11 | ### Bitmap 12 | 13 | The bitmap mode either creates a sample or does not, depending on the brightness of the source image. It is the only mode compatible with the Prometheus UI. 14 | 15 | ![bitmap-preview](docs/img/demo/bitmap.gif) 16 | 17 | Example: https://www.youtube.com/watch?v=ApJxFprSTqA 18 | 19 | ### Grayscale 20 | 21 | The grayscale mode creates a metric and sets a brightness label matching an override for each unique brightness. 22 | 23 | ![grayscale-preview](docs/img/demo/grayscale.png) 24 | 25 | ### RGB 26 | 27 | The RGB mode creates offset metrics for red, green, and blue, and sets a brightness label matching an override for each unique color/brightness. 28 | 29 | ![rgb-preview](docs/img/demo/rgb.gif) 30 | 31 | Example: https://www.youtube.com/watch?v=aLvh0oId3Go 32 | 33 | ## Audio 34 | 35 | You can store and stream wave files using prometheus_jukebox. 36 | 37 | Example: https://www.youtube.com/watch?v=psk20qGVF10 38 | 39 | ## Inspiration 40 | 41 | A while back I thought [giedrius's blog post on storing ascii art in Prometheus](https://giedrius.blog/2019/09/21/is-it-a-good-idea-to-use-prometheus-for-storing-ascii-paintings/) and the corresponding [source code](https://github.com/GiedriusS/prometheuspainter) were really fun. After seeing some of [kevinjycui](https://github.com/kevinjycui/bad-apple)'s bad apple videos I thought combining these two ideas could be an interesting (and hilariously terrible) idea! 42 | 43 | ## Installation / Usage 44 | 45 | See docs on the [renderer](docs/renderer.md) and [jukebox](docs/jukebox.md). 46 | -------------------------------------------------------------------------------- /grafana/lib/prometheus_video_renderer.libsonnet: -------------------------------------------------------------------------------- 1 | local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet'; 2 | local dashboard = grafana.dashboard; 3 | local graphPanel = grafana.graphPanel; 4 | local prometheus = grafana.prometheus; 5 | local videoHeight = 100; 6 | 7 | local videoPanel = 8 | graphPanel.new( 9 | 'Video', 10 | min=0, 11 | max=videoHeight * 3, 12 | fill=0, 13 | linewidth=2, 14 | interval='1s', 15 | transparent=false, 16 | legend_show=false, 17 | shared_tooltip=false, 18 | datasource='Prometheus', 19 | ) 20 | .addTarget( 21 | prometheus.target( 22 | 'r', 23 | legendFormat='r{{l}}', 24 | intervalFactor=1, 25 | ) 26 | ) 27 | .addTarget( 28 | prometheus.target( 29 | 'g', 30 | legendFormat='g{{l}}', 31 | intervalFactor=1, 32 | ) 33 | ) 34 | .addTarget( 35 | prometheus.target( 36 | 'b', 37 | legendFormat='b{{l}}', 38 | intervalFactor=1, 39 | ) 40 | ) + { 41 | seriesOverrides+: [ 42 | { 43 | alias: 'r%s' % l, 44 | color: 'rgb(%s, 0, 0)' % l, 45 | } 46 | for l in std.range(0, 255) 47 | ] + [ 48 | { 49 | alias: 'g%s' % l, 50 | color: 'rgb(0, %s, 0)' % l, 51 | } 52 | for l in std.range(0, 255) 53 | ] + [ 54 | { 55 | alias: 'b%s' % l, 56 | color: 'rgb(0, 0, %s)' % (l * 2), 57 | } 58 | for l in std.range(0, 127) 59 | ], 60 | }; 61 | 62 | dashboard.new( 63 | 'Prometheus Video Renderer', 64 | uid='pvr-dash', 65 | timezone='utc', 66 | schemaVersion=16, 67 | ) 68 | .addTemplate( 69 | grafana.template.datasource( 70 | 'PROMETHEUS_DS', 71 | 'prometheus', 72 | 'Prometheus', 73 | hide='label', 74 | ) 75 | ) 76 | .addPanel( 77 | videoPanel, gridPos={ 78 | x: 0, 79 | y: 0, 80 | w: 24, 81 | h: 25, 82 | } 83 | ) 84 | -------------------------------------------------------------------------------- /docs/jukebox.md: -------------------------------------------------------------------------------- 1 | # Jukebox 2 | 3 | ## Installation 4 | 5 | Install with: 6 | 7 | ```text 8 | go get -u github.com/MacroPower/prometheus_video_renderer/cmd/prometheus_jukebox 9 | ``` 10 | 11 | ## How to use 12 | 13 | Note that this requires several labels that describe playback behavior, and you need to make sure that the record and playback `name` and `start-time` are aligned (technically you could start playback anywhere in the track). 14 | 15 | ### Recording 16 | 17 | 1. Obtain a WAV file, e.g. `cantina.wav` 18 | 1. Mix to mono. (Stereo should be possible but I've not implemented it yet.) 19 | 1. Downsample as needed, it should always work due to metadata in the labels. 20 | 1. Run `prometheus_jukebox record` to generate metrics. (See below for usage.) 21 | 1. Loop over generated metrics and send them to `promtool tsdb create-blocks-from openmetrics` 22 | - Helper script [here](scripts/load.ps1) 23 | 1. Run `docker compose up` 24 | 1. Proceed to playback if you so choose. 25 | 26 | ```text 27 | $ prometheus_jukebox record --help 28 | 29 | Usage of record: 30 | -file string 31 | WAV file to source 32 | -name string 33 | Name of the track 34 | -scrape-interval int 35 | Frequency in seconds at which samples are written (default 1) 36 | -start-time int 37 | The starting timestamp (Unix MS) of the track 38 | ``` 39 | 40 | ### Playback 41 | 42 | You can stream recorded audio directly from Prometheus. Samples are broken into 43 | small chunks that are queried consecutively. Playback is stopped when the metric 44 | is absent or when you manually stop the program. 45 | 46 | ```text 47 | $ prometheus_jukebox playback --help 48 | 49 | Usage of playback: 50 | -chunk-size duration 51 | Amount of time to query at once (default 2h0m0s) 52 | -name string 53 | Name of the track 54 | -prometheus-url string 55 | Prometheus URL 56 | -start-time int 57 | The starting timestamp (Unix MS) of the track 58 | ``` 59 | 60 | You can also visualize the playback in Grafana, by using 61 | [grafana-image-renderer-cli](https://github.com/MacroPower/grafana-image-renderer-sdk-go) 62 | sequencer to create a timelapse of the waveform in Prometheus that matches with 63 | playback. You'll need to use a few specific arguments: 64 | 65 | > Where `space = total duration of the metric inside Prometheus in seconds` ... 66 | 67 | - `interval` is `space / ( (length of track in seconds) * (desired fps) )`. 68 | - `start-padding` should be a negative duration equal to the desired view size. 69 | - `end-padding` should be `interval * -1`. 70 | - `end-frame` is `space / interval` OR `( space + (start padding in seconds) ) / interval`. 71 | 72 | Example with 60s track, 30fps, start: 1420070400000, end: 1421393445495, 24h view: 73 | 74 | ```shell 75 | $ grafana-image-renderer-cli sequence \ 76 | --api-url=http://localhost:3000 \ 77 | --api-key-or-basic-auth=admin:admin \ 78 | --dashboard=ZpUQVIg7k \ 79 | --start-time=1420070400000 \ 80 | --frame-interval=735s \ 81 | --start-padding=-24h \ 82 | --end-padding=-735s \ 83 | --frames=1-1800 84 | ``` 85 | -------------------------------------------------------------------------------- /.bingo/Variables.mk: -------------------------------------------------------------------------------- 1 | # Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.4.3. DO NOT EDIT. 2 | # All tools are designed to be build inside $GOBIN. 3 | BINGO_DIR := $(dir $(lastword $(MAKEFILE_LIST))) 4 | GOPATH ?= $(shell go env GOPATH) 5 | GOBIN ?= $(firstword $(subst :, ,${GOPATH}))/bin 6 | GO ?= $(shell which go) 7 | 8 | # Below generated variables ensure that every time a tool under each variable is invoked, the correct version 9 | # will be used; reinstalling only if needed. 10 | # For example for bingo variable: 11 | # 12 | # In your main Makefile (for non array binaries): 13 | # 14 | #include .bingo/Variables.mk # Assuming -dir was set to .bingo . 15 | # 16 | #command: $(BINGO) 17 | # @echo "Running bingo" 18 | # @$(BINGO) 19 | # 20 | BINGO := $(GOBIN)/bingo-v0.4.3 21 | $(BINGO): $(BINGO_DIR)/bingo.mod 22 | @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. 23 | @echo "(re)installing $(GOBIN)/bingo-v0.4.3" 24 | @cd $(BINGO_DIR) && $(GO) build -mod=mod -modfile=bingo.mod -o=$(GOBIN)/bingo-v0.4.3 "github.com/bwplotka/bingo" 25 | 26 | GRAFANA_IMAGE_RENDERER_CLI := $(GOBIN)/grafana-image-renderer-cli-v0.0.2 27 | $(GRAFANA_IMAGE_RENDERER_CLI): $(BINGO_DIR)/grafana-image-renderer-cli.mod 28 | @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. 29 | @echo "(re)installing $(GOBIN)/grafana-image-renderer-cli-v0.0.2" 30 | @cd $(BINGO_DIR) && $(GO) build -mod=mod -modfile=grafana-image-renderer-cli.mod -o=$(GOBIN)/grafana-image-renderer-cli-v0.0.2 "github.com/MacroPower/grafana-image-renderer-sdk-go/cmd/grafana-image-renderer-cli" 31 | 32 | JB := $(GOBIN)/jb-v0.4.0 33 | $(JB): $(BINGO_DIR)/jb.mod 34 | @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. 35 | @echo "(re)installing $(GOBIN)/jb-v0.4.0" 36 | @cd $(BINGO_DIR) && $(GO) build -mod=mod -modfile=jb.mod -o=$(GOBIN)/jb-v0.4.0 "github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb" 37 | 38 | JSONNET_LINT := $(GOBIN)/jsonnet-lint-v0.17.0 39 | $(JSONNET_LINT): $(BINGO_DIR)/jsonnet-lint.mod 40 | @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. 41 | @echo "(re)installing $(GOBIN)/jsonnet-lint-v0.17.0" 42 | @cd $(BINGO_DIR) && $(GO) build -mod=mod -modfile=jsonnet-lint.mod -o=$(GOBIN)/jsonnet-lint-v0.17.0 "github.com/google/go-jsonnet/cmd/jsonnet-lint" 43 | 44 | JSONNET := $(GOBIN)/jsonnet-v0.17.0 45 | $(JSONNET): $(BINGO_DIR)/jsonnet.mod 46 | @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. 47 | @echo "(re)installing $(GOBIN)/jsonnet-v0.17.0" 48 | @cd $(BINGO_DIR) && $(GO) build -mod=mod -modfile=jsonnet.mod -o=$(GOBIN)/jsonnet-v0.17.0 "github.com/google/go-jsonnet/cmd/jsonnet" 49 | 50 | JSONNETFMT := $(GOBIN)/jsonnetfmt-v0.17.0 51 | $(JSONNETFMT): $(BINGO_DIR)/jsonnetfmt.mod 52 | @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. 53 | @echo "(re)installing $(GOBIN)/jsonnetfmt-v0.17.0" 54 | @cd $(BINGO_DIR) && $(GO) build -mod=mod -modfile=jsonnetfmt.mod -o=$(GOBIN)/jsonnetfmt-v0.17.0 "github.com/google/go-jsonnet/cmd/jsonnetfmt" 55 | 56 | PROMTOOL := $(GOBIN)/promtool-v1.8.2-0.20210701133801-b0944590a1c9 57 | $(PROMTOOL): $(BINGO_DIR)/promtool.mod 58 | @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. 59 | @echo "(re)installing $(GOBIN)/promtool-v1.8.2-0.20210701133801-b0944590a1c9" 60 | @cd $(BINGO_DIR) && $(GO) build -mod=mod -modfile=promtool.mod -o=$(GOBIN)/promtool-v1.8.2-0.20210701133801-b0944590a1c9 "github.com/prometheus/prometheus/cmd/promtool" 61 | 62 | -------------------------------------------------------------------------------- /grafana/lib/prometheus_video_renderer_8.libsonnet: -------------------------------------------------------------------------------- 1 | { 2 | new(uid, name, targets=[], overrides=[]):: { 3 | annotations: { 4 | list: [], 5 | }, 6 | editable: true, 7 | gnetId: null, 8 | graphTooltip: 0, 9 | id: null, 10 | links: [], 11 | panels: [ 12 | { 13 | datasource: 'Prometheus', 14 | fieldConfig: { 15 | defaults: { 16 | color: { 17 | mode: 'palette-classic', 18 | }, 19 | custom: { 20 | axisLabel: '', 21 | axisPlacement: 'auto', 22 | barAlignment: 0, 23 | drawStyle: 'line', 24 | fillOpacity: 0, 25 | gradientMode: 'none', 26 | hideFrom: { 27 | legend: false, 28 | tooltip: false, 29 | viz: false, 30 | }, 31 | lineInterpolation: 'linear', 32 | lineWidth: 2, 33 | pointSize: 5, 34 | scaleDistribution: { 35 | type: 'linear', 36 | }, 37 | showPoints: 'never', 38 | spanNulls: false, 39 | stacking: { 40 | group: 'A', 41 | mode: 'none', 42 | }, 43 | thresholdsStyle: { 44 | mode: 'off', 45 | }, 46 | }, 47 | mappings: [], 48 | max: 300, 49 | min: 0, 50 | thresholds: { 51 | mode: 'absolute', 52 | steps: [ 53 | { 54 | color: 'green', 55 | value: null, 56 | }, 57 | { 58 | color: 'red', 59 | value: 80, 60 | }, 61 | ], 62 | }, 63 | unit: 'short', 64 | }, 65 | overrides: overrides, 66 | }, 67 | gridPos: { 68 | h: 25, 69 | w: 24, 70 | x: 0, 71 | y: 0, 72 | }, 73 | id: 2, 74 | interval: '1s', 75 | links: [], 76 | options: { 77 | legend: { 78 | calcs: [], 79 | displayMode: 'hidden', 80 | placement: 'bottom', 81 | }, 82 | tooltip: { 83 | mode: 'single', 84 | }, 85 | }, 86 | pluginVersion: '8.0.0', 87 | repeat: null, 88 | targets: targets, 89 | timeFrom: null, 90 | timeShift: null, 91 | title: 'Video', 92 | type: 'timeseries', 93 | }, 94 | ], 95 | refresh: false, 96 | schemaVersion: 30, 97 | style: 'dark', 98 | tags: [], 99 | templating: { 100 | list: [ 101 | { 102 | current: { 103 | selected: false, 104 | text: 'Prometheus', 105 | value: 'Prometheus', 106 | }, 107 | description: null, 108 | 'error': null, 109 | hide: 1, 110 | includeAll: false, 111 | label: null, 112 | multi: false, 113 | name: 'PROMETHEUS_DS', 114 | options: [], 115 | query: 'prometheus', 116 | refresh: 1, 117 | regex: '', 118 | skipUrlSync: false, 119 | type: 'datasource', 120 | }, 121 | ], 122 | }, 123 | time: { 124 | from: 'now-6h', 125 | to: 'now', 126 | }, 127 | timepicker: { 128 | refresh_intervals: [ 129 | '5s', 130 | '10s', 131 | '30s', 132 | '1m', 133 | '5m', 134 | '15m', 135 | '30m', 136 | '1h', 137 | '2h', 138 | '1d', 139 | ], 140 | time_options: ['5m', '15m', '1h', '6h', '12h', '24h', '2d', '7d', '30d'], 141 | }, 142 | timezone: 'utc', 143 | title: name, 144 | uid: uid, 145 | version: 1, 146 | }, 147 | } 148 | -------------------------------------------------------------------------------- /docs/renderer.md: -------------------------------------------------------------------------------- 1 | # Renderer 2 | 3 | ## Installation 4 | 5 | Install with: 6 | 7 | ```text 8 | go get -u github.com/MacroPower/prometheus_video_renderer/cmd/prometheus_video_renderer 9 | ``` 10 | 11 | ```text 12 | $ prometheus_video_renderer --help 13 | 14 | Usage of prometheus_video_renderer: 15 | -bitmap-light-threshold int 16 | Brightness required to write a sample (1-255) (default 127) 17 | -frame-duration duration 18 | The max duration that can be used to write samples. Must be greater than the horizontal resolution times the scrape interval. (default 5m0s) 19 | -frames-location string 20 | Location of png frames (default "frames") 21 | -frames-per-file int 22 | Number of frames to include in each metrics file (default 120) 23 | -metrics-location string 24 | Location to write metrics (default "metrics") 25 | -mode string 26 | One of: [bitmap, grayscale, rgb] (default "bitmap") 27 | -project string 28 | The name of the project 29 | -scrape-interval int 30 | The frequency at which new samples are written (default 1) 31 | -start-time int 32 | The starting timestamp (Unix MS) of the render 33 | -write-wav string 34 | Optional .WAV file to write alongside video 35 | ``` 36 | 37 | ## How to use 38 | 39 | ### Setup 40 | 41 | Obtain a video, e.g. `bad_apple.mkv`. 42 | 43 | Figure out the output resolution, you should scale 1:1 with height 44 | being the number of time series you want. If you're using Grafana, 100 45 | height works well. On Prometheus, 135 height works well. 46 | 47 | Get an ordered PNG sequence from your video, scaled to the resolution 48 | you want. You can also use handbrake to scale the video (just remove 49 | the `-vf 'scale=...'` argument). 50 | 51 | ```bash 52 | ffmpeg -i 'bad_apple.mkv' -vf 'scale=180:135' -vsync 0 'out%06d.png' 53 | ``` 54 | 55 | Consider adding 1px white bars to each frame to avoid y axis changes. 56 | _You do not have to do this if you're using Grafana_ since you can 57 | easily set a min/max. 58 | 59 | ```bash 60 | ffmpeg -i 'out%06d.png' -vf 'crop=in_w:in_h-1:0:1,pad=iw+0:ih+1:0:1:#FFFFFF@1,format=rgb24' -y 'out%06d.png' 61 | ffmpeg -i 'out%06d.png' -vf 'crop=in_w:in_h-1:0:-1,pad=iw+0:ih+1:0:-1:#FFFFFF@1,format=rgb24' -y 'out%06d.png' 62 | ``` 63 | 64 | Store all frames in one folder under `frames/your_project_name`. 65 | 66 | ### Backfill Metrics 67 | 68 | Run `prometheus_video_renderer` to generate metrics. You'll need to 69 | pass `--mode` (see the [readme](../README.md) for an explanation of 70 | each), `--project` which is the same as `your_project_name` from the 71 | previous section, and `--start-time` which you can easily grab from a 72 | Grafana dashboard using UTC. 73 | 74 | To also include audio, you must pass a WAV file with a matching sample 75 | rate to `--write-wav`. You can match the sample rate with 76 | `sox in.wav -r 99 out.wav dither`, where 99 is the number of samples 77 | per frame multiplied by fps. Note that if you want to perfectly match 78 | the video you'll need to match the total audio and video samples 79 | exactly, so the actual sample rate of the audio may need to be 80 | fractional. All this will reduce audio quality by a good amount but it 81 | should still be listenable through the [jukebox](jukebox.md). There 82 | also may be some clicking if you use a blanking interval due, I 83 | believe this is due to Prometheus adding an extra sample every frame. 84 | 85 | Loop over generated metrics and send them to 86 | `promtool tsdb create-blocks-from openmetrics`. Helper script 87 | [here](../scripts/load.ps1). 88 | 89 | ### Record Frame Data 90 | 91 | Run `docker compose up`. If you want to improve Grafana render speed 92 | (at the cost of additional cpu/memory), increase 93 | `RENDERING_CLUSTERING_MAX_CONCURRENCY`. Optionally, wait for 94 | Prometheus to compact. This can help prevent OOMs, timeouts and such. 95 | 96 | Now you can begin recording frames from the Prometheus or Grafana UI. 97 | You will want to size the graph such that the aspect ratio is the same 98 | as the original video (or is at least somewhat close). 99 | 100 | If you're using Prometheus, it's fast enough that you can use AHK. 101 | (Mediocre example in the scripts directory.) 102 | 103 | If you intend to use Grafana, I highly recommend getting my 104 | [grafana-image-renderer-cli](https://github.com/MacroPower/grafana-image-renderer-sdk-go) 105 | as the sequencer package makes automating the rendering process a lot 106 | faster and easier. 107 | 108 | - `frame-interval` should be set to the same as `frame-duration`. 109 | - `end-padding` removes any excess time that could not be filled with 110 | your `frame-duration`. For example, a video with 128px width, with a 111 | 5m duration and 1s scrape interval, will use 256 seconds which is 44 112 | seconds less than the duration. Thus, the `end-padding` should be 113 | -44s. (In general using multiples of 5 is better than giving an 114 | exact `frame-duration` because it will keep the Grafana UI more 115 | static.) 116 | 117 | ```text 118 | $ grafana-image-renderer-cli sequence \ 119 | --api-url=http://localhost:3000 \ 120 | --api-key-or-basic-auth=admin:admin \ 121 | --dashboard=pvr-dash-8 \ 122 | --start-time=1256428800000 \ 123 | --frame-interval=5m \ 124 | --end-padding=-44s \ 125 | --frames=1-5 126 | ``` 127 | 128 | ### Generate Video 129 | 130 | `cd` to wherever you stored your frames and generate the video file 131 | with `ffmpeg -framerate 30 -i '%06d.png'` + any of the following: 132 | 133 | - Fast output: `-c:v libx264 -pix_fmt yuv420p out.mp4` 134 | - High quality output: `-c:v libx264rgb -pix_fmt rgb24 -preset veryslow -crf 0 -qp 0 out.mp4` 135 | - Merge with wav: `-i input.wav -c:v copy -c:a aac -c:v libx264rgb -pix_fmt rgb24 out.mp4` 136 | - Merge with audio from original video: `-i input.mp4 -c copy -map 0:0 -map 1:1 -c:v libx264rgb -pix_fmt rgb24 out.mp4` 137 | - Upscale: `-c:v libx264rgb -pix_fmt rgb24 -vf scale=2560:2200:flags=neighbor out.mp4` 138 | 139 | I highly recommend upscaling to ~4k for YouTube videos, because it 140 | results in YouTube using much less lossy compression on your video. 141 | The result will be much less muddy and the colors will be 142 | significantly better. 143 | 144 | ## Issues 145 | 146 | If you run into any problems, please 147 | [create an issue](https://github.com/MacroPower/prometheus_video_renderer/issues/new) 148 | and I will try my best to help. 149 | -------------------------------------------------------------------------------- /grafana/lib/prometheus_video_renderer_8_audio.libsonnet: -------------------------------------------------------------------------------- 1 | { 2 | new(uid, name, targets=[], overrides=[]):: { 3 | annotations: { 4 | list: [], 5 | }, 6 | editable: true, 7 | gnetId: null, 8 | graphTooltip: 0, 9 | id: null, 10 | links: [], 11 | panels: [ 12 | { 13 | datasource: 'Prometheus', 14 | fieldConfig: { 15 | defaults: { 16 | color: { 17 | mode: 'palette-classic', 18 | }, 19 | custom: { 20 | axisLabel: '', 21 | axisPlacement: 'auto', 22 | barAlignment: 0, 23 | drawStyle: 'line', 24 | fillOpacity: 0, 25 | gradientMode: 'none', 26 | hideFrom: { 27 | legend: false, 28 | tooltip: false, 29 | viz: false, 30 | }, 31 | lineInterpolation: 'linear', 32 | lineWidth: 2, 33 | pointSize: 5, 34 | scaleDistribution: { 35 | type: 'linear', 36 | }, 37 | showPoints: 'never', 38 | spanNulls: false, 39 | stacking: { 40 | group: 'A', 41 | mode: 'none', 42 | }, 43 | thresholdsStyle: { 44 | mode: 'off', 45 | }, 46 | }, 47 | mappings: [], 48 | max: 300, 49 | min: 0, 50 | thresholds: { 51 | mode: 'absolute', 52 | steps: [ 53 | { 54 | color: 'green', 55 | value: null, 56 | }, 57 | { 58 | color: 'red', 59 | value: 80, 60 | }, 61 | ], 62 | }, 63 | unit: 'short', 64 | }, 65 | overrides: overrides, 66 | }, 67 | gridPos: { 68 | h: 28, 69 | w: 24, 70 | x: 0, 71 | y: 0, 72 | }, 73 | id: 2, 74 | interval: '1s', 75 | links: [], 76 | options: { 77 | legend: { 78 | calcs: [], 79 | displayMode: 'hidden', 80 | placement: 'bottom', 81 | }, 82 | tooltip: { 83 | mode: 'single', 84 | }, 85 | }, 86 | pluginVersion: '8.0.0', 87 | repeat: null, 88 | targets: targets, 89 | timeFrom: null, 90 | timeShift: null, 91 | title: 'Video', 92 | type: 'timeseries', 93 | }, 94 | { 95 | datasource: '${PROMETHEUS_DS}', 96 | fieldConfig: { 97 | defaults: { 98 | color: { 99 | mode: 'palette-classic', 100 | }, 101 | custom: { 102 | axisLabel: '', 103 | axisPlacement: 'auto', 104 | barAlignment: 0, 105 | drawStyle: 'line', 106 | fillOpacity: 0, 107 | gradientMode: 'none', 108 | hideFrom: { 109 | legend: false, 110 | tooltip: false, 111 | viz: false, 112 | }, 113 | lineInterpolation: 'linear', 114 | lineWidth: 2, 115 | pointSize: 5, 116 | scaleDistribution: { 117 | type: 'linear', 118 | }, 119 | showPoints: 'auto', 120 | spanNulls: false, 121 | stacking: { 122 | group: 'A', 123 | mode: 'none', 124 | }, 125 | thresholdsStyle: { 126 | mode: 'off', 127 | }, 128 | }, 129 | mappings: [], 130 | max: 35000, 131 | min: -35000, 132 | thresholds: { 133 | mode: 'absolute', 134 | steps: [ 135 | { 136 | color: 'green', 137 | value: null, 138 | }, 139 | { 140 | color: 'red', 141 | value: 80, 142 | }, 143 | ], 144 | }, 145 | }, 146 | overrides: [], 147 | }, 148 | gridPos: { 149 | h: 6, 150 | w: 24, 151 | x: 0, 152 | y: 28, 153 | }, 154 | id: 4, 155 | interval: '1s', 156 | options: { 157 | legend: { 158 | calcs: [], 159 | displayMode: 'hidden', 160 | placement: 'bottom', 161 | }, 162 | tooltip: { 163 | mode: 'single', 164 | }, 165 | }, 166 | targets: [ 167 | { 168 | exemplar: true, 169 | expr: 'wav', 170 | interval: '', 171 | legendFormat: '', 172 | queryType: 'randomWalk', 173 | refId: 'A', 174 | }, 175 | ], 176 | title: 'Audio', 177 | type: 'timeseries', 178 | }, 179 | ], 180 | refresh: false, 181 | schemaVersion: 30, 182 | style: 'dark', 183 | tags: [], 184 | templating: { 185 | list: [ 186 | { 187 | current: { 188 | selected: false, 189 | text: 'Prometheus', 190 | value: 'Prometheus', 191 | }, 192 | description: null, 193 | 'error': null, 194 | hide: 1, 195 | includeAll: false, 196 | label: null, 197 | multi: false, 198 | name: 'PROMETHEUS_DS', 199 | options: [], 200 | query: 'prometheus', 201 | refresh: 1, 202 | regex: '', 203 | skipUrlSync: false, 204 | type: 'datasource', 205 | }, 206 | ], 207 | }, 208 | time: { 209 | from: 'now-6h', 210 | to: 'now', 211 | }, 212 | timepicker: { 213 | refresh_intervals: [ 214 | '5s', 215 | '10s', 216 | '30s', 217 | '1m', 218 | '5m', 219 | '15m', 220 | '30m', 221 | '1h', 222 | '2h', 223 | '1d', 224 | ], 225 | time_options: ['5m', '15m', '1h', '6h', '12h', '24h', '2d', '7d', '30d'], 226 | }, 227 | timezone: 'utc', 228 | title: name, 229 | uid: uid, 230 | version: 1, 231 | }, 232 | } 233 | -------------------------------------------------------------------------------- /cmd/prometheus_video_renderer/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "flag" 6 | "fmt" 7 | "image" 8 | "image/color" 9 | "image/png" 10 | "io" 11 | "io/ioutil" 12 | "os" 13 | "path" 14 | "path/filepath" 15 | "time" 16 | 17 | "github.com/MacroPower/prometheus_video_renderer/pkg/backfiller" 18 | "github.com/youpy/go-wav" 19 | ) 20 | 21 | type writeFunc func(b *bytes.Buffer, img image.Image, timestamp time.Time, x int, y int, invY int, sliceSize int) 22 | 23 | var ( 24 | projectName = flag.String("project", "", "The name of the project") 25 | framesLocation = flag.String("frames-location", "frames", "Location of png frames") 26 | metricsLocation = flag.String("metrics-location", "metrics", "Location to write metrics") 27 | framesPerFile = flag.Int("frames-per-file", 120, "Number of frames to include in each metrics file") 28 | writeMode = flag.String("mode", "bitmap", "One of: [bitmap, grayscale, rgb]") 29 | lightThreshold = flag.Int("bitmap-light-threshold", 127, "Brightness required to write a sample (1-255)") 30 | scrapeInterval = flag.Int("scrape-interval", 1, "The frequency at which new samples are written") 31 | startTimeMs = flag.Int64("start-time", 0, "The starting timestamp (Unix MS) of the render") 32 | writeWav = flag.String("write-wav", "", "Optional .WAV file to write alongside video") 33 | frameDuration = flag.Duration( 34 | "frame-duration", 35 | 5*time.Minute, 36 | "The max duration that can be used to write samples."+ 37 | " Must be greater than the horizontal resolution times the scrape interval.", 38 | ) 39 | 40 | writeFuncs = map[string]writeFunc{ 41 | "bitmap": writeBitmap, 42 | "grayscale": writeGrayscale, 43 | "rgb": writeRGB, 44 | } 45 | ) 46 | 47 | func check(e error) { 48 | if e != nil { 49 | panic(e) 50 | } 51 | } 52 | 53 | func writeBitmap(b *bytes.Buffer, img image.Image, timestamp time.Time, x, y, invY, sliceSize int) { 54 | c := color.GrayModel.Convert(img.At(x, y)).(color.Gray) 55 | if int(c.Y) > *lightThreshold { 56 | for i := 0; i < sliceSize; i += *scrapeInterval { 57 | sampleTs := timestamp.Add(time.Duration(i) * time.Second).Unix() 58 | 59 | backfiller.WriteHelp(b, *projectName) 60 | b.WriteString(fmt.Sprintf(`%s{y="%d"} %d %d%s`, *projectName, y, invY, sampleTs, "\n")) 61 | } 62 | } 63 | } 64 | 65 | func writeGrayscale(b *bytes.Buffer, img image.Image, timestamp time.Time, x, y, invY, sliceSize int) { 66 | c := color.GrayModel.Convert(img.At(x, y)).(color.Gray) 67 | for i := 0; i < sliceSize; i += *scrapeInterval { 68 | sampleTs := timestamp.Add(time.Duration(i) * time.Second).Unix() 69 | 70 | backfiller.WriteHelp(b, "y", "wav") 71 | b.WriteString(fmt.Sprintf(`y{y="%d",l="%d"} %d %d%s`, y, c.Y, invY-0, sampleTs, "\n")) 72 | } 73 | } 74 | 75 | func writeRGB(b *bytes.Buffer, img image.Image, timestamp time.Time, x, y, invY, sliceSize int) { 76 | c := color.RGBAModel.Convert(img.At(x, y)).(color.RGBA) 77 | invY = invY * 3 78 | for i := 0; i < sliceSize; i += *scrapeInterval { 79 | sampleTs := timestamp.Add(time.Duration(i) * time.Second).Unix() 80 | 81 | backfiller.WriteHelp(b, "r", "g", "b", "wav") 82 | b.WriteString(fmt.Sprintf(`r{y="%d",l="%d"} %d %d%s`, y, c.R>>0, invY-0, sampleTs, "\n")) 83 | b.WriteString(fmt.Sprintf(`g{y="%d",l="%d"} %d %d%s`, y, c.G>>0, invY-1, sampleTs, "\n")) 84 | b.WriteString(fmt.Sprintf(`b{y="%d",l="%d"} %d %d%s`, y, c.B>>1, invY-2, sampleTs, "\n")) 85 | } 86 | } 87 | 88 | func writeWave(b *bytes.Buffer, timestamp time.Time, reader *wav.Reader, format *wav.WavFormat, samples []wav.Sample) { 89 | for i, sample := range samples { 90 | sampleTs := timestamp.Add(time.Duration(i**scrapeInterval) * time.Second) 91 | 92 | backfiller.WriteWaveSample(b, sampleTs, "wav", sample, reader.IntValue(sample, 0), format) 93 | } 94 | } 95 | 96 | func getSamplesInFrame(sliceSize int, img image.Image) int { 97 | return sliceSize * (img.Bounds().Max.X - img.Bounds().Min.X) 98 | } 99 | 100 | func getSliceSize(frameDuration *time.Duration, img image.Image) int { 101 | return int(frameDuration.Seconds()) / (img.Bounds().Max.X - img.Bounds().Min.X) 102 | } 103 | 104 | func main() { 105 | flag.Parse() 106 | 107 | argErr := false 108 | if *startTimeMs == 0 { 109 | fmt.Println("start-time is required") 110 | argErr = true 111 | } 112 | if argErr { 113 | fmt.Println("Use --help for more information") 114 | os.Exit(1) 115 | } 116 | 117 | startTime := backfiller.FromUnixMs(*startTimeMs) 118 | 119 | framesDir := filepath.Join(*framesLocation, *projectName) 120 | metricsDir := filepath.Join(*metricsLocation, *projectName) 121 | os.Mkdir(metricsDir, 0664) 122 | 123 | frames, err := ioutil.ReadDir(framesDir) 124 | if err != nil { 125 | panic(err) 126 | } 127 | 128 | var filesWritten int 129 | var sliceSize int 130 | var samplesInFrame int 131 | b := new(bytes.Buffer) 132 | 133 | var reader *wav.Reader 134 | var format *wav.WavFormat 135 | var samples []wav.Sample 136 | if *writeWav != "" { 137 | file, err := os.Open(*writeWav) 138 | check(err) 139 | 140 | reader := wav.NewReader(file) 141 | defer file.Close() 142 | 143 | format, err = reader.Format() 144 | check(err) 145 | 146 | for { 147 | s, err := reader.ReadSamples() 148 | samples = append(samples, s...) 149 | if err == io.EOF { 150 | break 151 | } 152 | check(err) 153 | } 154 | 155 | fmt.Printf("Read in %d wave samples\n", len(samples)) 156 | } 157 | 158 | for i, frame := range frames { 159 | fmt.Printf("Running: %s\n", frame.Name()) 160 | f, err := os.Open(path.Join(framesDir, frame.Name())) 161 | check(err) 162 | defer f.Close() 163 | 164 | img, err := png.Decode(f) 165 | check(err) 166 | 167 | if i == 0 { 168 | sliceSize = getSliceSize(frameDuration, img) 169 | samplesInFrame = getSamplesInFrame(sliceSize, img) 170 | fmt.Printf("Total samples: %d, %d per frame\n", samplesInFrame*len(frames), samplesInFrame) 171 | } else if sliceSize != getSliceSize(frameDuration, img) { 172 | fmt.Printf("Inconsistent image size at frame %d\n", i) 173 | os.Exit(1) 174 | } 175 | 176 | for y := img.Bounds().Min.Y; y < img.Bounds().Max.Y; y++ { 177 | invY := img.Bounds().Max.Y - y 178 | for x := img.Bounds().Min.X; x < img.Bounds().Max.X; x++ { 179 | timestamp := startTime.Add(time.Duration(sliceSize*x) * time.Second) 180 | writeFuncs[*writeMode](b, img, timestamp, x, y, invY, sliceSize) 181 | } 182 | } 183 | if len(samples) > 0 { 184 | samplesToWriteStart := samplesInFrame * i 185 | samplesToWriteEnd := samplesInFrame * (i + 1) 186 | if samplesToWriteEnd > len(samples) { 187 | samplesToWriteEnd = len(samples) 188 | } 189 | frameSamples := samples[samplesToWriteStart:samplesToWriteEnd] 190 | writeWave(b, startTime, reader, format, frameSamples) 191 | } 192 | startTime = startTime.Add(*frameDuration) 193 | 194 | if b.Len() > 0 && i != 0 && i%*framesPerFile == 0 || i == len(frames)-1 { 195 | filesWritten++ 196 | backfiller.WriteEnd(b) 197 | filename := fmt.Sprintf("out%04d", filesWritten) 198 | fmt.Printf("Writing: %s\n", filename) 199 | f, err := os.Create(filepath.Join(metricsDir, filename)) 200 | check(err) 201 | _, err = b.WriteTo(f) 202 | check(err) 203 | f.Close() 204 | b.Reset() 205 | } 206 | } 207 | } 208 | -------------------------------------------------------------------------------- /cmd/prometheus_jukebox/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "context" 6 | "flag" 7 | "fmt" 8 | "io" 9 | "os" 10 | "strconv" 11 | "time" 12 | 13 | "github.com/MacroPower/prometheus_video_renderer/pkg/backfiller" 14 | "github.com/faiface/beep" 15 | "github.com/faiface/beep/speaker" 16 | bwav "github.com/faiface/beep/wav" 17 | prometheus "github.com/prometheus/client_golang/api" 18 | v1 "github.com/prometheus/client_golang/api/prometheus/v1" 19 | "github.com/prometheus/common/model" 20 | "github.com/youpy/go-wav" 21 | ) 22 | 23 | func addDefaultFlags( 24 | f *flag.FlagSet, 25 | trackName *string, 26 | startTime *int64, 27 | ) { 28 | f.StringVar(trackName, "name", "", "Name of the track") 29 | f.Int64Var(startTime, "start-time", 0, "The starting timestamp (Unix MS) of the track") 30 | } 31 | 32 | func main() { 33 | var ( 34 | trackName string 35 | startTime int64 36 | 37 | recordCommand = flag.NewFlagSet("record", flag.ExitOnError) 38 | filePath = recordCommand.String("file", "", "WAV file to source") 39 | scrapeInterval = recordCommand.Int("scrape-interval", 1, "Frequency in seconds at which samples are written") 40 | 41 | playbackCommand = flag.NewFlagSet("playback", flag.ExitOnError) 42 | prometheusURL = playbackCommand.String("prometheus-url", "", "Prometheus URL") 43 | chunkSize = playbackCommand.Duration("chunk-size", 2*time.Hour, "Amount of time to query at once") 44 | ) 45 | 46 | if len(os.Args) < 2 { 47 | fmt.Println("record or playback subcommand is required") 48 | os.Exit(1) 49 | } 50 | 51 | switch os.Args[1] { 52 | case "record": 53 | addDefaultFlags( 54 | recordCommand, 55 | &trackName, &startTime, 56 | ) 57 | recordCommand.Parse(os.Args[2:]) 58 | case "playback": 59 | addDefaultFlags( 60 | playbackCommand, 61 | &trackName, &startTime, 62 | ) 63 | playbackCommand.Parse(os.Args[2:]) 64 | default: 65 | fmt.Println("record or playback subcommand is required") 66 | os.Exit(1) 67 | } 68 | 69 | argErr := false 70 | if trackName == "" { 71 | fmt.Println("name is required") 72 | argErr = true 73 | } 74 | if recordCommand.Parsed() { 75 | if *filePath == "" { 76 | fmt.Println("file is required") 77 | argErr = true 78 | } 79 | if *scrapeInterval < 1 { 80 | fmt.Println("scrape-interval must be 1 or greater") 81 | argErr = true 82 | } 83 | } 84 | if playbackCommand.Parsed() { 85 | if *prometheusURL == "" { 86 | fmt.Println("prometheus-url is required") 87 | argErr = true 88 | } 89 | if *chunkSize < 1*time.Minute { 90 | fmt.Println("chunk-size must be 1m0s or greater") 91 | argErr = true 92 | } 93 | } 94 | if argErr { 95 | fmt.Println("Use --help for more information") 96 | os.Exit(1) 97 | } 98 | 99 | startTimeMs := backfiller.FromUnixMs(startTime) 100 | 101 | if recordCommand.Parsed() { 102 | write(startTimeMs, trackName, *scrapeInterval, *filePath) 103 | } 104 | 105 | if playbackCommand.Parsed() { 106 | read(startTimeMs, trackName, *scrapeInterval, *chunkSize, *prometheusURL) 107 | } 108 | } 109 | 110 | func read(startTime time.Time, trackName string, scrapeInterval int, chunkSize time.Duration, prometheusURL string) { 111 | sr := beep.SampleRate(44100) 112 | speaker.Init(sr, sr.N(time.Second/10)) 113 | 114 | var queue Queue 115 | done := make(chan bool) 116 | speaker.Play(&queue) 117 | 118 | client, err := prometheus.NewClient(prometheus.Config{Address: prometheusURL}) 119 | check(err) 120 | 121 | q := v1.NewAPI(client) 122 | 123 | i := 0 124 | for { 125 | data, wavFormat, ok := getAudioChunk(q, startTime, trackName, scrapeInterval, chunkSize, i) 126 | if !ok { 127 | break 128 | } 129 | i++ 130 | 131 | b := new(bytes.Buffer) 132 | writer := wav.NewWriter(b, uint32(len(data)), 2, wavFormat.SampleRate, wavFormat.BitsPerSample) 133 | writer.WriteSamples(data) 134 | 135 | streamer, format, err := bwav.Decode(b) 136 | check(err) 137 | 138 | resampled := beep.Resample(4, format.SampleRate, sr, streamer) 139 | 140 | speaker.Lock() 141 | queue.Add(resampled) 142 | speaker.Unlock() 143 | } 144 | queue.Add(beep.Callback(func() { 145 | done <- true 146 | })) 147 | 148 | <-done 149 | } 150 | 151 | func write(startTime time.Time, trackName string, scrapeInterval int, filePath string) { 152 | file, err := os.Open(filePath) 153 | check(err) 154 | 155 | reader := wav.NewReader(file) 156 | defer file.Close() 157 | 158 | format, err := reader.Format() 159 | check(err) 160 | 161 | b := new(bytes.Buffer) 162 | for { 163 | samples, err := reader.ReadSamples() 164 | if err == io.EOF { 165 | break 166 | } 167 | check(err) 168 | 169 | for _, sample := range samples { 170 | backfiller.WriteWaveSample(b, startTime, trackName, sample, reader.IntValue(sample, 0), format) 171 | 172 | startTime = startTime.Add(time.Duration(scrapeInterval) * time.Second) 173 | } 174 | } 175 | backfiller.WriteEnd(b) 176 | f, err := os.Create(trackName) 177 | check(err) 178 | _, err = b.WriteTo(f) 179 | check(err) 180 | } 181 | 182 | func getAudioChunk( 183 | q v1.API, 184 | startTime time.Time, 185 | trackName string, 186 | scrapeInterval int, 187 | chunkSize time.Duration, 188 | n int, 189 | ) ( 190 | samples []wav.Sample, 191 | format wav.WavFormat, 192 | ok bool, 193 | ) { 194 | ctx, cancel := context.WithCancel(context.Background()) 195 | defer cancel() 196 | 197 | value, _, err := q.QueryRange(ctx, trackName, v1.Range{ 198 | Start: startTime.Add(chunkSize * time.Duration(n+0)), 199 | End: startTime.Add(chunkSize * time.Duration(n+1)), 200 | Step: time.Duration(scrapeInterval) * time.Second * 1, 201 | }) 202 | check(err) 203 | queryType := value.Type() 204 | 205 | if queryType == model.ValMatrix { 206 | matrixVal := value.(model.Matrix) 207 | for i, series := range matrixVal { 208 | if i == 0 { 209 | format = metricToFormat(series.Metric) 210 | } 211 | for _, elem := range series.Values { 212 | samples = append(samples, wav.Sample{Values: [2]int{int(elem.Value), int(elem.Value)}}) 213 | } 214 | } 215 | 216 | if len(samples) == 0 { 217 | return []wav.Sample{}, format, false 218 | } 219 | 220 | fmt.Printf("Read %d samples, chunk %d\n", len(samples), n) 221 | return samples, format, true 222 | } 223 | 224 | return []wav.Sample{}, format, false 225 | } 226 | 227 | func metricToFormat(metric model.Metric) wav.WavFormat { 228 | audioFormat, err := strconv.ParseUint(string(metric["audio_format"]), 10, 16) 229 | check(err) 230 | 231 | sampleRate, err := strconv.ParseUint(string(metric["sample_rate"]), 10, 32) 232 | check(err) 233 | 234 | byteRate, err := strconv.ParseUint(string(metric["byte_rate"]), 10, 32) 235 | check(err) 236 | 237 | blockAlign, err := strconv.ParseUint(string(metric["block_align"]), 10, 16) 238 | check(err) 239 | 240 | bitsPerSample, err := strconv.ParseUint(string(metric["bits_per_sample"]), 10, 16) 241 | check(err) 242 | 243 | return wav.WavFormat{ 244 | AudioFormat: uint16(audioFormat), 245 | NumChannels: uint16(1), 246 | SampleRate: uint32(sampleRate), 247 | ByteRate: uint32(byteRate), 248 | BlockAlign: uint16(blockAlign), 249 | BitsPerSample: uint16(bitsPerSample), 250 | } 251 | } 252 | 253 | type Queue struct { 254 | streamers []beep.Streamer 255 | count int 256 | } 257 | 258 | func (q *Queue) Add(streamers ...beep.Streamer) { 259 | q.streamers = append(q.streamers, streamers...) 260 | } 261 | 262 | func (q *Queue) Stream(samples [][2]float64) (n int, ok bool) { 263 | filled := 0 264 | for filled < len(samples) { 265 | if len(q.streamers) == 0 { 266 | for i := range samples[filled:] { 267 | samples[i][0] = 0 268 | samples[i][1] = 0 269 | } 270 | break 271 | } 272 | 273 | n, ok := q.streamers[0].Stream(samples[filled:]) 274 | if !ok { 275 | q.streamers = q.streamers[1:] 276 | 277 | fmt.Printf("Finished playing chunk %d\n", q.count) 278 | q.count++ 279 | } 280 | filled += n 281 | } 282 | return len(samples), true 283 | } 284 | 285 | func (q *Queue) Err() error { 286 | return nil 287 | } 288 | 289 | func check(e error) { 290 | if e != nil { 291 | panic(e) 292 | } 293 | } 294 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 4 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 5 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 6 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 7 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= 8 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= 9 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= 10 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= 11 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= 12 | cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= 13 | cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= 14 | cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= 15 | cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= 16 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 17 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= 18 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= 19 | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= 20 | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= 21 | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 22 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 23 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= 24 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= 25 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= 26 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= 27 | cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= 28 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= 29 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= 30 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 31 | cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= 32 | cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= 33 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 34 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 35 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 36 | github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= 37 | github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= 38 | github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= 39 | github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= 40 | github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= 41 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 42 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 43 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 44 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 45 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 46 | github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= 47 | github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= 48 | github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 49 | github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= 50 | github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 51 | github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= 52 | github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= 53 | github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= 54 | github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= 55 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 56 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 57 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 58 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= 59 | github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= 60 | github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= 61 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 62 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 63 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 64 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 65 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 66 | github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= 67 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 68 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= 69 | github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= 70 | github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= 71 | github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 72 | github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 73 | github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 74 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 75 | github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= 76 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 77 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 78 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 79 | github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 80 | github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= 81 | github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= 82 | github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= 83 | github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= 84 | github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= 85 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 86 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 87 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= 88 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 89 | github.com/faiface/beep v1.0.2 h1:UB5DiRNmA4erfUYnHbgU4UB6DlBOrsdEFRtcc8sCkdQ= 90 | github.com/faiface/beep v1.0.2/go.mod h1:1yLb5yRdHMsovYYWVqYLioXkVuziCSITW1oarTeduQM= 91 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 92 | github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= 93 | github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= 94 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 95 | github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= 96 | github.com/gdamore/tcell v1.1.1/go.mod h1:K1udHkiR3cOtlpKG5tZPD5XxrF7v2y7lDq7Whcj+xkQ= 97 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 98 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 99 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 100 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 101 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 102 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 103 | github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= 104 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 105 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 106 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 107 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 108 | github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 109 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 110 | github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= 111 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 112 | github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 113 | github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= 114 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 115 | github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 116 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 117 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 118 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 119 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 120 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 121 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 122 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 123 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 124 | github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 125 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= 126 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 127 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 128 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 129 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 130 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 131 | github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= 132 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 133 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 134 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 135 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 136 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 137 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 138 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 139 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 140 | github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 141 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 142 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 143 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 144 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 145 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 146 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 147 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 148 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 149 | github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 150 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 151 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 152 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 153 | github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= 154 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 155 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 156 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 157 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 158 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 159 | github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 160 | github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 161 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 162 | github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 163 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 164 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 165 | github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 166 | github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 167 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= 168 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 169 | github.com/gopherjs/gopherwasm v0.1.1/go.mod h1:kx4n9a+MzHH0BJJhvlsQ65hqLFXDO/m256AsaDPQ+/4= 170 | github.com/gopherjs/gopherwasm v1.0.0 h1:32nge/RlujS1Im4HNCJPp0NbBOAeBXFuT1KonUuLl+Y= 171 | github.com/gopherjs/gopherwasm v1.0.0/go.mod h1:SkZ8z7CWBz5VXbhJel8TxCmAcsQqzgWGR/8nMhyhZSI= 172 | github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= 173 | github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= 174 | github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= 175 | github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= 176 | github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 177 | github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= 178 | github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 179 | github.com/hajimehoshi/go-mp3 v0.1.1/go.mod h1:4i+c5pDNKDrxl1iu9iG90/+fhP37lio6gNhjCx9WBJw= 180 | github.com/hajimehoshi/oto v0.1.1/go.mod h1:hUiLWeBQnbDu4pZsAhOnGqMI1ZGibS6e2qhQdfpwz04= 181 | github.com/hajimehoshi/oto v0.3.1 h1:cpf/uIv4Q0oc5uf9loQn7PIehv+mZerh+0KKma6gzMk= 182 | github.com/hajimehoshi/oto v0.3.1/go.mod h1:e9eTLBB9iZto045HLbzfHJIc+jP3xaKrjZTghvb6fdM= 183 | github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= 184 | github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= 185 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 186 | github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 187 | github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 188 | github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= 189 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 190 | github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= 191 | github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= 192 | github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= 193 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 194 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 195 | github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 196 | github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 197 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 198 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 199 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= 200 | github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= 201 | github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= 202 | github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= 203 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 204 | github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= 205 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 206 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 207 | github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= 208 | github.com/jfreymuth/oggvorbis v1.0.0/go.mod h1:abe6F9QRjuU9l+2jek3gj46lu40N4qlYxh2grqkLEDM= 209 | github.com/jfreymuth/vorbis v1.0.0/go.mod h1:8zy3lUAm9K/rJJk223RKy6vjCZTWC61NA2QD06bfOE0= 210 | github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= 211 | github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 212 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 213 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 214 | github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 215 | github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 216 | github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= 217 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 218 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 219 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 220 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 221 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 222 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 223 | github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 224 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 225 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 226 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 227 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 228 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 229 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 230 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 231 | github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= 232 | github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= 233 | github.com/lucasb-eyer/go-colorful v0.0.0-20181028223441-12d3b2882a08/go.mod h1:NXg0ArsFk0Y01623LgUqoqcouGDB+PwCCQlrwrG6xJ4= 234 | github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= 235 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 236 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 237 | github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 238 | github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 239 | github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 240 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 241 | github.com/mewkiz/flac v1.0.5/go.mod h1:EHZNU32dMF6alpurYyKHDLYpW1lYpBZ5WrXi/VuNIGs= 242 | github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= 243 | github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= 244 | github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 245 | github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= 246 | github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= 247 | github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= 248 | github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 249 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 250 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 251 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 252 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 253 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 254 | github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= 255 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 256 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 257 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 258 | github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= 259 | github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= 260 | github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= 261 | github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= 262 | github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= 263 | github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= 264 | github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= 265 | github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= 266 | github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= 267 | github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= 268 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 269 | github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 270 | github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 271 | github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= 272 | github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= 273 | github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= 274 | github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 275 | github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 276 | github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= 277 | github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= 278 | github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= 279 | github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= 280 | github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= 281 | github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 282 | github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= 283 | github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= 284 | github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= 285 | github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= 286 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 287 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 288 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 289 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 290 | github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= 291 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 292 | github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= 293 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 294 | github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= 295 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 296 | github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= 297 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 298 | github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg= 299 | github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= 300 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 301 | github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 302 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 303 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 304 | github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 305 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 306 | github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 307 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 308 | github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= 309 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 310 | github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= 311 | github.com/prometheus/common v0.27.0 h1:kJb5BtkTmonXrV2nfyRRlChGpgqhPCdj2ooGivZ8txo= 312 | github.com/prometheus/common v0.27.0/go.mod h1:LdLj/WiR+LL0ThCPrtSZbijrsxInIhizDTiPlJhPPq4= 313 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 314 | github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 315 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 316 | github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= 317 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 318 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 319 | github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= 320 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 321 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 322 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 323 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= 324 | github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= 325 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= 326 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 327 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 328 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 329 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 330 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 331 | github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 332 | github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= 333 | github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= 334 | github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 335 | github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 336 | github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= 337 | github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= 338 | github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= 339 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 340 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 341 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 342 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 343 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 344 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 345 | github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 346 | github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= 347 | github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= 348 | github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 349 | github.com/youpy/go-riff v0.0.0-20131220112943-557d78c11efb h1:RDh7U5Di6o7fblIBe7rVi9KnrcOXUbLwvvLLdP2InSI= 350 | github.com/youpy/go-riff v0.0.0-20131220112943-557d78c11efb/go.mod h1:83nxdDV4Z9RzrTut9losK7ve4hUnxUR8ASSz4BsKXwQ= 351 | github.com/youpy/go-wav v0.1.0 h1:MehxSoflnZoDmiILNQ6WMQpTuRuFpRnq213YqQ7WPRk= 352 | github.com/youpy/go-wav v0.1.0/go.mod h1:ZyTUfNrGKaH/wPNGf2W9Se6sNtZRlY+b98kckKmYLS8= 353 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 354 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 355 | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 356 | go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 357 | go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= 358 | go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= 359 | go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= 360 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 361 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 362 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 363 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 364 | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 365 | go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 366 | go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= 367 | go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 368 | go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= 369 | go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= 370 | go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 371 | go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= 372 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 373 | golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 374 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 375 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 376 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 377 | golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 378 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 379 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 380 | golang.org/x/exp v0.0.0-20180710024300-14dda7b62fcd/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 381 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 382 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 383 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 384 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= 385 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= 386 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 387 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 388 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 389 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= 390 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= 391 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 392 | golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 393 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 394 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= 395 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 396 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 397 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 398 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 399 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 400 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 401 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 402 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 403 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 404 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 405 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 406 | golang.org/x/mobile v0.0.0-20180806140643-507816974b79/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 407 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 408 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= 409 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 410 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 411 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 412 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 413 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 414 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 415 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 416 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 417 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 418 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 419 | golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 420 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 421 | golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 422 | golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 423 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 424 | golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 425 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 426 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 427 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 428 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 429 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 430 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 431 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 432 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 433 | golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 434 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 435 | golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 436 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 437 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 438 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 439 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 440 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 441 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 442 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 443 | golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 444 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 445 | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 446 | golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 447 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 448 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 449 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 450 | golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 451 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 452 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 453 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 454 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 455 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 456 | golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 457 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 458 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 459 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 460 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 461 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 462 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 463 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 464 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 465 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 466 | golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 467 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 468 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 469 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 470 | golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 471 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 472 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 473 | golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 474 | golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 475 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 476 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 477 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 478 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 479 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 480 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 481 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 482 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 483 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 484 | golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 485 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 486 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 487 | golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 488 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 489 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 490 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 491 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 492 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 493 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 494 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 495 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 496 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 497 | golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 498 | golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 499 | golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 500 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 501 | golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 502 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 503 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 504 | golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 505 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 506 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 507 | golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 508 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c= 509 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 510 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 511 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 512 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 513 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 514 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 515 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 516 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 517 | golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 518 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 519 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 520 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 521 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 522 | golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 523 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 524 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 525 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 526 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 527 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 528 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 529 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 530 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 531 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 532 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 533 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 534 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 535 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 536 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 537 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 538 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 539 | golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 540 | golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 541 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 542 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 543 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 544 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 545 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 546 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 547 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 548 | golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 549 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 550 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 551 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 552 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 553 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 554 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 555 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 556 | golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 557 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 558 | golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 559 | golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 560 | golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 561 | golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 562 | golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 563 | golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 564 | golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 565 | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 566 | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 567 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 568 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 569 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 570 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 571 | google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= 572 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 573 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 574 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 575 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 576 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 577 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 578 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 579 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 580 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 581 | google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 582 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 583 | google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 584 | google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 585 | google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 586 | google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= 587 | google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= 588 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 589 | google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 590 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 591 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 592 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 593 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 594 | google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 595 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 596 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 597 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 598 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 599 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 600 | google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= 601 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 602 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 603 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= 604 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 605 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 606 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 607 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 608 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 609 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 610 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= 611 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 612 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 613 | google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 614 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 615 | google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 616 | google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 617 | google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 618 | google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 619 | google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= 620 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 621 | google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= 622 | google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 623 | google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 624 | google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 625 | google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= 626 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 627 | google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= 628 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 629 | google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 630 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 631 | google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 632 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 633 | google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 634 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 635 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 636 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 637 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 638 | google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= 639 | google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= 640 | google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 641 | google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 642 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 643 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 644 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 645 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 646 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 647 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 648 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 649 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 650 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 651 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 652 | gopkg.in/DATA-DOG/go-sqlmock.v1 v1.3.0/go.mod h1:OdE7CF6DbADk7lN8LIKRzRJTTZXIjtWgA5THM5lhBAw= 653 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 654 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 655 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 656 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 657 | gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= 658 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 659 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 660 | gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= 661 | gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 662 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 663 | gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 664 | gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 665 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 666 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 667 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 668 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 669 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 670 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 671 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 672 | honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 673 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 674 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 675 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 676 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 677 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 678 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 679 | honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 680 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 681 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= 682 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= 683 | sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= 684 | sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= 685 | -------------------------------------------------------------------------------- /grafana/dashboards/prometheus-video-renderer.json: -------------------------------------------------------------------------------- 1 | { 2 | "__inputs": [ ], 3 | "__requires": [ ], 4 | "annotations": { 5 | "list": [ ] 6 | }, 7 | "editable": false, 8 | "gnetId": null, 9 | "graphTooltip": 0, 10 | "hideControls": false, 11 | "id": null, 12 | "links": [ ], 13 | "panels": [ 14 | { 15 | "aliasColors": { }, 16 | "bars": false, 17 | "dashLength": 10, 18 | "dashes": false, 19 | "datasource": "Prometheus", 20 | "fill": 0, 21 | "fillGradient": 0, 22 | "gridPos": { 23 | "h": 25, 24 | "w": 24, 25 | "x": 0, 26 | "y": 0 27 | }, 28 | "id": 2, 29 | "interval": "1s", 30 | "legend": { 31 | "alignAsTable": false, 32 | "avg": false, 33 | "current": false, 34 | "max": false, 35 | "min": false, 36 | "rightSide": false, 37 | "show": false, 38 | "sideWidth": null, 39 | "total": false, 40 | "values": false 41 | }, 42 | "lines": true, 43 | "linewidth": 2, 44 | "links": [ ], 45 | "nullPointMode": "null", 46 | "percentage": false, 47 | "pointradius": 5, 48 | "points": false, 49 | "renderer": "flot", 50 | "repeat": null, 51 | "seriesOverrides": [ 52 | { 53 | "alias": "r0", 54 | "color": "rgb(0, 0, 0)" 55 | }, 56 | { 57 | "alias": "r1", 58 | "color": "rgb(1, 0, 0)" 59 | }, 60 | { 61 | "alias": "r2", 62 | "color": "rgb(2, 0, 0)" 63 | }, 64 | { 65 | "alias": "r3", 66 | "color": "rgb(3, 0, 0)" 67 | }, 68 | { 69 | "alias": "r4", 70 | "color": "rgb(4, 0, 0)" 71 | }, 72 | { 73 | "alias": "r5", 74 | "color": "rgb(5, 0, 0)" 75 | }, 76 | { 77 | "alias": "r6", 78 | "color": "rgb(6, 0, 0)" 79 | }, 80 | { 81 | "alias": "r7", 82 | "color": "rgb(7, 0, 0)" 83 | }, 84 | { 85 | "alias": "r8", 86 | "color": "rgb(8, 0, 0)" 87 | }, 88 | { 89 | "alias": "r9", 90 | "color": "rgb(9, 0, 0)" 91 | }, 92 | { 93 | "alias": "r10", 94 | "color": "rgb(10, 0, 0)" 95 | }, 96 | { 97 | "alias": "r11", 98 | "color": "rgb(11, 0, 0)" 99 | }, 100 | { 101 | "alias": "r12", 102 | "color": "rgb(12, 0, 0)" 103 | }, 104 | { 105 | "alias": "r13", 106 | "color": "rgb(13, 0, 0)" 107 | }, 108 | { 109 | "alias": "r14", 110 | "color": "rgb(14, 0, 0)" 111 | }, 112 | { 113 | "alias": "r15", 114 | "color": "rgb(15, 0, 0)" 115 | }, 116 | { 117 | "alias": "r16", 118 | "color": "rgb(16, 0, 0)" 119 | }, 120 | { 121 | "alias": "r17", 122 | "color": "rgb(17, 0, 0)" 123 | }, 124 | { 125 | "alias": "r18", 126 | "color": "rgb(18, 0, 0)" 127 | }, 128 | { 129 | "alias": "r19", 130 | "color": "rgb(19, 0, 0)" 131 | }, 132 | { 133 | "alias": "r20", 134 | "color": "rgb(20, 0, 0)" 135 | }, 136 | { 137 | "alias": "r21", 138 | "color": "rgb(21, 0, 0)" 139 | }, 140 | { 141 | "alias": "r22", 142 | "color": "rgb(22, 0, 0)" 143 | }, 144 | { 145 | "alias": "r23", 146 | "color": "rgb(23, 0, 0)" 147 | }, 148 | { 149 | "alias": "r24", 150 | "color": "rgb(24, 0, 0)" 151 | }, 152 | { 153 | "alias": "r25", 154 | "color": "rgb(25, 0, 0)" 155 | }, 156 | { 157 | "alias": "r26", 158 | "color": "rgb(26, 0, 0)" 159 | }, 160 | { 161 | "alias": "r27", 162 | "color": "rgb(27, 0, 0)" 163 | }, 164 | { 165 | "alias": "r28", 166 | "color": "rgb(28, 0, 0)" 167 | }, 168 | { 169 | "alias": "r29", 170 | "color": "rgb(29, 0, 0)" 171 | }, 172 | { 173 | "alias": "r30", 174 | "color": "rgb(30, 0, 0)" 175 | }, 176 | { 177 | "alias": "r31", 178 | "color": "rgb(31, 0, 0)" 179 | }, 180 | { 181 | "alias": "r32", 182 | "color": "rgb(32, 0, 0)" 183 | }, 184 | { 185 | "alias": "r33", 186 | "color": "rgb(33, 0, 0)" 187 | }, 188 | { 189 | "alias": "r34", 190 | "color": "rgb(34, 0, 0)" 191 | }, 192 | { 193 | "alias": "r35", 194 | "color": "rgb(35, 0, 0)" 195 | }, 196 | { 197 | "alias": "r36", 198 | "color": "rgb(36, 0, 0)" 199 | }, 200 | { 201 | "alias": "r37", 202 | "color": "rgb(37, 0, 0)" 203 | }, 204 | { 205 | "alias": "r38", 206 | "color": "rgb(38, 0, 0)" 207 | }, 208 | { 209 | "alias": "r39", 210 | "color": "rgb(39, 0, 0)" 211 | }, 212 | { 213 | "alias": "r40", 214 | "color": "rgb(40, 0, 0)" 215 | }, 216 | { 217 | "alias": "r41", 218 | "color": "rgb(41, 0, 0)" 219 | }, 220 | { 221 | "alias": "r42", 222 | "color": "rgb(42, 0, 0)" 223 | }, 224 | { 225 | "alias": "r43", 226 | "color": "rgb(43, 0, 0)" 227 | }, 228 | { 229 | "alias": "r44", 230 | "color": "rgb(44, 0, 0)" 231 | }, 232 | { 233 | "alias": "r45", 234 | "color": "rgb(45, 0, 0)" 235 | }, 236 | { 237 | "alias": "r46", 238 | "color": "rgb(46, 0, 0)" 239 | }, 240 | { 241 | "alias": "r47", 242 | "color": "rgb(47, 0, 0)" 243 | }, 244 | { 245 | "alias": "r48", 246 | "color": "rgb(48, 0, 0)" 247 | }, 248 | { 249 | "alias": "r49", 250 | "color": "rgb(49, 0, 0)" 251 | }, 252 | { 253 | "alias": "r50", 254 | "color": "rgb(50, 0, 0)" 255 | }, 256 | { 257 | "alias": "r51", 258 | "color": "rgb(51, 0, 0)" 259 | }, 260 | { 261 | "alias": "r52", 262 | "color": "rgb(52, 0, 0)" 263 | }, 264 | { 265 | "alias": "r53", 266 | "color": "rgb(53, 0, 0)" 267 | }, 268 | { 269 | "alias": "r54", 270 | "color": "rgb(54, 0, 0)" 271 | }, 272 | { 273 | "alias": "r55", 274 | "color": "rgb(55, 0, 0)" 275 | }, 276 | { 277 | "alias": "r56", 278 | "color": "rgb(56, 0, 0)" 279 | }, 280 | { 281 | "alias": "r57", 282 | "color": "rgb(57, 0, 0)" 283 | }, 284 | { 285 | "alias": "r58", 286 | "color": "rgb(58, 0, 0)" 287 | }, 288 | { 289 | "alias": "r59", 290 | "color": "rgb(59, 0, 0)" 291 | }, 292 | { 293 | "alias": "r60", 294 | "color": "rgb(60, 0, 0)" 295 | }, 296 | { 297 | "alias": "r61", 298 | "color": "rgb(61, 0, 0)" 299 | }, 300 | { 301 | "alias": "r62", 302 | "color": "rgb(62, 0, 0)" 303 | }, 304 | { 305 | "alias": "r63", 306 | "color": "rgb(63, 0, 0)" 307 | }, 308 | { 309 | "alias": "r64", 310 | "color": "rgb(64, 0, 0)" 311 | }, 312 | { 313 | "alias": "r65", 314 | "color": "rgb(65, 0, 0)" 315 | }, 316 | { 317 | "alias": "r66", 318 | "color": "rgb(66, 0, 0)" 319 | }, 320 | { 321 | "alias": "r67", 322 | "color": "rgb(67, 0, 0)" 323 | }, 324 | { 325 | "alias": "r68", 326 | "color": "rgb(68, 0, 0)" 327 | }, 328 | { 329 | "alias": "r69", 330 | "color": "rgb(69, 0, 0)" 331 | }, 332 | { 333 | "alias": "r70", 334 | "color": "rgb(70, 0, 0)" 335 | }, 336 | { 337 | "alias": "r71", 338 | "color": "rgb(71, 0, 0)" 339 | }, 340 | { 341 | "alias": "r72", 342 | "color": "rgb(72, 0, 0)" 343 | }, 344 | { 345 | "alias": "r73", 346 | "color": "rgb(73, 0, 0)" 347 | }, 348 | { 349 | "alias": "r74", 350 | "color": "rgb(74, 0, 0)" 351 | }, 352 | { 353 | "alias": "r75", 354 | "color": "rgb(75, 0, 0)" 355 | }, 356 | { 357 | "alias": "r76", 358 | "color": "rgb(76, 0, 0)" 359 | }, 360 | { 361 | "alias": "r77", 362 | "color": "rgb(77, 0, 0)" 363 | }, 364 | { 365 | "alias": "r78", 366 | "color": "rgb(78, 0, 0)" 367 | }, 368 | { 369 | "alias": "r79", 370 | "color": "rgb(79, 0, 0)" 371 | }, 372 | { 373 | "alias": "r80", 374 | "color": "rgb(80, 0, 0)" 375 | }, 376 | { 377 | "alias": "r81", 378 | "color": "rgb(81, 0, 0)" 379 | }, 380 | { 381 | "alias": "r82", 382 | "color": "rgb(82, 0, 0)" 383 | }, 384 | { 385 | "alias": "r83", 386 | "color": "rgb(83, 0, 0)" 387 | }, 388 | { 389 | "alias": "r84", 390 | "color": "rgb(84, 0, 0)" 391 | }, 392 | { 393 | "alias": "r85", 394 | "color": "rgb(85, 0, 0)" 395 | }, 396 | { 397 | "alias": "r86", 398 | "color": "rgb(86, 0, 0)" 399 | }, 400 | { 401 | "alias": "r87", 402 | "color": "rgb(87, 0, 0)" 403 | }, 404 | { 405 | "alias": "r88", 406 | "color": "rgb(88, 0, 0)" 407 | }, 408 | { 409 | "alias": "r89", 410 | "color": "rgb(89, 0, 0)" 411 | }, 412 | { 413 | "alias": "r90", 414 | "color": "rgb(90, 0, 0)" 415 | }, 416 | { 417 | "alias": "r91", 418 | "color": "rgb(91, 0, 0)" 419 | }, 420 | { 421 | "alias": "r92", 422 | "color": "rgb(92, 0, 0)" 423 | }, 424 | { 425 | "alias": "r93", 426 | "color": "rgb(93, 0, 0)" 427 | }, 428 | { 429 | "alias": "r94", 430 | "color": "rgb(94, 0, 0)" 431 | }, 432 | { 433 | "alias": "r95", 434 | "color": "rgb(95, 0, 0)" 435 | }, 436 | { 437 | "alias": "r96", 438 | "color": "rgb(96, 0, 0)" 439 | }, 440 | { 441 | "alias": "r97", 442 | "color": "rgb(97, 0, 0)" 443 | }, 444 | { 445 | "alias": "r98", 446 | "color": "rgb(98, 0, 0)" 447 | }, 448 | { 449 | "alias": "r99", 450 | "color": "rgb(99, 0, 0)" 451 | }, 452 | { 453 | "alias": "r100", 454 | "color": "rgb(100, 0, 0)" 455 | }, 456 | { 457 | "alias": "r101", 458 | "color": "rgb(101, 0, 0)" 459 | }, 460 | { 461 | "alias": "r102", 462 | "color": "rgb(102, 0, 0)" 463 | }, 464 | { 465 | "alias": "r103", 466 | "color": "rgb(103, 0, 0)" 467 | }, 468 | { 469 | "alias": "r104", 470 | "color": "rgb(104, 0, 0)" 471 | }, 472 | { 473 | "alias": "r105", 474 | "color": "rgb(105, 0, 0)" 475 | }, 476 | { 477 | "alias": "r106", 478 | "color": "rgb(106, 0, 0)" 479 | }, 480 | { 481 | "alias": "r107", 482 | "color": "rgb(107, 0, 0)" 483 | }, 484 | { 485 | "alias": "r108", 486 | "color": "rgb(108, 0, 0)" 487 | }, 488 | { 489 | "alias": "r109", 490 | "color": "rgb(109, 0, 0)" 491 | }, 492 | { 493 | "alias": "r110", 494 | "color": "rgb(110, 0, 0)" 495 | }, 496 | { 497 | "alias": "r111", 498 | "color": "rgb(111, 0, 0)" 499 | }, 500 | { 501 | "alias": "r112", 502 | "color": "rgb(112, 0, 0)" 503 | }, 504 | { 505 | "alias": "r113", 506 | "color": "rgb(113, 0, 0)" 507 | }, 508 | { 509 | "alias": "r114", 510 | "color": "rgb(114, 0, 0)" 511 | }, 512 | { 513 | "alias": "r115", 514 | "color": "rgb(115, 0, 0)" 515 | }, 516 | { 517 | "alias": "r116", 518 | "color": "rgb(116, 0, 0)" 519 | }, 520 | { 521 | "alias": "r117", 522 | "color": "rgb(117, 0, 0)" 523 | }, 524 | { 525 | "alias": "r118", 526 | "color": "rgb(118, 0, 0)" 527 | }, 528 | { 529 | "alias": "r119", 530 | "color": "rgb(119, 0, 0)" 531 | }, 532 | { 533 | "alias": "r120", 534 | "color": "rgb(120, 0, 0)" 535 | }, 536 | { 537 | "alias": "r121", 538 | "color": "rgb(121, 0, 0)" 539 | }, 540 | { 541 | "alias": "r122", 542 | "color": "rgb(122, 0, 0)" 543 | }, 544 | { 545 | "alias": "r123", 546 | "color": "rgb(123, 0, 0)" 547 | }, 548 | { 549 | "alias": "r124", 550 | "color": "rgb(124, 0, 0)" 551 | }, 552 | { 553 | "alias": "r125", 554 | "color": "rgb(125, 0, 0)" 555 | }, 556 | { 557 | "alias": "r126", 558 | "color": "rgb(126, 0, 0)" 559 | }, 560 | { 561 | "alias": "r127", 562 | "color": "rgb(127, 0, 0)" 563 | }, 564 | { 565 | "alias": "r128", 566 | "color": "rgb(128, 0, 0)" 567 | }, 568 | { 569 | "alias": "r129", 570 | "color": "rgb(129, 0, 0)" 571 | }, 572 | { 573 | "alias": "r130", 574 | "color": "rgb(130, 0, 0)" 575 | }, 576 | { 577 | "alias": "r131", 578 | "color": "rgb(131, 0, 0)" 579 | }, 580 | { 581 | "alias": "r132", 582 | "color": "rgb(132, 0, 0)" 583 | }, 584 | { 585 | "alias": "r133", 586 | "color": "rgb(133, 0, 0)" 587 | }, 588 | { 589 | "alias": "r134", 590 | "color": "rgb(134, 0, 0)" 591 | }, 592 | { 593 | "alias": "r135", 594 | "color": "rgb(135, 0, 0)" 595 | }, 596 | { 597 | "alias": "r136", 598 | "color": "rgb(136, 0, 0)" 599 | }, 600 | { 601 | "alias": "r137", 602 | "color": "rgb(137, 0, 0)" 603 | }, 604 | { 605 | "alias": "r138", 606 | "color": "rgb(138, 0, 0)" 607 | }, 608 | { 609 | "alias": "r139", 610 | "color": "rgb(139, 0, 0)" 611 | }, 612 | { 613 | "alias": "r140", 614 | "color": "rgb(140, 0, 0)" 615 | }, 616 | { 617 | "alias": "r141", 618 | "color": "rgb(141, 0, 0)" 619 | }, 620 | { 621 | "alias": "r142", 622 | "color": "rgb(142, 0, 0)" 623 | }, 624 | { 625 | "alias": "r143", 626 | "color": "rgb(143, 0, 0)" 627 | }, 628 | { 629 | "alias": "r144", 630 | "color": "rgb(144, 0, 0)" 631 | }, 632 | { 633 | "alias": "r145", 634 | "color": "rgb(145, 0, 0)" 635 | }, 636 | { 637 | "alias": "r146", 638 | "color": "rgb(146, 0, 0)" 639 | }, 640 | { 641 | "alias": "r147", 642 | "color": "rgb(147, 0, 0)" 643 | }, 644 | { 645 | "alias": "r148", 646 | "color": "rgb(148, 0, 0)" 647 | }, 648 | { 649 | "alias": "r149", 650 | "color": "rgb(149, 0, 0)" 651 | }, 652 | { 653 | "alias": "r150", 654 | "color": "rgb(150, 0, 0)" 655 | }, 656 | { 657 | "alias": "r151", 658 | "color": "rgb(151, 0, 0)" 659 | }, 660 | { 661 | "alias": "r152", 662 | "color": "rgb(152, 0, 0)" 663 | }, 664 | { 665 | "alias": "r153", 666 | "color": "rgb(153, 0, 0)" 667 | }, 668 | { 669 | "alias": "r154", 670 | "color": "rgb(154, 0, 0)" 671 | }, 672 | { 673 | "alias": "r155", 674 | "color": "rgb(155, 0, 0)" 675 | }, 676 | { 677 | "alias": "r156", 678 | "color": "rgb(156, 0, 0)" 679 | }, 680 | { 681 | "alias": "r157", 682 | "color": "rgb(157, 0, 0)" 683 | }, 684 | { 685 | "alias": "r158", 686 | "color": "rgb(158, 0, 0)" 687 | }, 688 | { 689 | "alias": "r159", 690 | "color": "rgb(159, 0, 0)" 691 | }, 692 | { 693 | "alias": "r160", 694 | "color": "rgb(160, 0, 0)" 695 | }, 696 | { 697 | "alias": "r161", 698 | "color": "rgb(161, 0, 0)" 699 | }, 700 | { 701 | "alias": "r162", 702 | "color": "rgb(162, 0, 0)" 703 | }, 704 | { 705 | "alias": "r163", 706 | "color": "rgb(163, 0, 0)" 707 | }, 708 | { 709 | "alias": "r164", 710 | "color": "rgb(164, 0, 0)" 711 | }, 712 | { 713 | "alias": "r165", 714 | "color": "rgb(165, 0, 0)" 715 | }, 716 | { 717 | "alias": "r166", 718 | "color": "rgb(166, 0, 0)" 719 | }, 720 | { 721 | "alias": "r167", 722 | "color": "rgb(167, 0, 0)" 723 | }, 724 | { 725 | "alias": "r168", 726 | "color": "rgb(168, 0, 0)" 727 | }, 728 | { 729 | "alias": "r169", 730 | "color": "rgb(169, 0, 0)" 731 | }, 732 | { 733 | "alias": "r170", 734 | "color": "rgb(170, 0, 0)" 735 | }, 736 | { 737 | "alias": "r171", 738 | "color": "rgb(171, 0, 0)" 739 | }, 740 | { 741 | "alias": "r172", 742 | "color": "rgb(172, 0, 0)" 743 | }, 744 | { 745 | "alias": "r173", 746 | "color": "rgb(173, 0, 0)" 747 | }, 748 | { 749 | "alias": "r174", 750 | "color": "rgb(174, 0, 0)" 751 | }, 752 | { 753 | "alias": "r175", 754 | "color": "rgb(175, 0, 0)" 755 | }, 756 | { 757 | "alias": "r176", 758 | "color": "rgb(176, 0, 0)" 759 | }, 760 | { 761 | "alias": "r177", 762 | "color": "rgb(177, 0, 0)" 763 | }, 764 | { 765 | "alias": "r178", 766 | "color": "rgb(178, 0, 0)" 767 | }, 768 | { 769 | "alias": "r179", 770 | "color": "rgb(179, 0, 0)" 771 | }, 772 | { 773 | "alias": "r180", 774 | "color": "rgb(180, 0, 0)" 775 | }, 776 | { 777 | "alias": "r181", 778 | "color": "rgb(181, 0, 0)" 779 | }, 780 | { 781 | "alias": "r182", 782 | "color": "rgb(182, 0, 0)" 783 | }, 784 | { 785 | "alias": "r183", 786 | "color": "rgb(183, 0, 0)" 787 | }, 788 | { 789 | "alias": "r184", 790 | "color": "rgb(184, 0, 0)" 791 | }, 792 | { 793 | "alias": "r185", 794 | "color": "rgb(185, 0, 0)" 795 | }, 796 | { 797 | "alias": "r186", 798 | "color": "rgb(186, 0, 0)" 799 | }, 800 | { 801 | "alias": "r187", 802 | "color": "rgb(187, 0, 0)" 803 | }, 804 | { 805 | "alias": "r188", 806 | "color": "rgb(188, 0, 0)" 807 | }, 808 | { 809 | "alias": "r189", 810 | "color": "rgb(189, 0, 0)" 811 | }, 812 | { 813 | "alias": "r190", 814 | "color": "rgb(190, 0, 0)" 815 | }, 816 | { 817 | "alias": "r191", 818 | "color": "rgb(191, 0, 0)" 819 | }, 820 | { 821 | "alias": "r192", 822 | "color": "rgb(192, 0, 0)" 823 | }, 824 | { 825 | "alias": "r193", 826 | "color": "rgb(193, 0, 0)" 827 | }, 828 | { 829 | "alias": "r194", 830 | "color": "rgb(194, 0, 0)" 831 | }, 832 | { 833 | "alias": "r195", 834 | "color": "rgb(195, 0, 0)" 835 | }, 836 | { 837 | "alias": "r196", 838 | "color": "rgb(196, 0, 0)" 839 | }, 840 | { 841 | "alias": "r197", 842 | "color": "rgb(197, 0, 0)" 843 | }, 844 | { 845 | "alias": "r198", 846 | "color": "rgb(198, 0, 0)" 847 | }, 848 | { 849 | "alias": "r199", 850 | "color": "rgb(199, 0, 0)" 851 | }, 852 | { 853 | "alias": "r200", 854 | "color": "rgb(200, 0, 0)" 855 | }, 856 | { 857 | "alias": "r201", 858 | "color": "rgb(201, 0, 0)" 859 | }, 860 | { 861 | "alias": "r202", 862 | "color": "rgb(202, 0, 0)" 863 | }, 864 | { 865 | "alias": "r203", 866 | "color": "rgb(203, 0, 0)" 867 | }, 868 | { 869 | "alias": "r204", 870 | "color": "rgb(204, 0, 0)" 871 | }, 872 | { 873 | "alias": "r205", 874 | "color": "rgb(205, 0, 0)" 875 | }, 876 | { 877 | "alias": "r206", 878 | "color": "rgb(206, 0, 0)" 879 | }, 880 | { 881 | "alias": "r207", 882 | "color": "rgb(207, 0, 0)" 883 | }, 884 | { 885 | "alias": "r208", 886 | "color": "rgb(208, 0, 0)" 887 | }, 888 | { 889 | "alias": "r209", 890 | "color": "rgb(209, 0, 0)" 891 | }, 892 | { 893 | "alias": "r210", 894 | "color": "rgb(210, 0, 0)" 895 | }, 896 | { 897 | "alias": "r211", 898 | "color": "rgb(211, 0, 0)" 899 | }, 900 | { 901 | "alias": "r212", 902 | "color": "rgb(212, 0, 0)" 903 | }, 904 | { 905 | "alias": "r213", 906 | "color": "rgb(213, 0, 0)" 907 | }, 908 | { 909 | "alias": "r214", 910 | "color": "rgb(214, 0, 0)" 911 | }, 912 | { 913 | "alias": "r215", 914 | "color": "rgb(215, 0, 0)" 915 | }, 916 | { 917 | "alias": "r216", 918 | "color": "rgb(216, 0, 0)" 919 | }, 920 | { 921 | "alias": "r217", 922 | "color": "rgb(217, 0, 0)" 923 | }, 924 | { 925 | "alias": "r218", 926 | "color": "rgb(218, 0, 0)" 927 | }, 928 | { 929 | "alias": "r219", 930 | "color": "rgb(219, 0, 0)" 931 | }, 932 | { 933 | "alias": "r220", 934 | "color": "rgb(220, 0, 0)" 935 | }, 936 | { 937 | "alias": "r221", 938 | "color": "rgb(221, 0, 0)" 939 | }, 940 | { 941 | "alias": "r222", 942 | "color": "rgb(222, 0, 0)" 943 | }, 944 | { 945 | "alias": "r223", 946 | "color": "rgb(223, 0, 0)" 947 | }, 948 | { 949 | "alias": "r224", 950 | "color": "rgb(224, 0, 0)" 951 | }, 952 | { 953 | "alias": "r225", 954 | "color": "rgb(225, 0, 0)" 955 | }, 956 | { 957 | "alias": "r226", 958 | "color": "rgb(226, 0, 0)" 959 | }, 960 | { 961 | "alias": "r227", 962 | "color": "rgb(227, 0, 0)" 963 | }, 964 | { 965 | "alias": "r228", 966 | "color": "rgb(228, 0, 0)" 967 | }, 968 | { 969 | "alias": "r229", 970 | "color": "rgb(229, 0, 0)" 971 | }, 972 | { 973 | "alias": "r230", 974 | "color": "rgb(230, 0, 0)" 975 | }, 976 | { 977 | "alias": "r231", 978 | "color": "rgb(231, 0, 0)" 979 | }, 980 | { 981 | "alias": "r232", 982 | "color": "rgb(232, 0, 0)" 983 | }, 984 | { 985 | "alias": "r233", 986 | "color": "rgb(233, 0, 0)" 987 | }, 988 | { 989 | "alias": "r234", 990 | "color": "rgb(234, 0, 0)" 991 | }, 992 | { 993 | "alias": "r235", 994 | "color": "rgb(235, 0, 0)" 995 | }, 996 | { 997 | "alias": "r236", 998 | "color": "rgb(236, 0, 0)" 999 | }, 1000 | { 1001 | "alias": "r237", 1002 | "color": "rgb(237, 0, 0)" 1003 | }, 1004 | { 1005 | "alias": "r238", 1006 | "color": "rgb(238, 0, 0)" 1007 | }, 1008 | { 1009 | "alias": "r239", 1010 | "color": "rgb(239, 0, 0)" 1011 | }, 1012 | { 1013 | "alias": "r240", 1014 | "color": "rgb(240, 0, 0)" 1015 | }, 1016 | { 1017 | "alias": "r241", 1018 | "color": "rgb(241, 0, 0)" 1019 | }, 1020 | { 1021 | "alias": "r242", 1022 | "color": "rgb(242, 0, 0)" 1023 | }, 1024 | { 1025 | "alias": "r243", 1026 | "color": "rgb(243, 0, 0)" 1027 | }, 1028 | { 1029 | "alias": "r244", 1030 | "color": "rgb(244, 0, 0)" 1031 | }, 1032 | { 1033 | "alias": "r245", 1034 | "color": "rgb(245, 0, 0)" 1035 | }, 1036 | { 1037 | "alias": "r246", 1038 | "color": "rgb(246, 0, 0)" 1039 | }, 1040 | { 1041 | "alias": "r247", 1042 | "color": "rgb(247, 0, 0)" 1043 | }, 1044 | { 1045 | "alias": "r248", 1046 | "color": "rgb(248, 0, 0)" 1047 | }, 1048 | { 1049 | "alias": "r249", 1050 | "color": "rgb(249, 0, 0)" 1051 | }, 1052 | { 1053 | "alias": "r250", 1054 | "color": "rgb(250, 0, 0)" 1055 | }, 1056 | { 1057 | "alias": "r251", 1058 | "color": "rgb(251, 0, 0)" 1059 | }, 1060 | { 1061 | "alias": "r252", 1062 | "color": "rgb(252, 0, 0)" 1063 | }, 1064 | { 1065 | "alias": "r253", 1066 | "color": "rgb(253, 0, 0)" 1067 | }, 1068 | { 1069 | "alias": "r254", 1070 | "color": "rgb(254, 0, 0)" 1071 | }, 1072 | { 1073 | "alias": "r255", 1074 | "color": "rgb(255, 0, 0)" 1075 | }, 1076 | { 1077 | "alias": "g0", 1078 | "color": "rgb(0, 0, 0)" 1079 | }, 1080 | { 1081 | "alias": "g1", 1082 | "color": "rgb(0, 1, 0)" 1083 | }, 1084 | { 1085 | "alias": "g2", 1086 | "color": "rgb(0, 2, 0)" 1087 | }, 1088 | { 1089 | "alias": "g3", 1090 | "color": "rgb(0, 3, 0)" 1091 | }, 1092 | { 1093 | "alias": "g4", 1094 | "color": "rgb(0, 4, 0)" 1095 | }, 1096 | { 1097 | "alias": "g5", 1098 | "color": "rgb(0, 5, 0)" 1099 | }, 1100 | { 1101 | "alias": "g6", 1102 | "color": "rgb(0, 6, 0)" 1103 | }, 1104 | { 1105 | "alias": "g7", 1106 | "color": "rgb(0, 7, 0)" 1107 | }, 1108 | { 1109 | "alias": "g8", 1110 | "color": "rgb(0, 8, 0)" 1111 | }, 1112 | { 1113 | "alias": "g9", 1114 | "color": "rgb(0, 9, 0)" 1115 | }, 1116 | { 1117 | "alias": "g10", 1118 | "color": "rgb(0, 10, 0)" 1119 | }, 1120 | { 1121 | "alias": "g11", 1122 | "color": "rgb(0, 11, 0)" 1123 | }, 1124 | { 1125 | "alias": "g12", 1126 | "color": "rgb(0, 12, 0)" 1127 | }, 1128 | { 1129 | "alias": "g13", 1130 | "color": "rgb(0, 13, 0)" 1131 | }, 1132 | { 1133 | "alias": "g14", 1134 | "color": "rgb(0, 14, 0)" 1135 | }, 1136 | { 1137 | "alias": "g15", 1138 | "color": "rgb(0, 15, 0)" 1139 | }, 1140 | { 1141 | "alias": "g16", 1142 | "color": "rgb(0, 16, 0)" 1143 | }, 1144 | { 1145 | "alias": "g17", 1146 | "color": "rgb(0, 17, 0)" 1147 | }, 1148 | { 1149 | "alias": "g18", 1150 | "color": "rgb(0, 18, 0)" 1151 | }, 1152 | { 1153 | "alias": "g19", 1154 | "color": "rgb(0, 19, 0)" 1155 | }, 1156 | { 1157 | "alias": "g20", 1158 | "color": "rgb(0, 20, 0)" 1159 | }, 1160 | { 1161 | "alias": "g21", 1162 | "color": "rgb(0, 21, 0)" 1163 | }, 1164 | { 1165 | "alias": "g22", 1166 | "color": "rgb(0, 22, 0)" 1167 | }, 1168 | { 1169 | "alias": "g23", 1170 | "color": "rgb(0, 23, 0)" 1171 | }, 1172 | { 1173 | "alias": "g24", 1174 | "color": "rgb(0, 24, 0)" 1175 | }, 1176 | { 1177 | "alias": "g25", 1178 | "color": "rgb(0, 25, 0)" 1179 | }, 1180 | { 1181 | "alias": "g26", 1182 | "color": "rgb(0, 26, 0)" 1183 | }, 1184 | { 1185 | "alias": "g27", 1186 | "color": "rgb(0, 27, 0)" 1187 | }, 1188 | { 1189 | "alias": "g28", 1190 | "color": "rgb(0, 28, 0)" 1191 | }, 1192 | { 1193 | "alias": "g29", 1194 | "color": "rgb(0, 29, 0)" 1195 | }, 1196 | { 1197 | "alias": "g30", 1198 | "color": "rgb(0, 30, 0)" 1199 | }, 1200 | { 1201 | "alias": "g31", 1202 | "color": "rgb(0, 31, 0)" 1203 | }, 1204 | { 1205 | "alias": "g32", 1206 | "color": "rgb(0, 32, 0)" 1207 | }, 1208 | { 1209 | "alias": "g33", 1210 | "color": "rgb(0, 33, 0)" 1211 | }, 1212 | { 1213 | "alias": "g34", 1214 | "color": "rgb(0, 34, 0)" 1215 | }, 1216 | { 1217 | "alias": "g35", 1218 | "color": "rgb(0, 35, 0)" 1219 | }, 1220 | { 1221 | "alias": "g36", 1222 | "color": "rgb(0, 36, 0)" 1223 | }, 1224 | { 1225 | "alias": "g37", 1226 | "color": "rgb(0, 37, 0)" 1227 | }, 1228 | { 1229 | "alias": "g38", 1230 | "color": "rgb(0, 38, 0)" 1231 | }, 1232 | { 1233 | "alias": "g39", 1234 | "color": "rgb(0, 39, 0)" 1235 | }, 1236 | { 1237 | "alias": "g40", 1238 | "color": "rgb(0, 40, 0)" 1239 | }, 1240 | { 1241 | "alias": "g41", 1242 | "color": "rgb(0, 41, 0)" 1243 | }, 1244 | { 1245 | "alias": "g42", 1246 | "color": "rgb(0, 42, 0)" 1247 | }, 1248 | { 1249 | "alias": "g43", 1250 | "color": "rgb(0, 43, 0)" 1251 | }, 1252 | { 1253 | "alias": "g44", 1254 | "color": "rgb(0, 44, 0)" 1255 | }, 1256 | { 1257 | "alias": "g45", 1258 | "color": "rgb(0, 45, 0)" 1259 | }, 1260 | { 1261 | "alias": "g46", 1262 | "color": "rgb(0, 46, 0)" 1263 | }, 1264 | { 1265 | "alias": "g47", 1266 | "color": "rgb(0, 47, 0)" 1267 | }, 1268 | { 1269 | "alias": "g48", 1270 | "color": "rgb(0, 48, 0)" 1271 | }, 1272 | { 1273 | "alias": "g49", 1274 | "color": "rgb(0, 49, 0)" 1275 | }, 1276 | { 1277 | "alias": "g50", 1278 | "color": "rgb(0, 50, 0)" 1279 | }, 1280 | { 1281 | "alias": "g51", 1282 | "color": "rgb(0, 51, 0)" 1283 | }, 1284 | { 1285 | "alias": "g52", 1286 | "color": "rgb(0, 52, 0)" 1287 | }, 1288 | { 1289 | "alias": "g53", 1290 | "color": "rgb(0, 53, 0)" 1291 | }, 1292 | { 1293 | "alias": "g54", 1294 | "color": "rgb(0, 54, 0)" 1295 | }, 1296 | { 1297 | "alias": "g55", 1298 | "color": "rgb(0, 55, 0)" 1299 | }, 1300 | { 1301 | "alias": "g56", 1302 | "color": "rgb(0, 56, 0)" 1303 | }, 1304 | { 1305 | "alias": "g57", 1306 | "color": "rgb(0, 57, 0)" 1307 | }, 1308 | { 1309 | "alias": "g58", 1310 | "color": "rgb(0, 58, 0)" 1311 | }, 1312 | { 1313 | "alias": "g59", 1314 | "color": "rgb(0, 59, 0)" 1315 | }, 1316 | { 1317 | "alias": "g60", 1318 | "color": "rgb(0, 60, 0)" 1319 | }, 1320 | { 1321 | "alias": "g61", 1322 | "color": "rgb(0, 61, 0)" 1323 | }, 1324 | { 1325 | "alias": "g62", 1326 | "color": "rgb(0, 62, 0)" 1327 | }, 1328 | { 1329 | "alias": "g63", 1330 | "color": "rgb(0, 63, 0)" 1331 | }, 1332 | { 1333 | "alias": "g64", 1334 | "color": "rgb(0, 64, 0)" 1335 | }, 1336 | { 1337 | "alias": "g65", 1338 | "color": "rgb(0, 65, 0)" 1339 | }, 1340 | { 1341 | "alias": "g66", 1342 | "color": "rgb(0, 66, 0)" 1343 | }, 1344 | { 1345 | "alias": "g67", 1346 | "color": "rgb(0, 67, 0)" 1347 | }, 1348 | { 1349 | "alias": "g68", 1350 | "color": "rgb(0, 68, 0)" 1351 | }, 1352 | { 1353 | "alias": "g69", 1354 | "color": "rgb(0, 69, 0)" 1355 | }, 1356 | { 1357 | "alias": "g70", 1358 | "color": "rgb(0, 70, 0)" 1359 | }, 1360 | { 1361 | "alias": "g71", 1362 | "color": "rgb(0, 71, 0)" 1363 | }, 1364 | { 1365 | "alias": "g72", 1366 | "color": "rgb(0, 72, 0)" 1367 | }, 1368 | { 1369 | "alias": "g73", 1370 | "color": "rgb(0, 73, 0)" 1371 | }, 1372 | { 1373 | "alias": "g74", 1374 | "color": "rgb(0, 74, 0)" 1375 | }, 1376 | { 1377 | "alias": "g75", 1378 | "color": "rgb(0, 75, 0)" 1379 | }, 1380 | { 1381 | "alias": "g76", 1382 | "color": "rgb(0, 76, 0)" 1383 | }, 1384 | { 1385 | "alias": "g77", 1386 | "color": "rgb(0, 77, 0)" 1387 | }, 1388 | { 1389 | "alias": "g78", 1390 | "color": "rgb(0, 78, 0)" 1391 | }, 1392 | { 1393 | "alias": "g79", 1394 | "color": "rgb(0, 79, 0)" 1395 | }, 1396 | { 1397 | "alias": "g80", 1398 | "color": "rgb(0, 80, 0)" 1399 | }, 1400 | { 1401 | "alias": "g81", 1402 | "color": "rgb(0, 81, 0)" 1403 | }, 1404 | { 1405 | "alias": "g82", 1406 | "color": "rgb(0, 82, 0)" 1407 | }, 1408 | { 1409 | "alias": "g83", 1410 | "color": "rgb(0, 83, 0)" 1411 | }, 1412 | { 1413 | "alias": "g84", 1414 | "color": "rgb(0, 84, 0)" 1415 | }, 1416 | { 1417 | "alias": "g85", 1418 | "color": "rgb(0, 85, 0)" 1419 | }, 1420 | { 1421 | "alias": "g86", 1422 | "color": "rgb(0, 86, 0)" 1423 | }, 1424 | { 1425 | "alias": "g87", 1426 | "color": "rgb(0, 87, 0)" 1427 | }, 1428 | { 1429 | "alias": "g88", 1430 | "color": "rgb(0, 88, 0)" 1431 | }, 1432 | { 1433 | "alias": "g89", 1434 | "color": "rgb(0, 89, 0)" 1435 | }, 1436 | { 1437 | "alias": "g90", 1438 | "color": "rgb(0, 90, 0)" 1439 | }, 1440 | { 1441 | "alias": "g91", 1442 | "color": "rgb(0, 91, 0)" 1443 | }, 1444 | { 1445 | "alias": "g92", 1446 | "color": "rgb(0, 92, 0)" 1447 | }, 1448 | { 1449 | "alias": "g93", 1450 | "color": "rgb(0, 93, 0)" 1451 | }, 1452 | { 1453 | "alias": "g94", 1454 | "color": "rgb(0, 94, 0)" 1455 | }, 1456 | { 1457 | "alias": "g95", 1458 | "color": "rgb(0, 95, 0)" 1459 | }, 1460 | { 1461 | "alias": "g96", 1462 | "color": "rgb(0, 96, 0)" 1463 | }, 1464 | { 1465 | "alias": "g97", 1466 | "color": "rgb(0, 97, 0)" 1467 | }, 1468 | { 1469 | "alias": "g98", 1470 | "color": "rgb(0, 98, 0)" 1471 | }, 1472 | { 1473 | "alias": "g99", 1474 | "color": "rgb(0, 99, 0)" 1475 | }, 1476 | { 1477 | "alias": "g100", 1478 | "color": "rgb(0, 100, 0)" 1479 | }, 1480 | { 1481 | "alias": "g101", 1482 | "color": "rgb(0, 101, 0)" 1483 | }, 1484 | { 1485 | "alias": "g102", 1486 | "color": "rgb(0, 102, 0)" 1487 | }, 1488 | { 1489 | "alias": "g103", 1490 | "color": "rgb(0, 103, 0)" 1491 | }, 1492 | { 1493 | "alias": "g104", 1494 | "color": "rgb(0, 104, 0)" 1495 | }, 1496 | { 1497 | "alias": "g105", 1498 | "color": "rgb(0, 105, 0)" 1499 | }, 1500 | { 1501 | "alias": "g106", 1502 | "color": "rgb(0, 106, 0)" 1503 | }, 1504 | { 1505 | "alias": "g107", 1506 | "color": "rgb(0, 107, 0)" 1507 | }, 1508 | { 1509 | "alias": "g108", 1510 | "color": "rgb(0, 108, 0)" 1511 | }, 1512 | { 1513 | "alias": "g109", 1514 | "color": "rgb(0, 109, 0)" 1515 | }, 1516 | { 1517 | "alias": "g110", 1518 | "color": "rgb(0, 110, 0)" 1519 | }, 1520 | { 1521 | "alias": "g111", 1522 | "color": "rgb(0, 111, 0)" 1523 | }, 1524 | { 1525 | "alias": "g112", 1526 | "color": "rgb(0, 112, 0)" 1527 | }, 1528 | { 1529 | "alias": "g113", 1530 | "color": "rgb(0, 113, 0)" 1531 | }, 1532 | { 1533 | "alias": "g114", 1534 | "color": "rgb(0, 114, 0)" 1535 | }, 1536 | { 1537 | "alias": "g115", 1538 | "color": "rgb(0, 115, 0)" 1539 | }, 1540 | { 1541 | "alias": "g116", 1542 | "color": "rgb(0, 116, 0)" 1543 | }, 1544 | { 1545 | "alias": "g117", 1546 | "color": "rgb(0, 117, 0)" 1547 | }, 1548 | { 1549 | "alias": "g118", 1550 | "color": "rgb(0, 118, 0)" 1551 | }, 1552 | { 1553 | "alias": "g119", 1554 | "color": "rgb(0, 119, 0)" 1555 | }, 1556 | { 1557 | "alias": "g120", 1558 | "color": "rgb(0, 120, 0)" 1559 | }, 1560 | { 1561 | "alias": "g121", 1562 | "color": "rgb(0, 121, 0)" 1563 | }, 1564 | { 1565 | "alias": "g122", 1566 | "color": "rgb(0, 122, 0)" 1567 | }, 1568 | { 1569 | "alias": "g123", 1570 | "color": "rgb(0, 123, 0)" 1571 | }, 1572 | { 1573 | "alias": "g124", 1574 | "color": "rgb(0, 124, 0)" 1575 | }, 1576 | { 1577 | "alias": "g125", 1578 | "color": "rgb(0, 125, 0)" 1579 | }, 1580 | { 1581 | "alias": "g126", 1582 | "color": "rgb(0, 126, 0)" 1583 | }, 1584 | { 1585 | "alias": "g127", 1586 | "color": "rgb(0, 127, 0)" 1587 | }, 1588 | { 1589 | "alias": "g128", 1590 | "color": "rgb(0, 128, 0)" 1591 | }, 1592 | { 1593 | "alias": "g129", 1594 | "color": "rgb(0, 129, 0)" 1595 | }, 1596 | { 1597 | "alias": "g130", 1598 | "color": "rgb(0, 130, 0)" 1599 | }, 1600 | { 1601 | "alias": "g131", 1602 | "color": "rgb(0, 131, 0)" 1603 | }, 1604 | { 1605 | "alias": "g132", 1606 | "color": "rgb(0, 132, 0)" 1607 | }, 1608 | { 1609 | "alias": "g133", 1610 | "color": "rgb(0, 133, 0)" 1611 | }, 1612 | { 1613 | "alias": "g134", 1614 | "color": "rgb(0, 134, 0)" 1615 | }, 1616 | { 1617 | "alias": "g135", 1618 | "color": "rgb(0, 135, 0)" 1619 | }, 1620 | { 1621 | "alias": "g136", 1622 | "color": "rgb(0, 136, 0)" 1623 | }, 1624 | { 1625 | "alias": "g137", 1626 | "color": "rgb(0, 137, 0)" 1627 | }, 1628 | { 1629 | "alias": "g138", 1630 | "color": "rgb(0, 138, 0)" 1631 | }, 1632 | { 1633 | "alias": "g139", 1634 | "color": "rgb(0, 139, 0)" 1635 | }, 1636 | { 1637 | "alias": "g140", 1638 | "color": "rgb(0, 140, 0)" 1639 | }, 1640 | { 1641 | "alias": "g141", 1642 | "color": "rgb(0, 141, 0)" 1643 | }, 1644 | { 1645 | "alias": "g142", 1646 | "color": "rgb(0, 142, 0)" 1647 | }, 1648 | { 1649 | "alias": "g143", 1650 | "color": "rgb(0, 143, 0)" 1651 | }, 1652 | { 1653 | "alias": "g144", 1654 | "color": "rgb(0, 144, 0)" 1655 | }, 1656 | { 1657 | "alias": "g145", 1658 | "color": "rgb(0, 145, 0)" 1659 | }, 1660 | { 1661 | "alias": "g146", 1662 | "color": "rgb(0, 146, 0)" 1663 | }, 1664 | { 1665 | "alias": "g147", 1666 | "color": "rgb(0, 147, 0)" 1667 | }, 1668 | { 1669 | "alias": "g148", 1670 | "color": "rgb(0, 148, 0)" 1671 | }, 1672 | { 1673 | "alias": "g149", 1674 | "color": "rgb(0, 149, 0)" 1675 | }, 1676 | { 1677 | "alias": "g150", 1678 | "color": "rgb(0, 150, 0)" 1679 | }, 1680 | { 1681 | "alias": "g151", 1682 | "color": "rgb(0, 151, 0)" 1683 | }, 1684 | { 1685 | "alias": "g152", 1686 | "color": "rgb(0, 152, 0)" 1687 | }, 1688 | { 1689 | "alias": "g153", 1690 | "color": "rgb(0, 153, 0)" 1691 | }, 1692 | { 1693 | "alias": "g154", 1694 | "color": "rgb(0, 154, 0)" 1695 | }, 1696 | { 1697 | "alias": "g155", 1698 | "color": "rgb(0, 155, 0)" 1699 | }, 1700 | { 1701 | "alias": "g156", 1702 | "color": "rgb(0, 156, 0)" 1703 | }, 1704 | { 1705 | "alias": "g157", 1706 | "color": "rgb(0, 157, 0)" 1707 | }, 1708 | { 1709 | "alias": "g158", 1710 | "color": "rgb(0, 158, 0)" 1711 | }, 1712 | { 1713 | "alias": "g159", 1714 | "color": "rgb(0, 159, 0)" 1715 | }, 1716 | { 1717 | "alias": "g160", 1718 | "color": "rgb(0, 160, 0)" 1719 | }, 1720 | { 1721 | "alias": "g161", 1722 | "color": "rgb(0, 161, 0)" 1723 | }, 1724 | { 1725 | "alias": "g162", 1726 | "color": "rgb(0, 162, 0)" 1727 | }, 1728 | { 1729 | "alias": "g163", 1730 | "color": "rgb(0, 163, 0)" 1731 | }, 1732 | { 1733 | "alias": "g164", 1734 | "color": "rgb(0, 164, 0)" 1735 | }, 1736 | { 1737 | "alias": "g165", 1738 | "color": "rgb(0, 165, 0)" 1739 | }, 1740 | { 1741 | "alias": "g166", 1742 | "color": "rgb(0, 166, 0)" 1743 | }, 1744 | { 1745 | "alias": "g167", 1746 | "color": "rgb(0, 167, 0)" 1747 | }, 1748 | { 1749 | "alias": "g168", 1750 | "color": "rgb(0, 168, 0)" 1751 | }, 1752 | { 1753 | "alias": "g169", 1754 | "color": "rgb(0, 169, 0)" 1755 | }, 1756 | { 1757 | "alias": "g170", 1758 | "color": "rgb(0, 170, 0)" 1759 | }, 1760 | { 1761 | "alias": "g171", 1762 | "color": "rgb(0, 171, 0)" 1763 | }, 1764 | { 1765 | "alias": "g172", 1766 | "color": "rgb(0, 172, 0)" 1767 | }, 1768 | { 1769 | "alias": "g173", 1770 | "color": "rgb(0, 173, 0)" 1771 | }, 1772 | { 1773 | "alias": "g174", 1774 | "color": "rgb(0, 174, 0)" 1775 | }, 1776 | { 1777 | "alias": "g175", 1778 | "color": "rgb(0, 175, 0)" 1779 | }, 1780 | { 1781 | "alias": "g176", 1782 | "color": "rgb(0, 176, 0)" 1783 | }, 1784 | { 1785 | "alias": "g177", 1786 | "color": "rgb(0, 177, 0)" 1787 | }, 1788 | { 1789 | "alias": "g178", 1790 | "color": "rgb(0, 178, 0)" 1791 | }, 1792 | { 1793 | "alias": "g179", 1794 | "color": "rgb(0, 179, 0)" 1795 | }, 1796 | { 1797 | "alias": "g180", 1798 | "color": "rgb(0, 180, 0)" 1799 | }, 1800 | { 1801 | "alias": "g181", 1802 | "color": "rgb(0, 181, 0)" 1803 | }, 1804 | { 1805 | "alias": "g182", 1806 | "color": "rgb(0, 182, 0)" 1807 | }, 1808 | { 1809 | "alias": "g183", 1810 | "color": "rgb(0, 183, 0)" 1811 | }, 1812 | { 1813 | "alias": "g184", 1814 | "color": "rgb(0, 184, 0)" 1815 | }, 1816 | { 1817 | "alias": "g185", 1818 | "color": "rgb(0, 185, 0)" 1819 | }, 1820 | { 1821 | "alias": "g186", 1822 | "color": "rgb(0, 186, 0)" 1823 | }, 1824 | { 1825 | "alias": "g187", 1826 | "color": "rgb(0, 187, 0)" 1827 | }, 1828 | { 1829 | "alias": "g188", 1830 | "color": "rgb(0, 188, 0)" 1831 | }, 1832 | { 1833 | "alias": "g189", 1834 | "color": "rgb(0, 189, 0)" 1835 | }, 1836 | { 1837 | "alias": "g190", 1838 | "color": "rgb(0, 190, 0)" 1839 | }, 1840 | { 1841 | "alias": "g191", 1842 | "color": "rgb(0, 191, 0)" 1843 | }, 1844 | { 1845 | "alias": "g192", 1846 | "color": "rgb(0, 192, 0)" 1847 | }, 1848 | { 1849 | "alias": "g193", 1850 | "color": "rgb(0, 193, 0)" 1851 | }, 1852 | { 1853 | "alias": "g194", 1854 | "color": "rgb(0, 194, 0)" 1855 | }, 1856 | { 1857 | "alias": "g195", 1858 | "color": "rgb(0, 195, 0)" 1859 | }, 1860 | { 1861 | "alias": "g196", 1862 | "color": "rgb(0, 196, 0)" 1863 | }, 1864 | { 1865 | "alias": "g197", 1866 | "color": "rgb(0, 197, 0)" 1867 | }, 1868 | { 1869 | "alias": "g198", 1870 | "color": "rgb(0, 198, 0)" 1871 | }, 1872 | { 1873 | "alias": "g199", 1874 | "color": "rgb(0, 199, 0)" 1875 | }, 1876 | { 1877 | "alias": "g200", 1878 | "color": "rgb(0, 200, 0)" 1879 | }, 1880 | { 1881 | "alias": "g201", 1882 | "color": "rgb(0, 201, 0)" 1883 | }, 1884 | { 1885 | "alias": "g202", 1886 | "color": "rgb(0, 202, 0)" 1887 | }, 1888 | { 1889 | "alias": "g203", 1890 | "color": "rgb(0, 203, 0)" 1891 | }, 1892 | { 1893 | "alias": "g204", 1894 | "color": "rgb(0, 204, 0)" 1895 | }, 1896 | { 1897 | "alias": "g205", 1898 | "color": "rgb(0, 205, 0)" 1899 | }, 1900 | { 1901 | "alias": "g206", 1902 | "color": "rgb(0, 206, 0)" 1903 | }, 1904 | { 1905 | "alias": "g207", 1906 | "color": "rgb(0, 207, 0)" 1907 | }, 1908 | { 1909 | "alias": "g208", 1910 | "color": "rgb(0, 208, 0)" 1911 | }, 1912 | { 1913 | "alias": "g209", 1914 | "color": "rgb(0, 209, 0)" 1915 | }, 1916 | { 1917 | "alias": "g210", 1918 | "color": "rgb(0, 210, 0)" 1919 | }, 1920 | { 1921 | "alias": "g211", 1922 | "color": "rgb(0, 211, 0)" 1923 | }, 1924 | { 1925 | "alias": "g212", 1926 | "color": "rgb(0, 212, 0)" 1927 | }, 1928 | { 1929 | "alias": "g213", 1930 | "color": "rgb(0, 213, 0)" 1931 | }, 1932 | { 1933 | "alias": "g214", 1934 | "color": "rgb(0, 214, 0)" 1935 | }, 1936 | { 1937 | "alias": "g215", 1938 | "color": "rgb(0, 215, 0)" 1939 | }, 1940 | { 1941 | "alias": "g216", 1942 | "color": "rgb(0, 216, 0)" 1943 | }, 1944 | { 1945 | "alias": "g217", 1946 | "color": "rgb(0, 217, 0)" 1947 | }, 1948 | { 1949 | "alias": "g218", 1950 | "color": "rgb(0, 218, 0)" 1951 | }, 1952 | { 1953 | "alias": "g219", 1954 | "color": "rgb(0, 219, 0)" 1955 | }, 1956 | { 1957 | "alias": "g220", 1958 | "color": "rgb(0, 220, 0)" 1959 | }, 1960 | { 1961 | "alias": "g221", 1962 | "color": "rgb(0, 221, 0)" 1963 | }, 1964 | { 1965 | "alias": "g222", 1966 | "color": "rgb(0, 222, 0)" 1967 | }, 1968 | { 1969 | "alias": "g223", 1970 | "color": "rgb(0, 223, 0)" 1971 | }, 1972 | { 1973 | "alias": "g224", 1974 | "color": "rgb(0, 224, 0)" 1975 | }, 1976 | { 1977 | "alias": "g225", 1978 | "color": "rgb(0, 225, 0)" 1979 | }, 1980 | { 1981 | "alias": "g226", 1982 | "color": "rgb(0, 226, 0)" 1983 | }, 1984 | { 1985 | "alias": "g227", 1986 | "color": "rgb(0, 227, 0)" 1987 | }, 1988 | { 1989 | "alias": "g228", 1990 | "color": "rgb(0, 228, 0)" 1991 | }, 1992 | { 1993 | "alias": "g229", 1994 | "color": "rgb(0, 229, 0)" 1995 | }, 1996 | { 1997 | "alias": "g230", 1998 | "color": "rgb(0, 230, 0)" 1999 | }, 2000 | { 2001 | "alias": "g231", 2002 | "color": "rgb(0, 231, 0)" 2003 | }, 2004 | { 2005 | "alias": "g232", 2006 | "color": "rgb(0, 232, 0)" 2007 | }, 2008 | { 2009 | "alias": "g233", 2010 | "color": "rgb(0, 233, 0)" 2011 | }, 2012 | { 2013 | "alias": "g234", 2014 | "color": "rgb(0, 234, 0)" 2015 | }, 2016 | { 2017 | "alias": "g235", 2018 | "color": "rgb(0, 235, 0)" 2019 | }, 2020 | { 2021 | "alias": "g236", 2022 | "color": "rgb(0, 236, 0)" 2023 | }, 2024 | { 2025 | "alias": "g237", 2026 | "color": "rgb(0, 237, 0)" 2027 | }, 2028 | { 2029 | "alias": "g238", 2030 | "color": "rgb(0, 238, 0)" 2031 | }, 2032 | { 2033 | "alias": "g239", 2034 | "color": "rgb(0, 239, 0)" 2035 | }, 2036 | { 2037 | "alias": "g240", 2038 | "color": "rgb(0, 240, 0)" 2039 | }, 2040 | { 2041 | "alias": "g241", 2042 | "color": "rgb(0, 241, 0)" 2043 | }, 2044 | { 2045 | "alias": "g242", 2046 | "color": "rgb(0, 242, 0)" 2047 | }, 2048 | { 2049 | "alias": "g243", 2050 | "color": "rgb(0, 243, 0)" 2051 | }, 2052 | { 2053 | "alias": "g244", 2054 | "color": "rgb(0, 244, 0)" 2055 | }, 2056 | { 2057 | "alias": "g245", 2058 | "color": "rgb(0, 245, 0)" 2059 | }, 2060 | { 2061 | "alias": "g246", 2062 | "color": "rgb(0, 246, 0)" 2063 | }, 2064 | { 2065 | "alias": "g247", 2066 | "color": "rgb(0, 247, 0)" 2067 | }, 2068 | { 2069 | "alias": "g248", 2070 | "color": "rgb(0, 248, 0)" 2071 | }, 2072 | { 2073 | "alias": "g249", 2074 | "color": "rgb(0, 249, 0)" 2075 | }, 2076 | { 2077 | "alias": "g250", 2078 | "color": "rgb(0, 250, 0)" 2079 | }, 2080 | { 2081 | "alias": "g251", 2082 | "color": "rgb(0, 251, 0)" 2083 | }, 2084 | { 2085 | "alias": "g252", 2086 | "color": "rgb(0, 252, 0)" 2087 | }, 2088 | { 2089 | "alias": "g253", 2090 | "color": "rgb(0, 253, 0)" 2091 | }, 2092 | { 2093 | "alias": "g254", 2094 | "color": "rgb(0, 254, 0)" 2095 | }, 2096 | { 2097 | "alias": "g255", 2098 | "color": "rgb(0, 255, 0)" 2099 | }, 2100 | { 2101 | "alias": "b0", 2102 | "color": "rgb(0, 0, 0)" 2103 | }, 2104 | { 2105 | "alias": "b1", 2106 | "color": "rgb(0, 0, 2)" 2107 | }, 2108 | { 2109 | "alias": "b2", 2110 | "color": "rgb(0, 0, 4)" 2111 | }, 2112 | { 2113 | "alias": "b3", 2114 | "color": "rgb(0, 0, 6)" 2115 | }, 2116 | { 2117 | "alias": "b4", 2118 | "color": "rgb(0, 0, 8)" 2119 | }, 2120 | { 2121 | "alias": "b5", 2122 | "color": "rgb(0, 0, 10)" 2123 | }, 2124 | { 2125 | "alias": "b6", 2126 | "color": "rgb(0, 0, 12)" 2127 | }, 2128 | { 2129 | "alias": "b7", 2130 | "color": "rgb(0, 0, 14)" 2131 | }, 2132 | { 2133 | "alias": "b8", 2134 | "color": "rgb(0, 0, 16)" 2135 | }, 2136 | { 2137 | "alias": "b9", 2138 | "color": "rgb(0, 0, 18)" 2139 | }, 2140 | { 2141 | "alias": "b10", 2142 | "color": "rgb(0, 0, 20)" 2143 | }, 2144 | { 2145 | "alias": "b11", 2146 | "color": "rgb(0, 0, 22)" 2147 | }, 2148 | { 2149 | "alias": "b12", 2150 | "color": "rgb(0, 0, 24)" 2151 | }, 2152 | { 2153 | "alias": "b13", 2154 | "color": "rgb(0, 0, 26)" 2155 | }, 2156 | { 2157 | "alias": "b14", 2158 | "color": "rgb(0, 0, 28)" 2159 | }, 2160 | { 2161 | "alias": "b15", 2162 | "color": "rgb(0, 0, 30)" 2163 | }, 2164 | { 2165 | "alias": "b16", 2166 | "color": "rgb(0, 0, 32)" 2167 | }, 2168 | { 2169 | "alias": "b17", 2170 | "color": "rgb(0, 0, 34)" 2171 | }, 2172 | { 2173 | "alias": "b18", 2174 | "color": "rgb(0, 0, 36)" 2175 | }, 2176 | { 2177 | "alias": "b19", 2178 | "color": "rgb(0, 0, 38)" 2179 | }, 2180 | { 2181 | "alias": "b20", 2182 | "color": "rgb(0, 0, 40)" 2183 | }, 2184 | { 2185 | "alias": "b21", 2186 | "color": "rgb(0, 0, 42)" 2187 | }, 2188 | { 2189 | "alias": "b22", 2190 | "color": "rgb(0, 0, 44)" 2191 | }, 2192 | { 2193 | "alias": "b23", 2194 | "color": "rgb(0, 0, 46)" 2195 | }, 2196 | { 2197 | "alias": "b24", 2198 | "color": "rgb(0, 0, 48)" 2199 | }, 2200 | { 2201 | "alias": "b25", 2202 | "color": "rgb(0, 0, 50)" 2203 | }, 2204 | { 2205 | "alias": "b26", 2206 | "color": "rgb(0, 0, 52)" 2207 | }, 2208 | { 2209 | "alias": "b27", 2210 | "color": "rgb(0, 0, 54)" 2211 | }, 2212 | { 2213 | "alias": "b28", 2214 | "color": "rgb(0, 0, 56)" 2215 | }, 2216 | { 2217 | "alias": "b29", 2218 | "color": "rgb(0, 0, 58)" 2219 | }, 2220 | { 2221 | "alias": "b30", 2222 | "color": "rgb(0, 0, 60)" 2223 | }, 2224 | { 2225 | "alias": "b31", 2226 | "color": "rgb(0, 0, 62)" 2227 | }, 2228 | { 2229 | "alias": "b32", 2230 | "color": "rgb(0, 0, 64)" 2231 | }, 2232 | { 2233 | "alias": "b33", 2234 | "color": "rgb(0, 0, 66)" 2235 | }, 2236 | { 2237 | "alias": "b34", 2238 | "color": "rgb(0, 0, 68)" 2239 | }, 2240 | { 2241 | "alias": "b35", 2242 | "color": "rgb(0, 0, 70)" 2243 | }, 2244 | { 2245 | "alias": "b36", 2246 | "color": "rgb(0, 0, 72)" 2247 | }, 2248 | { 2249 | "alias": "b37", 2250 | "color": "rgb(0, 0, 74)" 2251 | }, 2252 | { 2253 | "alias": "b38", 2254 | "color": "rgb(0, 0, 76)" 2255 | }, 2256 | { 2257 | "alias": "b39", 2258 | "color": "rgb(0, 0, 78)" 2259 | }, 2260 | { 2261 | "alias": "b40", 2262 | "color": "rgb(0, 0, 80)" 2263 | }, 2264 | { 2265 | "alias": "b41", 2266 | "color": "rgb(0, 0, 82)" 2267 | }, 2268 | { 2269 | "alias": "b42", 2270 | "color": "rgb(0, 0, 84)" 2271 | }, 2272 | { 2273 | "alias": "b43", 2274 | "color": "rgb(0, 0, 86)" 2275 | }, 2276 | { 2277 | "alias": "b44", 2278 | "color": "rgb(0, 0, 88)" 2279 | }, 2280 | { 2281 | "alias": "b45", 2282 | "color": "rgb(0, 0, 90)" 2283 | }, 2284 | { 2285 | "alias": "b46", 2286 | "color": "rgb(0, 0, 92)" 2287 | }, 2288 | { 2289 | "alias": "b47", 2290 | "color": "rgb(0, 0, 94)" 2291 | }, 2292 | { 2293 | "alias": "b48", 2294 | "color": "rgb(0, 0, 96)" 2295 | }, 2296 | { 2297 | "alias": "b49", 2298 | "color": "rgb(0, 0, 98)" 2299 | }, 2300 | { 2301 | "alias": "b50", 2302 | "color": "rgb(0, 0, 100)" 2303 | }, 2304 | { 2305 | "alias": "b51", 2306 | "color": "rgb(0, 0, 102)" 2307 | }, 2308 | { 2309 | "alias": "b52", 2310 | "color": "rgb(0, 0, 104)" 2311 | }, 2312 | { 2313 | "alias": "b53", 2314 | "color": "rgb(0, 0, 106)" 2315 | }, 2316 | { 2317 | "alias": "b54", 2318 | "color": "rgb(0, 0, 108)" 2319 | }, 2320 | { 2321 | "alias": "b55", 2322 | "color": "rgb(0, 0, 110)" 2323 | }, 2324 | { 2325 | "alias": "b56", 2326 | "color": "rgb(0, 0, 112)" 2327 | }, 2328 | { 2329 | "alias": "b57", 2330 | "color": "rgb(0, 0, 114)" 2331 | }, 2332 | { 2333 | "alias": "b58", 2334 | "color": "rgb(0, 0, 116)" 2335 | }, 2336 | { 2337 | "alias": "b59", 2338 | "color": "rgb(0, 0, 118)" 2339 | }, 2340 | { 2341 | "alias": "b60", 2342 | "color": "rgb(0, 0, 120)" 2343 | }, 2344 | { 2345 | "alias": "b61", 2346 | "color": "rgb(0, 0, 122)" 2347 | }, 2348 | { 2349 | "alias": "b62", 2350 | "color": "rgb(0, 0, 124)" 2351 | }, 2352 | { 2353 | "alias": "b63", 2354 | "color": "rgb(0, 0, 126)" 2355 | }, 2356 | { 2357 | "alias": "b64", 2358 | "color": "rgb(0, 0, 128)" 2359 | }, 2360 | { 2361 | "alias": "b65", 2362 | "color": "rgb(0, 0, 130)" 2363 | }, 2364 | { 2365 | "alias": "b66", 2366 | "color": "rgb(0, 0, 132)" 2367 | }, 2368 | { 2369 | "alias": "b67", 2370 | "color": "rgb(0, 0, 134)" 2371 | }, 2372 | { 2373 | "alias": "b68", 2374 | "color": "rgb(0, 0, 136)" 2375 | }, 2376 | { 2377 | "alias": "b69", 2378 | "color": "rgb(0, 0, 138)" 2379 | }, 2380 | { 2381 | "alias": "b70", 2382 | "color": "rgb(0, 0, 140)" 2383 | }, 2384 | { 2385 | "alias": "b71", 2386 | "color": "rgb(0, 0, 142)" 2387 | }, 2388 | { 2389 | "alias": "b72", 2390 | "color": "rgb(0, 0, 144)" 2391 | }, 2392 | { 2393 | "alias": "b73", 2394 | "color": "rgb(0, 0, 146)" 2395 | }, 2396 | { 2397 | "alias": "b74", 2398 | "color": "rgb(0, 0, 148)" 2399 | }, 2400 | { 2401 | "alias": "b75", 2402 | "color": "rgb(0, 0, 150)" 2403 | }, 2404 | { 2405 | "alias": "b76", 2406 | "color": "rgb(0, 0, 152)" 2407 | }, 2408 | { 2409 | "alias": "b77", 2410 | "color": "rgb(0, 0, 154)" 2411 | }, 2412 | { 2413 | "alias": "b78", 2414 | "color": "rgb(0, 0, 156)" 2415 | }, 2416 | { 2417 | "alias": "b79", 2418 | "color": "rgb(0, 0, 158)" 2419 | }, 2420 | { 2421 | "alias": "b80", 2422 | "color": "rgb(0, 0, 160)" 2423 | }, 2424 | { 2425 | "alias": "b81", 2426 | "color": "rgb(0, 0, 162)" 2427 | }, 2428 | { 2429 | "alias": "b82", 2430 | "color": "rgb(0, 0, 164)" 2431 | }, 2432 | { 2433 | "alias": "b83", 2434 | "color": "rgb(0, 0, 166)" 2435 | }, 2436 | { 2437 | "alias": "b84", 2438 | "color": "rgb(0, 0, 168)" 2439 | }, 2440 | { 2441 | "alias": "b85", 2442 | "color": "rgb(0, 0, 170)" 2443 | }, 2444 | { 2445 | "alias": "b86", 2446 | "color": "rgb(0, 0, 172)" 2447 | }, 2448 | { 2449 | "alias": "b87", 2450 | "color": "rgb(0, 0, 174)" 2451 | }, 2452 | { 2453 | "alias": "b88", 2454 | "color": "rgb(0, 0, 176)" 2455 | }, 2456 | { 2457 | "alias": "b89", 2458 | "color": "rgb(0, 0, 178)" 2459 | }, 2460 | { 2461 | "alias": "b90", 2462 | "color": "rgb(0, 0, 180)" 2463 | }, 2464 | { 2465 | "alias": "b91", 2466 | "color": "rgb(0, 0, 182)" 2467 | }, 2468 | { 2469 | "alias": "b92", 2470 | "color": "rgb(0, 0, 184)" 2471 | }, 2472 | { 2473 | "alias": "b93", 2474 | "color": "rgb(0, 0, 186)" 2475 | }, 2476 | { 2477 | "alias": "b94", 2478 | "color": "rgb(0, 0, 188)" 2479 | }, 2480 | { 2481 | "alias": "b95", 2482 | "color": "rgb(0, 0, 190)" 2483 | }, 2484 | { 2485 | "alias": "b96", 2486 | "color": "rgb(0, 0, 192)" 2487 | }, 2488 | { 2489 | "alias": "b97", 2490 | "color": "rgb(0, 0, 194)" 2491 | }, 2492 | { 2493 | "alias": "b98", 2494 | "color": "rgb(0, 0, 196)" 2495 | }, 2496 | { 2497 | "alias": "b99", 2498 | "color": "rgb(0, 0, 198)" 2499 | }, 2500 | { 2501 | "alias": "b100", 2502 | "color": "rgb(0, 0, 200)" 2503 | }, 2504 | { 2505 | "alias": "b101", 2506 | "color": "rgb(0, 0, 202)" 2507 | }, 2508 | { 2509 | "alias": "b102", 2510 | "color": "rgb(0, 0, 204)" 2511 | }, 2512 | { 2513 | "alias": "b103", 2514 | "color": "rgb(0, 0, 206)" 2515 | }, 2516 | { 2517 | "alias": "b104", 2518 | "color": "rgb(0, 0, 208)" 2519 | }, 2520 | { 2521 | "alias": "b105", 2522 | "color": "rgb(0, 0, 210)" 2523 | }, 2524 | { 2525 | "alias": "b106", 2526 | "color": "rgb(0, 0, 212)" 2527 | }, 2528 | { 2529 | "alias": "b107", 2530 | "color": "rgb(0, 0, 214)" 2531 | }, 2532 | { 2533 | "alias": "b108", 2534 | "color": "rgb(0, 0, 216)" 2535 | }, 2536 | { 2537 | "alias": "b109", 2538 | "color": "rgb(0, 0, 218)" 2539 | }, 2540 | { 2541 | "alias": "b110", 2542 | "color": "rgb(0, 0, 220)" 2543 | }, 2544 | { 2545 | "alias": "b111", 2546 | "color": "rgb(0, 0, 222)" 2547 | }, 2548 | { 2549 | "alias": "b112", 2550 | "color": "rgb(0, 0, 224)" 2551 | }, 2552 | { 2553 | "alias": "b113", 2554 | "color": "rgb(0, 0, 226)" 2555 | }, 2556 | { 2557 | "alias": "b114", 2558 | "color": "rgb(0, 0, 228)" 2559 | }, 2560 | { 2561 | "alias": "b115", 2562 | "color": "rgb(0, 0, 230)" 2563 | }, 2564 | { 2565 | "alias": "b116", 2566 | "color": "rgb(0, 0, 232)" 2567 | }, 2568 | { 2569 | "alias": "b117", 2570 | "color": "rgb(0, 0, 234)" 2571 | }, 2572 | { 2573 | "alias": "b118", 2574 | "color": "rgb(0, 0, 236)" 2575 | }, 2576 | { 2577 | "alias": "b119", 2578 | "color": "rgb(0, 0, 238)" 2579 | }, 2580 | { 2581 | "alias": "b120", 2582 | "color": "rgb(0, 0, 240)" 2583 | }, 2584 | { 2585 | "alias": "b121", 2586 | "color": "rgb(0, 0, 242)" 2587 | }, 2588 | { 2589 | "alias": "b122", 2590 | "color": "rgb(0, 0, 244)" 2591 | }, 2592 | { 2593 | "alias": "b123", 2594 | "color": "rgb(0, 0, 246)" 2595 | }, 2596 | { 2597 | "alias": "b124", 2598 | "color": "rgb(0, 0, 248)" 2599 | }, 2600 | { 2601 | "alias": "b125", 2602 | "color": "rgb(0, 0, 250)" 2603 | }, 2604 | { 2605 | "alias": "b126", 2606 | "color": "rgb(0, 0, 252)" 2607 | }, 2608 | { 2609 | "alias": "b127", 2610 | "color": "rgb(0, 0, 254)" 2611 | } 2612 | ], 2613 | "spaceLength": 10, 2614 | "stack": false, 2615 | "steppedLine": false, 2616 | "targets": [ 2617 | { 2618 | "expr": "r", 2619 | "format": "time_series", 2620 | "intervalFactor": 1, 2621 | "legendFormat": "r{{l}}", 2622 | "refId": "A" 2623 | }, 2624 | { 2625 | "expr": "g", 2626 | "format": "time_series", 2627 | "intervalFactor": 1, 2628 | "legendFormat": "g{{l}}", 2629 | "refId": "B" 2630 | }, 2631 | { 2632 | "expr": "b", 2633 | "format": "time_series", 2634 | "intervalFactor": 1, 2635 | "legendFormat": "b{{l}}", 2636 | "refId": "C" 2637 | } 2638 | ], 2639 | "thresholds": [ ], 2640 | "timeFrom": null, 2641 | "timeShift": null, 2642 | "title": "Video", 2643 | "tooltip": { 2644 | "shared": false, 2645 | "sort": 0, 2646 | "value_type": "individual" 2647 | }, 2648 | "type": "graph", 2649 | "xaxis": { 2650 | "buckets": null, 2651 | "mode": "time", 2652 | "name": null, 2653 | "show": true, 2654 | "values": [ ] 2655 | }, 2656 | "yaxes": [ 2657 | { 2658 | "format": "short", 2659 | "label": null, 2660 | "logBase": 1, 2661 | "max": 300, 2662 | "min": 0, 2663 | "show": true 2664 | }, 2665 | { 2666 | "format": "short", 2667 | "label": null, 2668 | "logBase": 1, 2669 | "max": 300, 2670 | "min": 0, 2671 | "show": true 2672 | } 2673 | ] 2674 | } 2675 | ], 2676 | "refresh": "", 2677 | "rows": [ ], 2678 | "schemaVersion": 16, 2679 | "style": "dark", 2680 | "tags": [ ], 2681 | "templating": { 2682 | "list": [ 2683 | { 2684 | "current": { 2685 | "text": "Prometheus", 2686 | "value": "Prometheus" 2687 | }, 2688 | "hide": 1, 2689 | "label": null, 2690 | "name": "PROMETHEUS_DS", 2691 | "options": [ ], 2692 | "query": "prometheus", 2693 | "refresh": 1, 2694 | "regex": "", 2695 | "type": "datasource" 2696 | } 2697 | ] 2698 | }, 2699 | "time": { 2700 | "from": "now-6h", 2701 | "to": "now" 2702 | }, 2703 | "timepicker": { 2704 | "refresh_intervals": [ 2705 | "5s", 2706 | "10s", 2707 | "30s", 2708 | "1m", 2709 | "5m", 2710 | "15m", 2711 | "30m", 2712 | "1h", 2713 | "2h", 2714 | "1d" 2715 | ], 2716 | "time_options": [ 2717 | "5m", 2718 | "15m", 2719 | "1h", 2720 | "6h", 2721 | "12h", 2722 | "24h", 2723 | "2d", 2724 | "7d", 2725 | "30d" 2726 | ] 2727 | }, 2728 | "timezone": "utc", 2729 | "title": "Prometheus Video Renderer", 2730 | "uid": "pvr-dash", 2731 | "version": 0 2732 | } 2733 | --------------------------------------------------------------------------------