~vpzom/bracketmonster

db3865acd8034e246fe959744aea0a6654af1f20 — Colin Reeder 5 months ago 6e705db
brackend: Adopt trout for routing
M brackend/Cargo.lock => brackend/Cargo.lock +344 -346
@@ 2,34 2,34 @@
# It is not intended for manual editing.
[[package]]
name = "async-trait"
version = "0.1.19"
version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "autocfg"
version = "0.1.7"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "base64"
version = "0.11.0"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "bcrypt"
version = "0.6.1"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "base64 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "blowfish 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 44,7 44,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
]



@@ 70,7 70,7 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
]



@@ 78,26 78,27 @@ dependencies = [
name = "brackend"
version = "0.1.0"
dependencies = [
 "bcrypt 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "deadpool-postgres 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "headers 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "hyper 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "bcrypt 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "bs58 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "deadpool-postgres 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "headers 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "hyper 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "postgres-types 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "qrcode 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio-postgres 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio-postgres 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "trout 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "bs58"
version = "0.3.0"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]


@@ 107,23 108,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "byteorder"
version = "1.3.2"
version = "1.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "bytes"
version = "0.5.3"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "c2-chacha"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "cfg-if"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 147,15 140,15 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "crossbeam-utils"
version = "0.7.0"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]


@@ 174,23 167,23 @@ name = "deadpool"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "async-trait 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
 "async-trait 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
 "crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-intrusive 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "deadpool-postgres"
version = "0.4.1"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "async-trait 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
 "async-trait 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
 "deadpool 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio-postgres 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio-postgres 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 213,7 206,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "fnv"
version = "1.0.6"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]


@@ 232,40 225,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "futures"
version = "0.3.1"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-executor 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "futures-channel"
version = "0.3.1"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "futures-core"
version = "0.3.1"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "futures-executor"
version = "0.3.1"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 273,52 266,56 @@ name = "futures-intrusive"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "futures-io"
version = "0.3.1"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "futures-macro"
version = "0.3.1"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "futures-sink"
version = "0.3.1"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "futures-task"
version = "0.3.1"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "futures-util"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-macro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-project 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
]



@@ 327,58 324,50 @@ name = "generic-array"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "generic-array"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "getrandom"
version = "0.1.13"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)",
 "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "h2"
version = "0.2.1"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "headers"
version = "0.3.0"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "base64 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "headers-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
 "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
 "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
 "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 386,7 375,7 @@ name = "headers-core"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 400,12 389,12 @@ dependencies = [

[[package]]
name = "http"
version = "0.2.0"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 413,8 402,8 @@ name = "http-body"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 424,44 413,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "hyper"
version = "0.13.1"
version = "0.13.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "h2 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-project 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)",
 "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
 "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "image"
version = "0.22.3"
version = "0.22.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "indexmap"
version = "1.3.0"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 469,12 458,12 @@ name = "iovec"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "itoa"
version = "0.4.4"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]


@@ 493,15 482,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "libc"
version = "0.2.66"
version = "0.2.70"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "lock_api"
version = "0.3.2"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 529,17 518,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "memchr"
version = "2.2.1"
version = "2.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "mime"
version = "0.3.14"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "mio"
version = "0.6.21"
version = "0.6.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",


@@ 547,22 536,22 @@ dependencies = [
 "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 "net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
 "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "mio-uds"
version = "0.6.7"
version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)",
 "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 571,59 560,64 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 "net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "net2"
version = "0.2.33"
version = "0.2.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "num-integer"
version = "0.1.41"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
 "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "num-iter"
version = "0.1.39"
version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
 "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "num-rational"
version = "0.2.2"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
 "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "num-traits"
version = "0.2.10"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "once_cell"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "opaque-debug"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 633,18 627,18 @@ name = "parking_lot"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "parking_lot"
version = "0.10.0"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "parking_lot_core 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 654,7 648,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)",
 "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
 "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",


@@ 663,14 657,14 @@ dependencies = [

[[package]]
name = "parking_lot_core"
version = "0.7.0"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)",
 "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
 "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]



@@ 692,35 686,35 @@ name = "phf_shared"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "siphasher 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "siphasher 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "pin-project"
version = "0.4.6"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "pin-project-internal 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-project-internal 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "pin-project-internal"
version = "0.4.6"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "pin-project-lite"
version = "0.1.1"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "pin-utils"
version = "0.1.0-alpha.4"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]


@@ 728,26 722,25 @@ name = "postgres-derive"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "postgres-protocol"
version = "0.5.0"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "base64 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "md5 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "stringprep 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
]



@@ 756,38 749,33 @@ name = "postgres-types"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "postgres-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "postgres-protocol 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)",
 "postgres-protocol 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)",
 "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "ppv-lite86"
version = "0.2.6"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "proc-macro-hack"
version = "0.5.11"
version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "proc-macro-nested"
version = "0.1.3"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "proc-macro2"
version = "1.0.6"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",


@@ 799,35 787,35 @@ version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "checked_int_cast 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "image 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "image 0.22.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "quote"
version = "1.0.2"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "rand"
version = "0.7.2"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "rand_chacha"
version = "0.2.1"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "ppv-lite86 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
]



@@ 836,7 824,7 @@ name = "rand_core"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
 "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 862,12 850,12 @@ dependencies = [

[[package]]
name = "ryu"
version = "1.0.2"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "scopeguard"
version = "1.0.0"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]


@@ 885,32 873,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "serde"
version = "1.0.103"
version = "1.0.110"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "serde_derive"
version = "1.0.103"
version = "1.0.110"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "serde_json"
version = "1.0.42"
version = "1.0.53"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
 "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "ryu 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "sha-1"
version = "0.8.1"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",


@@ 921,7 909,7 @@ dependencies = [

[[package]]
name = "sha2"
version = "0.8.0"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",


@@ 932,7 920,7 @@ dependencies = [

[[package]]
name = "siphasher"
version = "0.3.1"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]


@@ 950,7 938,7 @@ dependencies = [

[[package]]
name = "smallvec"
version = "1.0.0"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]


@@ 959,7 947,7 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
 "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 969,82 957,84 @@ source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "syn"
version = "1.0.11"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "time"
version = "0.1.42"
version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "tokio"
version = "0.2.6"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)",
 "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)",
 "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)",
 "mio-uds 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-project-lite 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio-macros 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "tokio-macros"
version = "0.2.1"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "tokio-postgres"
version = "0.5.1"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "async-trait 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "parking_lot 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "phf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "postgres-protocol 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-project-lite 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "postgres-protocol 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "postgres-types 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "tokio-util"
version = "0.2.0"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "pin-project-lite 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 1053,13 1043,21 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "trout"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "hyper 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "try-lock"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "typenum"
version = "1.11.2"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]


@@ 1072,10 1070,10 @@ dependencies = [

[[package]]
name = "unicode-normalization"
version = "0.1.11"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 1088,7 1086,7 @@ name = "uuid"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 1102,7 1100,7 @@ dependencies = [

[[package]]
name = "wasi"
version = "0.7.0"
version = "0.9.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]


@@ 1144,134 1142,134 @@ dependencies = [
]

[metadata]
"checksum async-trait 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3495c8ae99b96d8a84050dee9d7b9d6425f9bfe84c2e3f800c2c2859457f8590"
"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
"checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
"checksum bcrypt 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28dff1c1a22f9401213d983f6c309e807e72c33d5dc5514fe5005b0205c46e8f"
"checksum async-trait 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "26c4f3195085c36ea8d24d32b2f828d23296a9370a28aa39d111f6f16bef9f3b"
"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
"checksum base64 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "53d1ccbaf7d9ec9537465a97bf19edc1a4e158ecb49fc16178202238c569cc42"
"checksum bcrypt 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f055c8591efe08e03f534ee632672ea3643c3932e485f422107ec6cc1157b0ea"
"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
"checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774"
"checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
"checksum blowfish 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6aeb80d00f2688459b8542068abd974cfb101e7a82182414a99b5026c0d85cc3"
"checksum bs58 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b170cd256a3f9fa6b9edae3e44a7dfdfc77e8124dbc3e2612d75f9c3e2396dae"
"checksum bs58 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb"
"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
"checksum bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10004c15deb332055f7a4a208190aed362cf9a7c2f6ab70a305fba50e1105f38"
"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb"
"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
"checksum bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1"
"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
"checksum checked_int_cast 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17cc5e6b5ab06331c33589842070416baa137e8b0eb912b008cfd4a78ada7919"
"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
"checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db"
"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
"checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5"
"checksum deadpool 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fdfa3a8fd8000fa1679975e37564732e02121c808ba96a3322c76d2a3cb155f2"
"checksum deadpool-postgres 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a09006bb6996a8b9be1818e220f3f781a4ec71d6ecbe87b9237d4bc07906fda2"
"checksum deadpool-postgres 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ccd8a8b9ff35d09a459af3dcfc7bf11afcfae7c65ea1929816c7603c34815285"
"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
"checksum fallible-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
"checksum fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
"checksum futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6f16056ecbb57525ff698bb955162d0cd03bee84e6241c27ff75c08d8ca5987"
"checksum futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fcae98ca17d102fd8a3603727b9259fcf7fa4239b603d2142926189bc8999b86"
"checksum futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "79564c427afefab1dfb3298535b21eda083ef7935b4f0ecbfcb121f0aec10866"
"checksum futures-executor 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e274736563f686a837a0568b478bdabfeaec2dca794b5649b04e2fe1627c231"
"checksum futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613"
"checksum futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5"
"checksum futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399"
"checksum futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314"
"checksum futures-intrusive 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2c14b89bb14a9ec2f724a8cd9653b83b8e3f7ed510cc6129a36785dfe8cc9f1"
"checksum futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e676577d229e70952ab25f3945795ba5b16d63ca794ca9d2c860e5595d20b5ff"
"checksum futures-macro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "52e7c56c15537adb4f76d0b7a76ad131cb4d2f4f32d3b0bcabcbe1c7c5e87764"
"checksum futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "171be33efae63c2d59e6dbba34186fe0d6394fb378069a76dfd80fdcffd43c16"
"checksum futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0bae52d6b29cf440e298856fec3965ee6fa71b06aa7495178615953fd669e5f9"
"checksum futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c0d66274fb76985d3c62c886d1da7ac4c0903a8c9f754e8fe0f35a6a6cc39e76"
"checksum futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789"
"checksum futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39"
"checksum futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc"
"checksum futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626"
"checksum futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6"
"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec"
"checksum generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0ed1e761351b56f54eb9dcd0cfaca9fd0daecf93918e1cfc01c8a3d26ee7adcd"
"checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407"
"checksum h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9433d71e471c1736fd5a61b671fc0b148d7a2992f666c958d03cd8feb3b88d1"
"checksum headers 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9836ffd533e1fb207cfdb2e357079addbd17ef5c68eea5afe2eece40555b905"
"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
"checksum h2 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff"
"checksum headers 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ed18eb2459bf1a09ad2d6b1547840c3e5e62882fa09b9a6a20b1de8e3228848f"
"checksum headers-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429"
"checksum hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695"
"checksum http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b708cc7f06493459026f53b9a61a7a121a5d1ec6238dee58ea4941132b30156b"
"checksum http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9"
"checksum http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b"
"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9"
"checksum hyper 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8bf49cfb32edee45d890537d9057d1b02ed55f53b7b6a30bae83a38c9231749e"
"checksum image 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4be8aaefbe7545dc42ae925afb55a0098f226a3fe5ef721872806f44f57826"
"checksum indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d7b3ea5827fcb9d4fda14bf4da5f136f0db2ae9c8f4bd4e2d1c6fde4e6db2"
"checksum hyper 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96816e1d921eca64d208a85aab4f7798455a8e34229ee5a88c935bdee1b78b14"
"checksum image 0.22.5 (registry+https://github.com/rust-lang/crates.io-index)" = "08ed2ada878397b045454ac7cfb011d73132c59f31a955d230bd1f1c2e68eb4a"
"checksum indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292"
"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e"
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
"checksum lock_api 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e57b3997725d2b60dbec1297f6c2e2957cc383db1cebd6be812163f969c7d586"
"checksum libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)" = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f"
"checksum lock_api 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75"
"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
"checksum md5 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
"checksum mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "dd1d63acd1b78403cc0c325605908475dd9b9a3acbf65ed8bcab97e27014afcf"
"checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f"
"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125"
"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
"checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
"checksum mio 0.6.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430"
"checksum mio-uds 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0"
"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09"
"checksum num-iter 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "76bd5272412d173d6bf9afdf98db8612bbabc9a7a830b7bfc9c188911716132e"
"checksum num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2885278d5fe2adc2f75ced642d52d879bffaceb5a2e0b1d4309ffdfb239b454"
"checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4"
"checksum net2 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7"
"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
"checksum num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "dfb0800a0291891dd9f4fe7bd9c19384f98f7fbe0cd0f39a2c6b88b9868bbc00"
"checksum num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef"
"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
"checksum once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d"
"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
"checksum parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc"
"checksum parking_lot 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e"
"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252"
"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b"
"checksum parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1"
"checksum parking_lot_core 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3"
"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
"checksum phf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
"checksum phf_shared 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
"checksum pin-project 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "94b90146c7216e4cb534069fb91366de4ea0ea353105ee45ed297e2d1619e469"
"checksum pin-project-internal 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "44ca92f893f0656d3cba8158dd0f2b99b94de256a4a54e870bd6922fcc6c8355"
"checksum pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f0af6cbca0e6e3ce8692ee19fb8d734b641899e07b68eb73e9bbbd32f1703991"
"checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587"
"checksum pin-project 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)" = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791"
"checksum pin-project-internal 0.4.17 (registry+https://github.com/rust-lang/crates.io-index)" = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40"
"checksum pin-project-lite 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f7505eeebd78492e0f6108f7171c4948dbb120ee8119d9d77d0afa5469bef67f"
"checksum pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
"checksum postgres-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c857dd221cb0e7d8414b894a0ce29eae44d453dda0baa132447878e75e701477"
"checksum postgres-protocol 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a30f0e172ae0fb0653dbf777ad10a74b8e58d6de95a892f2e1d3e94a9df9a844"
"checksum postgres-protocol 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f611afe4d1407ebe7f3ced1ffc66f730fac1b1c13085e230a8cdcb921e97710"
"checksum postgres-types 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e634590e8812c500088d88db721195979223dabb05149f43cb50931d0ff5865d"
"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
"checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5"
"checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e"
"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
"checksum ppv-lite86 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea"
"checksum proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63"
"checksum proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694"
"checksum proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "53f5ffe53a6b28e37c9c1ce74893477864d64f74778a93a4beb43c8fa167f639"
"checksum qrcode 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f5b09efe9b8aa5d34d310a0bfd76122cd6f7d0c91016a5fe928635eab033eb8a"
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
"checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412"
"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853"
"checksum quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea"
"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8"
"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
"checksum ryu 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1"
"checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
"checksum serde 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "1217f97ab8e8904b57dd22eb61cde455fa7446a9c1cf43966066da047c1f3702"
"checksum serde_derive 1.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "a8c6faef9a2e64b0064f48570289b4bf8823b7581f1d6157c1b52152306651d0"
"checksum serde_json 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)" = "1a3351dcbc1f067e2c92ab7c3c1f288ad1a4cffc470b5aaddb4c2e0a3ae80043"
"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68"
"checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d"
"checksum siphasher 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "83da420ee8d1a89e640d0948c646c1c088758d3a3c538f943bfa97bdac17929d"
"checksum serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)" = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c"
"checksum serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)" = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984"
"checksum serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)" = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2"
"checksum sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
"checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0"
"checksum siphasher 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fa8f3741c7372e75519bd9346068370c9cdaabcc1f9599cbcf2a2719352286b7"
"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
"checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6"
"checksum smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecf3b85f68e8abaa7555aa5abdb1153079387e60b718283d732f03897fcfc86"
"checksum smallvec 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
"checksum stringprep 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1"
"checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee"
"checksum syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238"
"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
"checksum tokio 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1bef565a52394086ecac0a6fa3b8ace4cb3a138ee1d96bd2b93283b56824e3"
"checksum tokio-macros 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7de6c21a09bab0ce34614bb1071403ad9996db62715eb61e63be5d82f91342bc"
"checksum tokio-postgres 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c03cb0c66092269a9b280e9e4956cb23ce00b8a6b1b393f7700f7732ac4bf133"
"checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930"
"checksum syn 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)" = "95b5f192649e48a5302a13f2feb224df883b98933222369e4b3b0fe2a5447269"
"checksum time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
"checksum tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58"
"checksum tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389"
"checksum tokio-postgres 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d56010a704311361b7c9e870aaa4ddffaf9f2db89cbcf3e14773ac8a14469c9c"
"checksum tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499"
"checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860"
"checksum trout 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3a33a6998422e804d948d5c9f6f44da16a75f2412465ff2148235792b696283f"
"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382"
"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9"
"checksum typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"
"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
"checksum unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b561e267b2326bb4cebfc0ef9e68355c7abe6c6f522aeac2f5bf95d56c59bdcf"
"checksum unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4"
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
"checksum uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11"
"checksum want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d"
"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"

M brackend/Cargo.toml => brackend/Cargo.toml +1 -0
@@ 22,3 22,4 @@ headers = "0.3.0"
qrcode = "0.11.1"
bcrypt = "0.6.1"
postgres-types = { version = "0.1.1", features = ["derive"] }
trout = "0.1.0"

M brackend/src/bracket_utils.rs => brackend/src/bracket_utils.rs +99 -11
@@ 11,7 11,17 @@ pub enum PlayerSource {
    LoserIndex(usize),
}

#[derive(Clone, Debug, PartialEq, Eq, Copy, Hash, postgres_types::ToSql, postgres_types::FromSql, serde_derive::Serialize)]
#[derive(
    Clone,
    Debug,
    PartialEq,
    Eq,
    Copy,
    Hash,
    postgres_types::ToSql,
    postgres_types::FromSql,
    serde_derive::Serialize,
)]
#[postgres(name = "bm_player_outcome")]
pub enum PlayerOutcome {
    #[postgres(name = "win")]


@@ 328,11 338,27 @@ pub async fn create_matches_from_custom<'a>(
    Ok(())
}

pub async fn handle_winner_change(trans: &mut deadpool_postgres::Transaction<'_>, updated: &mut HashSet<i32>, match_id: i32, winner_player: Option<i32>, loser_player: Option<i32>) -> Result<(), Error> {
    async fn handle_update(trans: &mut deadpool_postgres::Transaction<'_>, updated: &mut HashSet<i32>, cascade_matches: &mut VecDeque<(i32, Option<i32>, PlayerOutcome)>, update_match_id: i32, player_idx: i32, player: &Option<i32>, outcome: PlayerOutcome) -> Result<(), Error> {
pub async fn handle_winner_change(
    trans: &mut deadpool_postgres::Transaction<'_>,
    updated: &mut HashSet<i32>,
    match_id: i32,
    winner_player: Option<i32>,
    loser_player: Option<i32>,
) -> Result<(), Error> {
    async fn handle_update(
        trans: &mut deadpool_postgres::Transaction<'_>,
        updated: &mut HashSet<i32>,
        cascade_matches: &mut VecDeque<(i32, Option<i32>, PlayerOutcome)>,
        update_match_id: i32,
        player_idx: i32,
        player: &Option<i32>,
        outcome: PlayerOutcome,
    ) -> Result<(), Error> {
        let stmt = trans.prepare(&format!("UPDATE bracket_matches SET player{0}=$1 WHERE player{0}_sourcematch=$2 AND player{0}_sourceoutcome=$3 AND player{0} IS DISTINCT FROM $1 RETURNING id, winner", player_idx + 1)).await?;

        let rows = trans.query(&stmt, &[&player, &update_match_id, &outcome]).await?;
        let rows = trans
            .query(&stmt, &[&player, &update_match_id, &outcome])
            .await?;

        for row in rows {
            let id = row.get(0);


@@ 341,7 367,15 @@ pub async fn handle_winner_change(trans: &mut deadpool_postgres::Transaction<'_>
            updated.insert(id);

            if let Some(winner_idx) = winner_idx {
                cascade_matches.push_back((id, *player, if winner_idx == player_idx { PlayerOutcome::Win } else { PlayerOutcome::Loss }));
                cascade_matches.push_back((
                    id,
                    *player,
                    if winner_idx == player_idx {
                        PlayerOutcome::Win
                    } else {
                        PlayerOutcome::Loss
                    },
                ));
            }
        }



@@ 349,15 383,69 @@ pub async fn handle_winner_change(trans: &mut deadpool_postgres::Transaction<'_>
    }
    let mut cascade_matches = VecDeque::new();

    handle_update(trans, updated, &mut cascade_matches, match_id, 0, &winner_player, PlayerOutcome::Win).await?;
    handle_update(trans, updated, &mut cascade_matches, match_id, 1, &winner_player, PlayerOutcome::Win).await?;
    handle_update(trans, updated, &mut cascade_matches, match_id, 0, &loser_player, PlayerOutcome::Loss).await?;
    handle_update(trans, updated, &mut cascade_matches, match_id, 1, &loser_player, PlayerOutcome::Loss).await?;
    handle_update(
        trans,
        updated,
        &mut cascade_matches,
        match_id,
        0,
        &winner_player,
        PlayerOutcome::Win,
    )
    .await?;
    handle_update(
        trans,
        updated,
        &mut cascade_matches,
        match_id,
        1,
        &winner_player,
        PlayerOutcome::Win,
    )
    .await?;
    handle_update(
        trans,
        updated,
        &mut cascade_matches,
        match_id,
        0,
        &loser_player,
        PlayerOutcome::Loss,
    )
    .await?;
    handle_update(
        trans,
        updated,
        &mut cascade_matches,
        match_id,
        1,
        &loser_player,
        PlayerOutcome::Loss,
    )
    .await?;

    while let Some(info) = cascade_matches.pop_front() {
        let (cascade_match, changed_player, outcome) = info;
        handle_update(trans, updated, &mut cascade_matches, cascade_match, 0, &changed_player, outcome).await?;
        handle_update(trans, updated, &mut cascade_matches, cascade_match, 1, &changed_player, outcome).await?;
        handle_update(
            trans,
            updated,
            &mut cascade_matches,
            cascade_match,
            0,
            &changed_player,
            outcome,
        )
        .await?;
        handle_update(
            trans,
            updated,
            &mut cascade_matches,
            cascade_match,
            1,
            &changed_player,
            outcome,
        )
        .await?;
    }

    Ok(())

M brackend/src/main.rs => brackend/src/main.rs +57 -78
@@ 1,4 1,6 @@
use headers::Header;
use std::sync::Arc;
use trout::hyper::RoutingFailureExtHyper;

mod bracket_utils;
mod routes;


@@ 9,6 11,20 @@ pub type UserID = i32;
#[derive(Debug, Clone, Copy)]
pub struct BracketID(i64);

pub struct RouteContext {
    db_pool: DbPool,
    frontend_host: Option<String>,
}

pub type RouteNode<P> = trout::Node<
    P,
    hyper::Request<hyper::Body>,
    std::pin::Pin<
        Box<dyn std::future::Future<Output = Result<hyper::Response<hyper::Body>, Error>> + Send>,
    >,
    Arc<RouteContext>,
>;

impl BracketID {
    fn to_external(&self) -> String {
        bs58::encode(&self.0.to_be_bytes()).into_string()


@@ 22,15 38,6 @@ impl BracketID {
        BracketID(src)
    }

    fn parse_external(src: &str) -> Option<Self> {
        bs58::decode(src)
            .into_vec()
            .ok()
            .and_then(|value| std::convert::TryInto::try_into(&value[..]).ok())
            .map(|value| i64::from_be_bytes(value))
            .map(BracketID)
    }

    fn generate() -> Self {
        use rand::Rng;



@@ 38,12 45,23 @@ impl BracketID {
    }
}

impl std::str::FromStr for BracketID {
    type Err = bs58::decode::Error;

    fn from_str(src: &str) -> Result<Self, Self::Err> {
        let value = bs58::decode(src).into_vec()?;

        let value = std::convert::TryInto::try_into(&value[..]).unwrap();

        Ok(BracketID(i64::from_be_bytes(value)))
    }
}

#[derive(Debug)]
pub enum Error {
    Internal(Box<dyn std::error::Error + Send>),
    NotFound,
    MethodNotAllowed,
    UserError(hyper::Response<hyper::Body>),
    RoutingError(trout::RoutingFailure),
}

#[derive(Debug)]


@@ 137,7 155,7 @@ async fn get_login(
        Err(_) => return Ok(None),
    };

    let mut client = db_pool.get().await?;
    let client = db_pool.get().await?;

    let stmt = client
        .prepare("SELECT user_id FROM logins WHERE token=$1")


@@ 182,68 200,6 @@ fn to_204(_value: ()) -> hyper::Response<hyper::Body> {
    res
}

fn consume_path<'a>(path: &'a str, prefix: &str) -> Option<&'a str> {
    if path.starts_with(prefix) {
        Some(&path[prefix.len()..])
    } else {
        None
    }
}

fn consume_path_segment(path: &str) -> Option<(&str, &str)> {
    path.find('/').map(|idx| (&path[..idx], &path[(idx + 1)..]))
}

async fn handle_request(
    req: hyper::Request<hyper::Body>,
    db_pool: DbPool,
    frontend_host: Option<String>,
) -> Result<hyper::Response<hyper::Body>, hyper::Error> {
    let path_with_slash = format!("{}/", req.uri().path());
    let mut path = &path_with_slash[..];
    if path.ends_with("//") {
        path = &path[..(path.len() - 1)];
    }
    if path.starts_with('/') {
        path = &path[1..];
    }

    let result: Result<_, Error> = if let Some(path) = consume_path(path, "v1/") {
        if let Some(path) = consume_path(path, "users/") {
            routes::v1::users(path, db_pool, req).await
        } else if let Some(path) = consume_path(path, "brackets/") {
            routes::v1::brackets(path, db_pool, req).await
        } else {
            Err(Error::NotFound)
        }
    } else if let Some(path) = consume_path(path, "unstable/") {
        routes::unstable(path, req, db_pool, &frontend_host).await
    } else {
        Err(Error::NotFound)
    };

    Ok(match result {
        Ok(val) => val,
        Err(Error::UserError(res)) => res,
        Err(Error::NotFound) => {
            let mut res = hyper::Response::new("Not Found".into());
            *res.status_mut() = hyper::StatusCode::NOT_FOUND;
            res
        }
        Err(Error::MethodNotAllowed) => {
            let mut res = hyper::Response::new("Method Not Allowed".into());
            *res.status_mut() = hyper::StatusCode::METHOD_NOT_ALLOWED;
            res
        }
        Err(Error::Internal(err)) => {
            eprintln!("Error: {:?}", err);
            let mut res = hyper::Response::new("Internal Server Error".into());
            *res.status_mut() = hyper::StatusCode::INTERNAL_SERVER_ERROR;
            res
        }
    })
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let frontend_host = std::env::var("FRONTEND_HOST").ok();


@@ 260,14 216,37 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
        16,
    );

    let routes = Arc::new(routes::route_root());
    let context = Arc::new(RouteContext {
        db_pool,
        frontend_host,
    });

    let server = hyper::Server::bind(&(std::net::Ipv6Addr::UNSPECIFIED, 5000).into()).serve(
        hyper::service::make_service_fn(|_| {
            let db_pool = db_pool.clone();
            let frontend_host = frontend_host.clone();
            let routes = routes.clone();
            let context = context.clone();
            async {
                let db_pool = db_pool;
                Ok::<_, hyper::Error>(hyper::service::service_fn(move |req| {
                    handle_request(req, db_pool.clone(), frontend_host.clone())
                    let routes = routes.clone();
                    let context = context.clone();
                    async move {
                        let result = match routes.route(req, context) {
                            Ok(fut) => fut.await,
                            Err(err) => Err(Error::RoutingError(err)),
                        };
                        Ok::<_, hyper::Error>(match result {
                            Ok(val) => val,
                            Err(Error::UserError(res)) => res,
                            Err(Error::RoutingError(err)) => err.to_simple_response(),
                            Err(Error::Internal(err)) => {
                                eprintln!("Error: {:?}", err);
                                let mut res = hyper::Response::new("Internal Server Error".into());
                                *res.status_mut() = hyper::StatusCode::INTERNAL_SERVER_ERROR;
                                res
                            }
                        })
                    }
                }))
            }
        }),

M brackend/src/routes/mod.rs => brackend/src/routes/mod.rs +7 -3
@@ 1,4 1,8 @@
pub mod unstable;
pub mod v1;
mod unstable;
mod v1;

pub use unstable::route_unstable as unstable;
pub fn route_root() -> crate::RouteNode<()> {
    crate::RouteNode::new()
        .with_child("v1", v1::route_v1())
        .with_child("unstable", unstable::route_unstable())
}

M brackend/src/routes/unstable/mod.rs => brackend/src/routes/unstable/mod.rs +46 -58
@@ 1,62 1,50 @@
use crate::{
    consume_path, consume_path_segment, get_login, report_parse_error, require_login, to_200,
    BracketID, BracketType, DbPool, Error, LoginError, UserID,
    get_login, report_parse_error, require_login, to_200, BracketID, BracketType, DbPool, Error,
    LoginError, UserID,
};

pub async fn route_unstable(
    path: &str,
    req: hyper::Request<hyper::Body>,
    db_pool: DbPool,
    frontend_host: &Option<String>,
) -> Result<hyper::Response<hyper::Body>, Error> {
    if path == "users/me/brackets/" {
        match *req.method() {
            hyper::Method::GET => route_users_me_brackets_list_fn(req, db_pool)
                .await
                .map(|v| to_200(&v)),
            _ => Err(Error::MethodNotAllowed),
        }
    } else if path == "users/~me/" {
        match *req.method() {
            hyper::Method::GET => route_users_me_get_fn(req, db_pool)
                .await
                .map(|v| to_200(&v)),
            _ => Err(Error::MethodNotAllowed),
        }
    } else if let Some(path) = consume_path(path, "brackets/") {
        if let Some((id_str, path)) = consume_path_segment(path) {
            match BracketID::parse_external(id_str) {
                Some(bracket_id) => {
                    if path == "linkQr/" {
                        match *req.method() {
                            hyper::Method::GET => {
                                route_brackets_linkqr_fn(bracket_id, &frontend_host).await
                            }
                            _ => Err(Error::MethodNotAllowed),
                        }
                    } else {
                        Err(Error::NotFound)
                    }
                }
                None => Err(Error::NotFound),
            }
        } else {
            Err(Error::NotFound)
        }
    } else if let Some(path) = consume_path(path, "loginSessions/") {
        if path.is_empty() {
            match *req.method() {
                hyper::Method::POST => route_login_sessions_create_fn(req, db_pool)
pub fn route_unstable() -> crate::RouteNode<()> {
    let route_users = crate::RouteNode::new()
        .with_child(
            "me",
            crate::RouteNode::new().with_child(
                "brackets",
                crate::RouteNode::new().with_handler_async("GET", |_, ctx, req| async move {
                    route_users_me_brackets_list_fn(req, ctx.db_pool.clone())
                        .await
                        .map(|v| to_200(&v))
                }),
            ),
        )
        .with_child(
            "~me",
            crate::RouteNode::new().with_handler_async("GET", |_, ctx, req| async move {
                route_users_me_get_fn(req, ctx.db_pool.clone())
                    .await
                    .map(|v| to_200(&v)),
                _ => Err(Error::MethodNotAllowed),
            }
        } else {
            Err(Error::NotFound)
        }
    } else {
        Err(Error::NotFound)
    }
                    .map(|v| to_200(&v))
            }),
        );

    let route_brackets = crate::RouteNode::new().with_child_parse::<BracketID, _>(
        crate::RouteNode::new().with_child(
            "linkQr",
            crate::RouteNode::new().with_handler_async("GET", |(bracket_id,), ctx, _| async move {
                route_brackets_linkqr_fn(bracket_id, &ctx.frontend_host).await
            }),
        ),
    );

    let route_login_sessions =
        crate::RouteNode::new().with_handler_async("POST", |_, ctx, req| async move {
            route_login_sessions_create_fn(req, ctx.db_pool.clone())
                .await
                .map(|v| to_200(&v))
        });

    crate::RouteNode::new()
        .with_child("users", route_users)
        .with_child("brackets", route_brackets)
        .with_child("loginSessions", route_login_sessions)
}

async fn route_users_me_brackets_list_fn(


@@ 65,7 53,7 @@ async fn route_users_me_brackets_list_fn(
) -> Result<serde_json::Value, Error> {
    let user = require_login(&req, &db_pool).await?;

    let mut client = db_pool.get().await?;
    let client = db_pool.get().await?;

    let stmt = client.prepare("SELECT id, name, type FROM brackets, bracket_access WHERE bracket_access.bracket=brackets.id AND is_admin=TRUE AND user_id=$1").await?;
    let rows = client.query(&stmt, &[&user]).await?;


@@ 94,7 82,7 @@ async fn route_users_me_get_fn(
    match user {
        None => Ok(serde_json::Value::Null),
        Some(user) => {
            let mut client = db_pool.get().await?;
            let client = db_pool.get().await?;

            let stmt = client
                .prepare("SELECT username FROM users WHERE id=$1")


@@ 148,7 136,7 @@ async fn route_login_sessions_create_fn(
    let body: LoginBody = serde_json::from_slice(&hyper::body::to_bytes(req.into_body()).await?)
        .map_err(report_parse_error)?;

    let mut client = db_pool.get().await?;
    let client = db_pool.get().await?;

    let (password_hash, user_id, username) = {
        let stmt = client.prepare("SELECT password_hash, id, username FROM users WHERE LOWER(username)=LOWER($1) OR LOWER(email)=LOWER($1)").await?;

M brackend/src/routes/v1/brackets.rs => brackend/src/routes/v1/brackets.rs +137 -144
@@ 1,82 1,51 @@
use crate::bracket_utils;
use crate::bracket_utils::PlayerOutcome;
use crate::bracket_utils::PlayerSource;
use crate::{
    consume_path, consume_path_segment, deserialize_some, get_login, report_parse_error, to_200,
    to_204, BracketID, BracketType, DbPool, Error, LoginError,
    deserialize_some, get_login, report_parse_error, to_200, to_204, BracketID, BracketType,
    DbPool, Error, LoginError,
};
use crate::bracket_utils::PlayerOutcome;
use std::collections::HashMap;
use std::ops::Deref;

pub async fn route_brackets(
    path: &str,
    db_pool: DbPool,
    req: hyper::Request<hyper::Body>,
) -> Result<hyper::Response<hyper::Body>, Error> {
    if path.is_empty() {
        match *req.method() {
            hyper::Method::POST => route_brackets_create_fn(req, db_pool)
pub fn route_brackets() -> crate::RouteNode<()> {
    let route_match =
        crate::RouteNode::new().with_handler_async("PATCH", |(_, match_id), ctx, req| async move {
            route_bracket_matches_edit(req, ctx.db_pool.clone(), match_id)
                .await
                .map(|v| to_200(&v)),
            _ => Err(Error::MethodNotAllowed),
        }
    } else if let Some((id_str, path)) = consume_path_segment(path) {
        match BracketID::parse_external(id_str) {
            Some(bracket_id) => {
                if path.is_empty() {
                    match *req.method() {
                        hyper::Method::GET => route_brackets_get_fn(db_pool, bracket_id)
                            .await
                            .map(|v| to_200(&v)),
                        hyper::Method::PATCH => route_brackets_edit_fn(req, db_pool, bracket_id)
                            .await
                            .map(to_204),
                        _ => Err(Error::MethodNotAllowed),
                    }
                } else if let Some(path) = consume_path(path, "your/") {
                    if path.is_empty() {
                        match *req.method() {
                            hyper::Method::GET => {
                                route_brackets_your_get_fn(req, db_pool, bracket_id)
                                    .await
                                    .map(|v| to_200(&v))
                            }
                            _ => Err(Error::MethodNotAllowed),
                        }
                    } else {
                        Err(Error::NotFound)
                    }
                } else if let Some(path) = consume_path(path, "matches/") {
                    if let Some((id_str, path)) = consume_path_segment(path) {
                        match id_str.parse::<i32>() {
                            Ok(match_id) => {
                                if path.is_empty() {
                                    match *req.method() {
                                        hyper::Method::PATCH => {
                                            route_bracket_matches_edit(req, db_pool, match_id)
                                                .await
                                                .map(to_204)
                                        }
                                        _ => Err(Error::MethodNotAllowed),
                                    }
                                } else {
                                    Err(Error::NotFound)
                                }
                            }
                            Err(_) => Err(Error::NotFound), // TODO provide better error
                        }
                    } else {
                        Err(Error::NotFound)
                    }
                } else {
                    Err(Error::NotFound)
                }
            }
            None => Err(Error::NotFound),
        }
    } else {
        Err(Error::NotFound)
    }
                .map(to_204)
        });

    let route_matches = crate::RouteNode::new().with_child_parse::<i32, _>(route_match);

    let route_your =
        crate::RouteNode::new().with_handler_async("GET", |(bracket_id,), ctx, req| async move {
            route_brackets_your_get_fn(req, ctx.db_pool.clone(), bracket_id)
                .await
                .map(|v| to_200(&v))
        });

    let route_bracket = crate::RouteNode::new()
        .with_handler_async("GET", |(bracket_id,), ctx, _| async move {
            route_brackets_get_fn(ctx.db_pool.clone(), bracket_id)
                .await
                .map(|v| to_200(&v))
        })
        .with_handler_async("PATCH", |(bracket_id,), ctx, req| async move {
            route_brackets_edit_fn(req, ctx.db_pool.clone(), bracket_id)
                .await
                .map(to_204)
        })
        .with_child("your", route_your)
        .with_child("matches", route_matches);

    crate::RouteNode::new()
        .with_handler_async("POST", |_, ctx, req| async move {
            route_brackets_create_fn(req, ctx.db_pool.clone())
                .await
                .map(|v| to_200(&v))
        })
        .with_child_parse::<BracketID, _>(route_bracket)
}

async fn route_brackets_get_fn(


@@ 125,11 94,15 @@ async fn route_brackets_get_fn(
        use_scores: bool,
    }

    let mut client = db_pool.get().await?;
    let client = db_pool.get().await?;

    let main_row = {
        let stmt = client.prepare("SELECT name, description_md, use_scores FROM brackets WHERE id=$1").await?;
        client.query_one(&stmt, &[&bracket_id.as_internal()]).await?
        let stmt = client
            .prepare("SELECT name, description_md, use_scores FROM brackets WHERE id=$1")
            .await?;
        client
            .query_one(&stmt, &[&bracket_id.as_internal()])
            .await?
    };
    let matches_rows = {
        let stmt = client.prepare("SELECT id, player1, player2, player1_sourcematch, player1_sourceoutcome, player2_sourcematch, player2_sourceoutcome, score1, score2, winner, column_index, section_index, skip_if FROM bracket_matches WHERE bracket=$1 ORDER BY id").await?;


@@ 137,86 110,99 @@ async fn route_brackets_get_fn(
        client.query(&stmt, &[&bracket_id.as_internal()]).await?
    };
    let players_rows = {
            let stmt = client.prepare("SELECT id, name FROM bracket_players WHERE bracket=$1 ORDER BY id").await?;
        let stmt = client
            .prepare("SELECT id, name FROM bracket_players WHERE bracket=$1 ORDER BY id")
            .await?;

            client.query(&stmt, &[&bracket_id.as_internal()]).await?
        client.query(&stmt, &[&bracket_id.as_internal()]).await?
    };

    let name = main_row.get(0);
    let description_md = main_row.get(1);
    let use_scores = main_row.get(2);

    let players = players_rows.into_iter().map(|row| {
        ResponsePlayerInfo {
    let players = players_rows
        .into_iter()
        .map(|row| ResponsePlayerInfo {
            id: row.get(0),
            name: row.get(1),
        }
    }).collect();

    let match_map = matches_rows.iter().map(|row| {
        let id: i32 = row.get(0);
        let winner: Option<i32> = row.get(9);
        (id, winner)
    }).collect::<HashMap<_, _>>();

    let matches = matches_rows.into_iter().map(|row| {
        let id = row.get(0);
        let player1: Option<i32> = row.get(1);
        let player2: Option<i32> = row.get(2);
        let player1_sourcematch: Option<i32> = row.get(3);
        let player1_sourceoutcome: Option<PlayerOutcome> = row.get(4);
        let player2_sourcematch: Option<i32> = row.get(5);
        let player2_sourceoutcome: Option<PlayerOutcome> = row.get(6);
        let score1 = row.get(7);
        let score2 = row.get(8);
        let winner = row.get(9);
        let column_index = row.get(10);
        let section_index = row.get(11);
        let skip_if: Option<serde_json::Value> = row.get(12);

        let skipped = if let Some(skip_if) = skip_if {
            match skip_if["type"].as_str().unwrap() {
                "winner" => {
                    let from = skip_if["from"].as_i64().unwrap() as i32;
                    let is = skip_if["is"].as_i64().unwrap() as i32;

                    match match_map.get(&from) {
                        Some(skip_source_winner) => {
                            *skip_source_winner == Some(is)
                        },
                        None => false,
        })
        .collect();

    let match_map = matches_rows
        .iter()
        .map(|row| {
            let id: i32 = row.get(0);
            let winner: Option<i32> = row.get(9);
            (id, winner)
        })
        .collect::<HashMap<_, _>>();

    let matches = matches_rows
        .into_iter()
        .map(|row| {
            let id = row.get(0);
            let player1: Option<i32> = row.get(1);
            let player2: Option<i32> = row.get(2);
            let player1_sourcematch: Option<i32> = row.get(3);
            let player1_sourceoutcome: Option<PlayerOutcome> = row.get(4);
            let player2_sourcematch: Option<i32> = row.get(5);
            let player2_sourceoutcome: Option<PlayerOutcome> = row.get(6);
            let score1 = row.get(7);
            let score2 = row.get(8);
            let winner = row.get(9);
            let column_index = row.get(10);
            let section_index = row.get(11);
            let skip_if: Option<serde_json::Value> = row.get(12);

            let skipped = if let Some(skip_if) = skip_if {
                match skip_if["type"].as_str().unwrap() {
                    "winner" => {
                        let from = skip_if["from"].as_i64().unwrap() as i32;
                        let is = skip_if["is"].as_i64().unwrap() as i32;

                        match match_map.get(&from) {
                            Some(skip_source_winner) => *skip_source_winner == Some(is),
                            None => false,
                        }
                    }
                },
                _ => false,
            }
        } else { false };

        ResponseMatchInfo {
            id,
            players: (
                ResponseMatchPlayerInfo {
                    player: player1.map(|id| ResponseMatchPlayerPlayerInfo { id }),
                    source: player1_sourcematch
                        .and_then(|sourcematch| {
                            player1_sourceoutcome.map(|sourceoutcome| ResponseMatchPlayerSource { match_: sourcematch, outcome: sourceoutcome })
                    _ => false,
                }
            } else {
                false
            };

            ResponseMatchInfo {
                id,
                players: (
                    ResponseMatchPlayerInfo {
                        player: player1.map(|id| ResponseMatchPlayerPlayerInfo { id }),
                        source: player1_sourcematch.and_then(|sourcematch| {
                            player1_sourceoutcome.map(|sourceoutcome| ResponseMatchPlayerSource {
                                match_: sourcematch,
                                outcome: sourceoutcome,
                            })
                        }),
                    score: score1,
                },
                ResponseMatchPlayerInfo {
                    player: player2.map(|id| ResponseMatchPlayerPlayerInfo { id }),
                    source: player2_sourcematch
                        .and_then(|sourcematch| {
                            player2_sourceoutcome.map(|sourceoutcome| ResponseMatchPlayerSource { match_: sourcematch, outcome: sourceoutcome })
                        score: score1,
                    },
                    ResponseMatchPlayerInfo {
                        player: player2.map(|id| ResponseMatchPlayerPlayerInfo { id }),
                        source: player2_sourcematch.and_then(|sourcematch| {
                            player2_sourceoutcome.map(|sourceoutcome| ResponseMatchPlayerSource {
                                match_: sourcematch,
                                outcome: sourceoutcome,
                            })
                        }),
                    score: score2,
                },
            ),
            winner,
            column: column_index,
            section: section_index,
            skipped,
        }
    }).collect();
                        score: score2,
                    },
                ),
                winner,
                column: column_index,
                section: section_index,
                skipped,
            }
        })
        .collect();

    Ok(ResponseBracketInfo {
        id: bracket_id.to_external(),


@@ 411,7 397,14 @@ async fn route_bracket_matches_edit(
                _ => (None, None),
            };

            bracket_utils::handle_winner_change(&mut trans, &mut needing_updates, match_id, winner_player, loser_player).await?;
            bracket_utils::handle_winner_change(
                &mut trans,
                &mut needing_updates,
                match_id,
                winner_player,
                loser_player,
            )
            .await?;
        }

        trans.commit().await?;


@@ 773,7 766,7 @@ async fn route_brackets_your_get_fn(
        .await
        .map_err(LoginError::to_user)?;

    let mut client = db_pool.get().await?;
    let client = db_pool.get().await?;

    let stmt = client.prepare("SELECT is_admin FROM bracket_access WHERE bracket=$1 AND user_id=$2 AND is_admin=TRUE LIMIT 1").await?;
    let rows = client

M brackend/src/routes/v1/mod.rs => brackend/src/routes/v1/mod.rs +7 -4
@@ 1,5 1,8 @@
pub mod brackets;
pub mod users;
mod brackets;
mod users;

pub use brackets::route_brackets as brackets;
pub use users::route_users as users;
pub fn route_v1() -> crate::RouteNode<()> {
    crate::RouteNode::new()
        .with_child("brackets", brackets::route_brackets())
        .with_child("users", users::route_users())
}

M brackend/src/routes/v1/users.rs => brackend/src/routes/v1/users.rs +16 -34
@@ 1,6 1,4 @@
use crate::{
    consume_path_segment, report_parse_error, require_login, to_200, to_204, DbPool, Error, UserID,
};
use crate::{report_parse_error, require_login, to_200, to_204, DbPool, Error, UserID};

#[derive(Debug, Clone, Copy)]
enum UserIDOrMe {


@@ 29,37 27,21 @@ impl std::str::FromStr for UserIDOrMe {
    }
}

pub async fn route_users(
    path: &str,
    db_pool: DbPool,
    req: hyper::Request<hyper::Body>,
) -> Result<hyper::Response<hyper::Body>, Error> {
    if path.is_empty() {
        match *req.method() {
            hyper::Method::POST => route_users_create_fn(db_pool, req)
pub fn route_users() -> crate::RouteNode<()> {
    let route_user =
        crate::RouteNode::new().with_handler_async("PATCH", |(user,), ctx, req| async move {
            route_users_edit_fn(ctx.db_pool.clone(), req, user)
                .await
                .map(|v| to_200(&v)),
            _ => Err(Error::MethodNotAllowed),
        }
    } else if let Some((id_str, path)) = consume_path_segment(path) {
        match id_str.parse::<UserIDOrMe>() {
            Ok(user) => {
                if path.is_empty() {
                    match *req.method() {
                        hyper::Method::PATCH => {
                            route_users_edit_fn(db_pool, req, user).await.map(to_204)
                        }
                        _ => Err(Error::MethodNotAllowed),
                    }
                } else {
                    Err(Error::NotFound)
                }
            }
            Err(_) => Err(Error::NotFound),
        }
    } else {
        Err(Error::NotFound)
    }
                .map(to_204)
        });

    crate::RouteNode::new()
        .with_handler_async("POST", |_, ctx, req| async move {
            route_users_create_fn(ctx.db_pool.clone(), req)
                .await
                .map(|v| to_200(&v))
        })
        .with_child_parse::<UserIDOrMe, _>(route_user)
}

async fn route_users_create_fn(


@@ 80,7 62,7 @@ async fn route_users_create_fn(
        serde_json::from_slice(&body).map_err(report_parse_error)?
    };

    let mut client = db_pool.get().await?;
    let client = db_pool.get().await?;

    let (user_id, username): (i32, _) = match if let Some(username) = body.username {
        if let Some(password) = body.password {