Compare commits

...

52 Commits

Author SHA1 Message Date
Daniel Valdivia
aba7a9e1c9 Support to stream video (#1304)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-12-07 21:36:50 -06:00
adfost
3db22a2479 Rewind mode list directory bug fix (#1297)
* rewind bug fix

* adding constant
2021-12-07 18:01:44 -08:00
Daniel Valdivia
884321cfce Fix Capitalization on Tools Screen (#1305)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-12-07 17:41:18 -06:00
Daniel Valdivia
20c07a22e3 Remove Rewind Print (#1303)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-12-07 15:51:01 -06:00
Alex
bf126d3a84 Added fallback to default dashboard in case Prometheus is not accesible (#1302) 2021-12-07 13:39:50 -08:00
Daniel Valdivia
1e59f131e8 Fix 1299: Tools menu not showing for Heal Only Policy (#1301)
* Fix 1299: Tools menu not showing for Heal Only Policy

* Fix caching issue

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-12-07 15:38:36 -06:00
Prakash Senthil Vel
dfcd49bb5d UX make all delete modals consistent (#1289) 2021-12-07 14:58:38 -06:00
adfost
a7ab26c81e Disallow folders to share the same name as existing files. (#1279) 2021-12-07 14:33:30 -06:00
Alex
35855daa12 Added reset configuration option to settings pages (#1292)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>

Co-authored-by: Benjamin Perez <benjamin@bexsoft.net>
2021-12-07 10:41:52 -08:00
Lenin Alevski
3ce0b3d633 Fixed share/download object regression (#1296)
* Fixed share/download object regression
* Adding tests for computeObjectURLWithoutEncode function

Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2021-12-06 15:49:13 -06:00
Alex
569d2390b9 Added option to download selected items in object browser (#1286)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2021-12-03 13:10:32 -06:00
Daniel Valdivia
a39e468b96 Release v0.12.6 (#1285)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-12-02 13:56:50 -08:00
Alex
bbc47e6e11 Added select all to tableWrapper (#1283)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>

Co-authored-by: Benjamin Perez <benjamin@bexsoft.net>
2021-12-02 13:05:50 -08:00
Alex
4fb8c2f684 Disabled speedtest in standalone mode (#1278)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2021-12-01 16:47:29 -08:00
Daniel Valdivia
65dcdc674a Update ViewBox for UploadFolderIcon (#1277)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-12-01 13:14:08 -08:00
Daniel Valdivia
ebc2b208d2 Icons (#1275)
* Updated Icons

* Tweaks after rebase

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>

* Fix Object Manager Icons

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-12-01 12:07:19 -08:00
Lenin Alevski
b29fc0993b fix: access audit for bucket (#1270)
Policy listing in the Audit list tab was not displaying all the policies
with access to the current bucket

Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2021-11-30 21:47:54 -08:00
Alex
a3d0cb37a3 Implemented Upload folder functionality (#1272)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>

Co-authored-by: Benjamin Perez <benjamin@bexsoft.net>
2021-11-30 21:47:21 -08:00
Harshavardhana
85d549cc51 support all possible conditional values in policies (#1271)
Currently console only support "aws:username" as the
most basic variable for policy evaluation. This PR
extends this to add all the possible combinations
possible.

This includes all `jwt:*` and `ldap:*`
2021-11-30 23:14:55 -06:00
Daniel Valdivia
5f46ec2541 Update Readme screenshots (#1269)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-30 13:52:11 -06:00
Prakash Senthil Vel
9db0c358a4 UX Create New Tenant (#1266) 2021-11-30 13:21:55 -06:00
Harshavardhana
eefc6a7894 reload console certs upon SIGHUP (#1268) 2021-11-30 13:00:46 -06:00
Alex
c529a6d127 Added Object Manager feature for Uploads & downloads (#1265)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2021-11-30 12:06:01 -06:00
Prakash Senthil Vel
347c6aba3b Ux Tools screens (#1261)
Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-27 23:22:06 -08:00
Prakash Senthil Vel
400892565d UX Tiers screen (#1258) 2021-11-27 23:13:47 -08:00
Prakash Senthil Vel
b9873fa471 UX Notification endpoints (#1257)
Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-25 23:27:24 -06:00
Prakash Senthil Vel
62fe583a21 UX updates to Policy list Bucket and Object List (#1253)
Co-authored-by: Alex <33497058+bexsoft@users.noreply.github.com>
Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-25 14:10:23 -08:00
Kaan Kabalak
a69f597f43 Fix z-index of MainError component (#1256)
Fixes #1255
2021-11-24 22:18:00 -06:00
adfost
cdb4392633 Adding Download Directory to Console (#1235)
* Adding Download Directory Functionality

* fixing spaces

* removing unnecessary function

Co-authored-by: Alex <33497058+bexsoft@users.noreply.github.com>
Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-24 20:08:25 -08:00
Prakash Senthil Vel
41f77f128e Lazy load components (#1250)
Co-authored-by: Alex <33497058+bexsoft@users.noreply.github.com>
Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-24 19:45:09 -08:00
Alex
af68a0c7e4 Release v0.12.5 (#1252)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2021-11-23 23:40:02 -08:00
Lenin Alevski
0ea2193878 Adding SecureComponent to policy details page (#1251)
- Make Users & Policies clickeable only if user has permissions to view
  in bucket page
- Add SecureComponent to policy detail page: api calls, menu options,
  raw policy editor, etc.
- Add missing click action to groups in policy detail page
- Fix NPE in list groups for policy endpoint
- Added SecureComponent to ListPolicies page

Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2021-11-23 20:09:36 -08:00
Prakash Senthil Vel
06b08593b7 Login page UX (#1248) 2021-11-23 13:08:24 -06:00
adfost
6b3ff10027 Securizing bucket tags (#1249) 2021-11-23 11:52:14 -06:00
Daniel Valdivia
53d278a91e Define base for assets and support for sub path (#1247)
* Added correct mime type to files

* Define Base for Assets

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>

* lint

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>

* Make things relative

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>

* hop styling

Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>

Co-authored-by: Benjamin Perez <benjamin@bexsoft.net>
2021-11-22 21:02:16 -08:00
Daniel Valdivia
820fa61b43 Release v0.12.4 (#1246)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-19 17:46:21 -08:00
Lenin Alevski
3f60df9071 Validate provided external certificates during tenant creation (#1245)
Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>

Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-19 16:37:34 -08:00
Daniel Valdivia
0bbd4f0282 Lazy Load Login Screens and Menu Icons (#1244)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-19 16:12:31 -08:00
Lenin Alevski
1fa4d19e93 Adding secureComponent to groups and buckets description message (#1243)
Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>

Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-19 15:55:48 -08:00
Prakash Senthil Vel
f56b4905c9 Settings page ux refactor (#1242)
Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-19 15:27:18 -08:00
Daniel Valdivia
575bf2927d Lazy Load All Protected Routes (#1240)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-19 10:30:34 -08:00
Alex
6bacd0a45c Added autotune support to speedtest (#1239)
- Also updated tooltip trigger icon size

Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>

Co-authored-by: Benjamin Perez <benjamin@bexsoft.net>
2021-11-19 00:08:33 -08:00
Lenin Alevski
7f5de2d70e Adding SecureComponent to list groups and group details page (#1238)
Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>

Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-18 19:51:40 -08:00
Daniel Valdivia
f0d5398748 Deprecate SvgIcon and make all icons more consistent (#1237)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-18 19:00:37 -06:00
Prakash Senthil Vel
813458c4c1 UX cosmetics for users, groups, service accounts (#1236)
Co-authored-by: Alex <33497058+bexsoft@users.noreply.github.com>
2021-11-18 15:13:07 -06:00
Lenin Alevski
aae493ac82 Re-implement policy handling in react (#1234)
Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2021-11-18 08:25:01 -08:00
Lenin Alevski
f5234d2830 Simplify admin actions calculations on list buckets (#1233)
* Simplify admin actions calculations on list buckets

* adding license to file
2021-11-15 19:48:25 -06:00
Lenin Alevski
f6acb888d2 Fixed regression on share file endpoint (#1232)
Signed-off-by: Lenin Alevski <alevsk.8772@gmail.com>
2021-11-15 14:13:39 -08:00
Alex
5328f53943 UI Adjustments in share file modal (#1231)
UI Adjustments in share file modal (elements alignment & snackbars position fixes)

Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
2021-11-15 15:03:07 -06:00
Prakash Senthil Vel
70a4d76283 Service account ux (#1229)
Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-15 12:52:55 -08:00
Harshavardhana
373bfbfe3f feat: Support dynamic redirect_uris based on incoming requests (#1227)
To enable this feature you need `CONSOLE_IDP_CALLBACK_DYNAMIC=on`

```
export CONSOLE_IDP_URL=https://gitlab.com/.well-known/openid-configuration
export CONSOLE_IDP_CLIENT_ID="b0088c3836bb029393942f71ed7c8ac0add7f0856e6c86e67b0ff98f85c48658"
export CONSOLE_IDP_SECRET="ed72087b37624e89816ac27c1355420902045274edd7baad2ae29b1b0e8436fe"
export CONSOLE_IDP_SCOPES="openid,profile,email"
export CONSOLE_IDP_USERINFO="on"
export CONSOLE_IDP_CALLBACK_DYNAMIC=on
console srv
```

if this becomes a common practice, we should enable this as default in future.
2021-11-15 12:45:09 -08:00
Daniel Valdivia
b8417fb7a0 fix: policy handling with dynamic policy variables (#1226)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
2021-11-15 12:24:37 -08:00
705 changed files with 15906 additions and 9352 deletions

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [1.16.x]
go-version: [1.17.x]
os: [ubuntu-latest]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [1.16.x]
go-version: [1.17.x]
os: [ubuntu-latest]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [1.16.x]
go-version: [1.17.x]
os: [ubuntu-latest]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [1.16.x]
go-version: [1.17.x]
os: [ubuntu-latest]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [1.16.x]
go-version: [1.17.x]
os: [ubuntu-latest]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [1.16.x]
go-version: [1.17.x]
os: [ubuntu-latest]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [1.16.x]
go-version: [1.17.x]
os: [ubuntu-latest]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [1.16.x, 1.17.x]
go-version: [1.17.x]
os: [ubuntu-latest]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}

View File

@@ -21,7 +21,7 @@ jobs:
strategy:
matrix:
go-version: [1.16.x, 1.17.x]
go-version: [1.17.x]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
go-version: [1.16.x, 1.17.x]
go-version: [1.17.x]
os: [ubuntu-latest]
steps:
- name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}

View File

@@ -53,12 +53,12 @@ docker pull minio/console
```
### Build from source
> You will need a working Go environment. Therefore, please follow [How to install Go](https://golang.org/doc/install).
> Minimum version required is go1.17
```
GO111MODULE=on go install github.com/minio/console/cmd/console@latest
go install github.com/minio/console/cmd/console@latest
```
> You will need a working Go environment. Therefore, please follow [How to install Go](https://golang.org/doc/install).
> Minimum version required is go1.16
## Setup

View File

@@ -21,6 +21,7 @@ import (
"io/ioutil"
"path/filepath"
"strconv"
"syscall"
"time"
"github.com/minio/console/restapi"
@@ -173,6 +174,10 @@ func loadOperatorAllCerts(ctx *cli.Context) error {
}
}
if restapi.GlobalTLSCertsManager != nil {
restapi.GlobalTLSCertsManager.ReloadOnSignal(syscall.SIGHUP)
}
return nil
}

View File

@@ -22,6 +22,7 @@ import (
"os"
"path/filepath"
"strconv"
"syscall"
"time"
"github.com/go-openapi/loads"
@@ -172,6 +173,10 @@ func loadAllCerts(ctx *cli.Context) error {
}
}
if restapi.GlobalTLSCertsManager != nil {
restapi.GlobalTLSCertsManager.ReloadOnSignal(syscall.SIGHUP)
}
return nil
}

116
go.mod
View File

@@ -1,6 +1,6 @@
module github.com/minio/console
go 1.16
go 1.17
require (
github.com/blang/semver/v4 v4.0.0
@@ -13,6 +13,7 @@ require (
github.com/go-openapi/strfmt v0.20.0
github.com/go-openapi/swag v0.19.14
github.com/go-openapi/validate v0.20.2
github.com/golang-jwt/jwt/v4 v4.1.0
github.com/gorilla/websocket v1.4.2
github.com/jessevdk/go-flags v1.4.0
github.com/klauspost/compress v1.13.6
@@ -24,7 +25,7 @@ require (
github.com/minio/minio-go/v7 v7.0.15
github.com/minio/operator v0.0.0-20211011212245-31460bbbc4b7
github.com/minio/operator/logsearchapi v0.0.0-20211011212245-31460bbbc4b7
github.com/minio/pkg v1.1.5
github.com/minio/pkg v1.1.9
github.com/minio/selfupdate v0.3.1
github.com/mitchellh/go-homedir v1.1.0
github.com/rs/xid v1.3.0
@@ -40,4 +41,115 @@ require (
k8s.io/client-go v0.21.1
)
require (
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/StackExchange/wmi v1.2.1 // indirect
github.com/VividCortex/ewma v1.1.1 // indirect
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/briandowns/spinner v1.16.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/cheggaaa/pb v1.0.29 // indirect
github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0 // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/emicklei/go-restful v2.9.5+incompatible // indirect
github.com/evanphx/json-patch v4.9.0+incompatible // indirect
github.com/fatih/color v1.13.0 // indirect
github.com/fatih/structs v1.1.0 // indirect
github.com/georgysavva/scany v0.2.7 // indirect
github.com/go-logr/logr v0.4.0 // indirect
github.com/go-ole/go-ole v1.2.5 // indirect
github.com/go-openapi/analysis v0.20.0 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.5 // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/goccy/go-json v0.7.9 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/go-cmp v0.5.5 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/googleapis/gnostic v0.5.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.0.9 // indirect
github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect
github.com/lestrrat-go/blackmagic v1.0.0 // indirect
github.com/lestrrat-go/httpcc v1.0.0 // indirect
github.com/lestrrat-go/iter v1.0.1 // indirect
github.com/lestrrat-go/jwx v1.2.7 // indirect
github.com/lestrrat-go/option v1.0.0 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mattn/go-colorable v0.1.10 // indirect
github.com/mattn/go-ieproxy v0.0.1 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mattn/go-runewidth v0.0.13 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/mb0/glob v0.0.0-20160210091149-1eb79d2de6c4 // indirect
github.com/minio/argon2 v1.0.0 // indirect
github.com/minio/colorjson v1.0.1 // indirect
github.com/minio/filepath v1.0.0 // indirect
github.com/minio/md5-simd v1.1.2 // indirect
github.com/minio/sha256-simd v1.0.0 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/philhofer/fwd v1.1.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/profile v1.6.0 // indirect
github.com/pkg/xattr v0.4.3 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/posener/complete v1.2.3 // indirect
github.com/prometheus/client_golang v1.11.0 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.31.1 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/rjeczalik/notify v0.9.2 // indirect
github.com/shirou/gopsutil/v3 v3.21.8 // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/stretchr/objx v0.2.0 // indirect
github.com/tidwall/gjson v1.10.2 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tinylib/msgp v1.1.6 // indirect
github.com/tklauser/go-sysconf v0.3.9 // indirect
github.com/tklauser/numcpus v0.3.0 // indirect
go.etcd.io/etcd/api/v3 v3.5.0 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.0 // indirect
go.etcd.io/etcd/client/v3 v3.5.0 // indirect
go.mongodb.org/mongo-driver v1.4.6 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.7.0 // indirect
go.uber.org/zap v1.19.1 // indirect
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 // indirect
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect
google.golang.org/appengine v1.6.6 // indirect
google.golang.org/genproto v0.0.0-20210928142010-c7af6a1a74c9 // indirect
google.golang.org/grpc v1.41.0 // indirect
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/h2non/filetype.v1 v1.0.5 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.63.2 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
k8s.io/klog/v2 v2.8.0 // indirect
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect
k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect
maze.io/x/duration v0.0.0-20160924141736-faac084b6075 // indirect
sigs.k8s.io/controller-runtime v0.8.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.1.0 // indirect
sigs.k8s.io/yaml v1.2.0 // indirect
)
replace google.golang.org/grpc => google.golang.org/grpc v1.29.1

6
go.sum
View File

@@ -487,6 +487,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69
github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0=
github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -929,8 +931,8 @@ github.com/minio/pkg v1.0.3/go.mod h1:obU54TZ9QlMv0TRaDgQ/JTzf11ZSXxnSfLrm4tMtBP
github.com/minio/pkg v1.0.4/go.mod h1:obU54TZ9QlMv0TRaDgQ/JTzf11ZSXxnSfLrm4tMtBP8=
github.com/minio/pkg v1.0.11/go.mod h1:32x/3OmGB0EOi1N+3ggnp+B5VFkSBBB9svPMVfpnf14=
github.com/minio/pkg v1.1.3/go.mod h1:32x/3OmGB0EOi1N+3ggnp+B5VFkSBBB9svPMVfpnf14=
github.com/minio/pkg v1.1.5 h1:phwKkJBQdVLyxOXC3RChPVGLtebplzQJ5jJ3l/HBvnk=
github.com/minio/pkg v1.1.5/go.mod h1:32x/3OmGB0EOi1N+3ggnp+B5VFkSBBB9svPMVfpnf14=
github.com/minio/pkg v1.1.9 h1:NJrcrQyFCSgyF+u6v7FbPXjjNV0oSnBuBevhsTKmA2U=
github.com/minio/pkg v1.1.9/go.mod h1:32x/3OmGB0EOi1N+3ggnp+B5VFkSBBB9svPMVfpnf14=
github.com/minio/selfupdate v0.3.1 h1:BWEFSNnrZVMUWXbXIgLDNDjbejkmpAmZvy/nCz1HlEs=
github.com/minio/selfupdate v0.3.1/go.mod h1:b8ThJzzH7u2MkF6PcIra7KaXO9Khf6alWPvMSyTDCFM=
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=

View File

@@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="17" height="16.986" viewBox="0 0 17 16.986">
<g id="Tools" transform="translate(-56.747 -82.596)">
<g id="Grupo_1868" data-name="Grupo 1868">
<path id="Trazado_6843" data-name="Trazado 6843" d="M71.847,82.6,68.6,84.36l.016.961-2.387,2.387,2.411,2.411,2.42-2.42.871,0,1.82-3.206Z" fill="#bccee6"/>
<path id="Trazado_6844" data-name="Trazado 6844" d="M61.539,92.4l-4.525,4.525a.852.852,0,0,0,0,1.205l1.205,1.206a.853.853,0,0,0,1.206,0l4.524-4.525Z" fill="#bccee6"/>
</g>
<path id="Trazado_6845" data-name="Trazado 6845" d="M73.162,96.921l-9.736-9.735a3.381,3.381,0,0,0-4.152-4.153L61.343,85.1l-2.411,2.411-2.069-2.069A3.381,3.381,0,0,0,61.016,89.6l9.735,9.736a.853.853,0,0,0,1.206,0l1.205-1.206A.852.852,0,0,0,73.162,96.921Z" fill="#bccee6"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 828 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.8 MiB

View File

@@ -15,7 +15,7 @@ spec:
serviceAccountName: console-sa
containers:
- name: console
image: minio/console:v0.12.3
image: minio/console:v0.12.6
imagePullPolicy: "IfNotPresent"
env:
- name: CONSOLE_OPERATOR_MODE

View File

@@ -32,7 +32,7 @@ spec:
spec:
containers:
- name: console
image: minio/console:v0.12.3
image: minio/console:v0.12.6
imagePullPolicy: "IfNotPresent"
env:
- name: CONSOLE_MINIO_SERVER

View File

@@ -42,6 +42,9 @@ type AdminInfoResponse struct {
// objects
Objects int64 `json:"objects,omitempty"`
// prometheus not ready
PrometheusNotReady bool `json:"prometheusNotReady,omitempty"`
// servers
Servers []*ServerProperties `json:"servers"`

View File

@@ -40,18 +40,12 @@ type Bucket struct {
// access
Access *BucketAccess `json:"access,omitempty"`
// allowed actions
AllowedActions []string `json:"allowedActions"`
// creation date
CreationDate string `json:"creation_date,omitempty"`
// details
Details *BucketDetails `json:"details,omitempty"`
// manage
Manage bool `json:"manage,omitempty"`
// name
// Required: true
// Min Length: 3

View File

@@ -49,8 +49,8 @@ type SessionResponse struct {
// pages
Pages []string `json:"pages"`
// policy
Policy *IamPolicy `json:"policy,omitempty"`
// permissions
Permissions map[string][]string `json:"permissions,omitempty"`
// status
// Enum: [ok]
@@ -61,10 +61,6 @@ type SessionResponse struct {
func (m *SessionResponse) Validate(formats strfmt.Registry) error {
var res []error
if err := m.validatePolicy(formats); err != nil {
res = append(res, err)
}
if err := m.validateStatus(formats); err != nil {
res = append(res, err)
}
@@ -75,23 +71,6 @@ func (m *SessionResponse) Validate(formats strfmt.Registry) error {
return nil
}
func (m *SessionResponse) validatePolicy(formats strfmt.Registry) error {
if swag.IsZero(m.Policy) { // not required
return nil
}
if m.Policy != nil {
if err := m.Policy.Validate(formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("policy")
}
return err
}
}
return nil
}
var sessionResponseTypeStatusPropEnum []interface{}
func init() {
@@ -131,31 +110,8 @@ func (m *SessionResponse) validateStatus(formats strfmt.Registry) error {
return nil
}
// ContextValidate validate this session response based on the context it is used
// ContextValidate validates this session response based on context it is used
func (m *SessionResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
var res []error
if err := m.contextValidatePolicy(ctx, formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
func (m *SessionResponse) contextValidatePolicy(ctx context.Context, formats strfmt.Registry) error {
if m.Policy != nil {
if err := m.Policy.ContextValidate(ctx, formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("policy")
}
return err
}
}
return nil
}

View File

@@ -39,7 +39,7 @@ import (
func registerLoginHandlers(api *operations.OperatorAPI) {
// GET login strategy
api.UserAPILoginDetailHandler = user_api.LoginDetailHandlerFunc(func(params user_api.LoginDetailParams) middleware.Responder {
loginDetails, err := getLoginDetailsResponse()
loginDetails, err := getLoginDetailsResponse(params.HTTPRequest)
if err != nil {
return user_api.NewLoginDetailDefault(int(err.Code)).WithPayload(err)
}
@@ -60,7 +60,7 @@ func registerLoginHandlers(api *operations.OperatorAPI) {
})
// POST login using external IDP
api.UserAPILoginOauth2AuthHandler = user_api.LoginOauth2AuthHandlerFunc(func(params user_api.LoginOauth2AuthParams) middleware.Responder {
loginResponse, err := getLoginOauth2AuthResponse(params.Body)
loginResponse, err := getLoginOauth2AuthResponse(params.HTTPRequest, params.Body)
if err != nil {
return user_api.NewLoginOauth2AuthDefault(int(err.Code)).WithPayload(err)
}
@@ -91,14 +91,14 @@ func login(credentials restapi.ConsoleCredentialsI) (*string, error) {
}
// getLoginDetailsResponse returns information regarding the Console authentication mechanism.
func getLoginDetailsResponse() (*models.LoginDetails, *models.Error) {
func getLoginDetailsResponse(r *http.Request) (*models.LoginDetails, *models.Error) {
loginStrategy := models.LoginDetailsLoginStrategyServiceDashAccount
redirectURL := ""
if oauth2.IsIDPEnabled() {
loginStrategy = models.LoginDetailsLoginStrategyRedirect
// initialize new oauth2 client
oauth2Client, err := oauth2.NewOauth2ProviderClient(nil, restapi.GetConsoleHTTPClient())
oauth2Client, err := oauth2.NewOauth2ProviderClient(nil, r, restapi.GetConsoleHTTPClient())
if err != nil {
return nil, prepareError(err)
}
@@ -123,12 +123,12 @@ func verifyUserAgainstIDP(ctx context.Context, provider auth.IdentityProviderI,
return oauth2Token, nil
}
func getLoginOauth2AuthResponse(lr *models.LoginOauth2AuthRequest) (*models.LoginResponse, *models.Error) {
func getLoginOauth2AuthResponse(r *http.Request, lr *models.LoginOauth2AuthRequest) (*models.LoginResponse, *models.Error) {
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
defer cancel()
if oauth2.IsIDPEnabled() {
// initialize new oauth2 client
oauth2Client, err := oauth2.NewOauth2ProviderClient(nil, restapi.GetConsoleHTTPClient())
oauth2Client, err := oauth2.NewOauth2ProviderClient(nil, r, restapi.GetConsoleHTTPClient())
if err != nil {
return nil, prepareError(err)
}

View File

@@ -943,6 +943,11 @@ func getTenantCreatedResponse(session *models.Principal, params operator_api.Cre
},
}
_, err = clientSet.CoreV1().Secrets(ns).Create(ctx, &instanceSecret, metav1.CreateOptions{})
if err != nil {
return nil, prepareError(err)
}
// Enable/Disable console object browser for MinIO tenant (default is on)
enabledConsole := "on"
if tenantReq.EnableConsole != nil && !*tenantReq.EnableConsole {
@@ -952,11 +957,6 @@ func getTenantCreatedResponse(session *models.Principal, params operator_api.Cre
tenantConfigurationENV["MINIO_ROOT_USER"] = accessKey
tenantConfigurationENV["MINIO_ROOT_PASSWORD"] = secretKey
_, err = clientSet.CoreV1().Secrets(ns).Create(ctx, &instanceSecret, metav1.CreateOptions{})
if err != nil {
return nil, prepareError(err)
}
// delete secrets created if an error occurred during tenant creation,
defer func() {
if mError != nil {

View File

@@ -19,6 +19,7 @@ package operatorapi
import (
"context"
"crypto"
"crypto/tls"
"encoding/base64"
"encoding/hex"
"fmt"
@@ -307,6 +308,10 @@ func createOrReplaceExternalCertSecrets(ctx context.Context, clientSet K8sClient
if err != nil {
return nil, err
}
// check if the key pair is valid
if _, err = tls.X509KeyPair(tlsCrt, tlsKey); err != nil {
return nil, err
}
externalTLSCertificateSecret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: keyPairSecretName,

View File

@@ -185,7 +185,8 @@ func serveProxy(responseWriter http.ResponseWriter, req *http.Request) {
responseWriter.WriteHeader(500)
return
}
targetURL.Path = strings.Replace(req.URL.Path, fmt.Sprintf("/api/proxy/%s/%s", tenant.Namespace, tenant.Name), "", -1)
tenantBase := fmt.Sprintf("/api/proxy/%s/%s", tenant.Namespace, tenant.Name)
targetURL.Path = strings.Replace(req.URL.Path, tenantBase, "", -1)
proxiedCookie := &http.Cookie{
Name: "token",
@@ -207,8 +208,17 @@ func serveProxy(responseWriter http.ResponseWriter, req *http.Request) {
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
}}
// are we proxying something with cp=y? (console proxy) then add cpb (console proxy base) so the console
// on the other side updates the <base href="" /> to this value overriding sub path or root
if v := req.URL.Query().Get("cp"); v == "y" {
q := req.URL.Query()
q.Add("cpb", tenantBase)
req.URL.RawQuery = q.Encode()
}
// copy query params
targetURL.RawQuery = req.URL.Query().Encode()
proxRequest, err := http.NewRequest(req.Method, targetURL.String(), req.Body)
if err != nil {
log.Println(err)

View File

@@ -1,82 +0,0 @@
// This file is part of MinIO Orchestrator
// Copyright (c) 2021 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package acl
import iampolicy "github.com/minio/pkg/iam/policy"
var BucketViewerRole = iampolicy.NewActionSet(
iampolicy.ListBucketAction,
iampolicy.GetObjectAction,
)
var BucketEditorRole = iampolicy.NewActionSet(
iampolicy.ListBucketAction,
iampolicy.GetObjectAction,
iampolicy.DeleteObjectAction,
iampolicy.PutObjectAction,
)
var BucketAdminRole = iampolicy.NewActionSet(
iampolicy.AbortMultipartUploadAction,
iampolicy.CreateBucketAction,
iampolicy.DeleteBucketAction,
iampolicy.ForceDeleteBucketAction,
iampolicy.DeleteBucketPolicyAction,
iampolicy.GetBucketLocationAction,
iampolicy.GetBucketNotificationAction,
iampolicy.GetBucketPolicyAction,
iampolicy.HeadBucketAction,
iampolicy.ListAllMyBucketsAction,
iampolicy.GetBucketPolicyStatusAction,
iampolicy.ListBucketVersionsAction,
iampolicy.ListBucketMultipartUploadsAction,
iampolicy.ListenNotificationAction,
iampolicy.ListenBucketNotificationAction,
iampolicy.ListMultipartUploadPartsAction,
iampolicy.PutBucketLifecycleAction,
iampolicy.GetBucketLifecycleAction,
iampolicy.PutBucketNotificationAction,
iampolicy.PutBucketPolicyAction,
iampolicy.BypassGovernanceRetentionAction,
iampolicy.PutObjectRetentionAction,
iampolicy.GetObjectRetentionAction,
iampolicy.GetObjectLegalHoldAction,
iampolicy.PutObjectLegalHoldAction,
iampolicy.GetBucketObjectLockConfigurationAction,
iampolicy.PutBucketObjectLockConfigurationAction,
iampolicy.GetBucketTaggingAction,
iampolicy.PutBucketTaggingAction,
iampolicy.GetObjectVersionAction,
iampolicy.GetObjectVersionTaggingAction,
iampolicy.DeleteObjectVersionAction,
iampolicy.DeleteObjectVersionTaggingAction,
iampolicy.PutObjectVersionTaggingAction,
iampolicy.GetObjectTaggingAction,
iampolicy.PutObjectTaggingAction,
iampolicy.DeleteObjectTaggingAction,
iampolicy.PutBucketEncryptionAction,
iampolicy.GetBucketEncryptionAction,
iampolicy.PutBucketVersioningAction,
iampolicy.GetBucketVersioningAction,
iampolicy.GetReplicationConfigurationAction,
iampolicy.PutReplicationConfigurationAction,
iampolicy.ReplicateObjectAction,
iampolicy.ReplicateDeleteAction,
iampolicy.ReplicateTagsAction,
iampolicy.GetObjectVersionForReplicationAction,
iampolicy.AllActions,
iampolicy.AllAdminActions,
)

View File

@@ -45,15 +45,19 @@ func GetIDPSecret() string {
return env.Get(ConsoleIDPSecret, "")
}
// Public endpoint used by the identity oidcProvider when redirecting the user after identity verification
// Public endpoint used by the identity oidcProvider when redirecting
// the user after identity verification
func GetIDPCallbackURL() string {
return env.Get(ConsoleIDPCallbackURL, "")
}
func GetIDPCallbackURLDynamic() bool {
return env.Get(ConsoleIDPCallbackURLDynamic, "") == "on"
}
func IsIDPEnabled() bool {
return GetIDPURL() != "" &&
GetIDPClientID() != "" &&
GetIDPCallbackURL() != ""
GetIDPClientID() != ""
}
var defaultPassphraseForIDPHmac = utils.RandomCharString(64)

View File

@@ -18,14 +18,15 @@ package oauth2
// Environment constants for console IDP/SSO configuration
const (
ConsoleMinIOServer = "CONSOLE_MINIO_SERVER"
ConsoleIDPURL = "CONSOLE_IDP_URL"
ConsoleIDPClientID = "CONSOLE_IDP_CLIENT_ID"
ConsoleIDPSecret = "CONSOLE_IDP_SECRET"
ConsoleIDPCallbackURL = "CONSOLE_IDP_CALLBACK"
ConsoleIDPHmacPassphrase = "CONSOLE_IDP_HMAC_PASSPHRASE"
ConsoleIDPHmacSalt = "CONSOLE_IDP_HMAC_SALT"
ConsoleIDPScopes = "CONSOLE_IDP_SCOPES"
ConsoleIDPUserInfo = "CONSOLE_IDP_USERINFO"
ConsoleIDPTokenExpiration = "CONSOLE_IDP_TOKEN_EXPIRATION"
ConsoleMinIOServer = "CONSOLE_MINIO_SERVER"
ConsoleIDPURL = "CONSOLE_IDP_URL"
ConsoleIDPClientID = "CONSOLE_IDP_CLIENT_ID"
ConsoleIDPSecret = "CONSOLE_IDP_SECRET"
ConsoleIDPCallbackURL = "CONSOLE_IDP_CALLBACK"
ConsoleIDPCallbackURLDynamic = "CONSOLE_IDP_CALLBACK_DYNAMIC"
ConsoleIDPHmacPassphrase = "CONSOLE_IDP_HMAC_PASSPHRASE"
ConsoleIDPHmacSalt = "CONSOLE_IDP_HMAC_SALT"
ConsoleIDPScopes = "CONSOLE_IDP_SCOPES"
ConsoleIDPUserInfo = "CONSOLE_IDP_USERINFO"
ConsoleIDPTokenExpiration = "CONSOLE_IDP_TOKEN_EXPIRATION"
)

View File

@@ -119,11 +119,33 @@ var derivedKey = func() []byte {
return pbkdf2.Key([]byte(getPassphraseForIDPHmac()), []byte(getSaltForIDPHmac()), 4096, 32, sha1.New)
}
const (
schemeHTTP = "http"
schemeHTTPS = "https"
)
func getLoginCallbackURL(r *http.Request) string {
scheme := getSourceScheme(r)
if scheme == "" {
if r.TLS != nil {
scheme = schemeHTTPS
} else {
scheme = schemeHTTP
}
}
redirectURL := scheme + "://" + r.Host + "/oauth_callback"
_, err := url.Parse(redirectURL)
if err != nil {
panic(err)
}
return redirectURL
}
// NewOauth2ProviderClient instantiates a new oauth2 client using the configured credentials
// it returns a *Provider object that contains the necessary configuration to initiate an
// oauth2 authentication flow
func NewOauth2ProviderClient(scopes []string, httpClient *http.Client) (*Provider, error) {
func NewOauth2ProviderClient(scopes []string, r *http.Request, httpClient *http.Client) (*Provider, error) {
ddoc, err := parseDiscoveryDoc(GetIDPURL(), httpClient)
if err != nil {
return nil, err
@@ -134,6 +156,13 @@ func NewOauth2ProviderClient(scopes []string, httpClient *http.Client) (*Provide
scopes = strings.Split(getIDPScopes(), ",")
}
redirectURL := GetIDPCallbackURL()
if GetIDPCallbackURLDynamic() {
// dynamic redirect if set, will generate redirect URLs
// dynamically based on incoming requests.
redirectURL = getLoginCallbackURL(r)
}
// add "openid" scope always.
scopes = append(scopes, "openid")
@@ -141,7 +170,7 @@ func NewOauth2ProviderClient(scopes []string, httpClient *http.Client) (*Provide
client.oauth2Config = &xoauth2.Config{
ClientID: GetIDPClientID(),
ClientSecret: GetIDPSecret(),
RedirectURL: GetIDPCallbackURL(),
RedirectURL: redirectURL,
Endpoint: oauth2.Endpoint{
AuthURL: ddoc.AuthEndpoint,
TokenURL: ddoc.TokenEndpoint,

View File

@@ -0,0 +1,70 @@
// This file is part of MinIO Console Server
// Copyright (c) 2021 MinIO, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package oauth2
import (
"net/http"
"regexp"
"strings"
)
var (
// De-facto standard header keys.
xForwardedProto = http.CanonicalHeaderKey("X-Forwarded-Proto")
xForwardedScheme = http.CanonicalHeaderKey("X-Forwarded-Scheme")
)
var (
// RFC7239 defines a new "Forwarded: " header designed to replace the
// existing use of X-Forwarded-* headers.
// e.g. Forwarded: for=192.0.2.60;proto=https;by=203.0.113.43
forwarded = http.CanonicalHeaderKey("Forwarded")
// Allows for a sub-match of the first value after 'for=' to the next
// comma, semi-colon or space. The match is case-insensitive.
forRegex = regexp.MustCompile(`(?i)(?:for=)([^(;|,| )]+)(.*)`)
// Allows for a sub-match for the first instance of scheme (http|https)
// prefixed by 'proto='. The match is case-insensitive.
protoRegex = regexp.MustCompile(`(?i)^(;|,| )+(?:proto=)(https|http)`)
)
// getSourceScheme retrieves the scheme from the X-Forwarded-Proto and RFC7239
// Forwarded headers (in that order).
func getSourceScheme(r *http.Request) string {
var scheme string
// Retrieve the scheme from X-Forwarded-Proto.
if proto := r.Header.Get(xForwardedProto); proto != "" {
scheme = strings.ToLower(proto)
} else if proto = r.Header.Get(xForwardedScheme); proto != "" {
scheme = strings.ToLower(proto)
} else if proto := r.Header.Get(forwarded); proto != "" {
// match should contain at least two elements if the protocol was
// specified in the Forwarded header. The first element will always be
// the 'for=', which we ignore, subsequently we proceed to look for
// 'proto=' which should precede right after `for=` if not
// we simply ignore the values and return empty. This is in line
// with the approach we took for returning first ip from multiple
// params.
if match := forRegex.FindStringSubmatch(proto); len(match) > 1 {
if match = protoRegex.FindStringSubmatch(match[2]); len(match) > 1 {
scheme = strings.ToLower(match[2])
}
}
}
return scheme
}

View File

@@ -1,23 +1,378 @@
{
"files": {
"static/js/0.bbd0bc57.chunk.js": "./static/js/0.bbd0bc57.chunk.js",
"static/js/0.bbd0bc57.chunk.js.map": "./static/js/0.bbd0bc57.chunk.js.map",
"static/js/1.ebd5e498.chunk.js": "./static/js/1.ebd5e498.chunk.js",
"static/js/1.ebd5e498.chunk.js.map": "./static/js/1.ebd5e498.chunk.js.map",
"static/js/2.55f9ac3c.chunk.js": "./static/js/2.55f9ac3c.chunk.js",
"static/js/2.55f9ac3c.chunk.js.map": "./static/js/2.55f9ac3c.chunk.js.map",
"static/js/3.6601e8a9.chunk.js": "./static/js/3.6601e8a9.chunk.js",
"static/js/3.6601e8a9.chunk.js.map": "./static/js/3.6601e8a9.chunk.js.map",
"static/js/4.1c829629.chunk.js": "./static/js/4.1c829629.chunk.js",
"static/js/4.1c829629.chunk.js.map": "./static/js/4.1c829629.chunk.js.map",
"static/js/5.061631f9.chunk.js": "./static/js/5.061631f9.chunk.js",
"static/js/5.061631f9.chunk.js.map": "./static/js/5.061631f9.chunk.js.map",
"static/js/6.c64c35bd.chunk.js": "./static/js/6.c64c35bd.chunk.js",
"static/js/6.c64c35bd.chunk.js.map": "./static/js/6.c64c35bd.chunk.js.map",
"static/css/7.6b194dc9.chunk.css": "./static/css/7.6b194dc9.chunk.css",
"static/js/7.f8801d30.chunk.js": "./static/js/7.f8801d30.chunk.js",
"static/js/7.f8801d30.chunk.js.map": "./static/js/7.f8801d30.chunk.js.map",
"static/js/8.ae7674a3.chunk.js": "./static/js/8.ae7674a3.chunk.js",
"static/js/8.ae7674a3.chunk.js.map": "./static/js/8.ae7674a3.chunk.js.map",
"static/js/9.46c2ef0c.chunk.js": "./static/js/9.46c2ef0c.chunk.js",
"static/js/9.46c2ef0c.chunk.js.map": "./static/js/9.46c2ef0c.chunk.js.map",
"static/js/10.07fb2067.chunk.js": "./static/js/10.07fb2067.chunk.js",
"static/js/10.07fb2067.chunk.js.map": "./static/js/10.07fb2067.chunk.js.map",
"static/js/11.c8f95120.chunk.js": "./static/js/11.c8f95120.chunk.js",
"static/js/11.c8f95120.chunk.js.map": "./static/js/11.c8f95120.chunk.js.map",
"static/js/12.264e7a62.chunk.js": "./static/js/12.264e7a62.chunk.js",
"static/js/12.264e7a62.chunk.js.map": "./static/js/12.264e7a62.chunk.js.map",
"main.css": "./static/css/main.ed78990a.chunk.css",
"main.js": "./static/js/main.841aeb65.chunk.js",
"main.js.map": "./static/js/main.841aeb65.chunk.js.map",
"runtime-main.js": "./static/js/runtime-main.30f8243a.js",
"runtime-main.js.map": "./static/js/runtime-main.30f8243a.js.map",
"static/css/2.34c487e1.chunk.css": "./static/css/2.34c487e1.chunk.css",
"static/js/2.fef97d1a.chunk.js": "./static/js/2.fef97d1a.chunk.js",
"static/js/2.fef97d1a.chunk.js.map": "./static/js/2.fef97d1a.chunk.js.map",
"main.js": "./static/js/main.52981f9d.chunk.js",
"main.js.map": "./static/js/main.52981f9d.chunk.js.map",
"runtime-main.js": "./static/js/runtime-main.4514f95a.js",
"runtime-main.js.map": "./static/js/runtime-main.4514f95a.js.map",
"static/js/15.1baad81d.chunk.js": "./static/js/15.1baad81d.chunk.js",
"static/js/15.1baad81d.chunk.js.map": "./static/js/15.1baad81d.chunk.js.map",
"static/js/16.5ed162fe.chunk.js": "./static/js/16.5ed162fe.chunk.js",
"static/js/16.5ed162fe.chunk.js.map": "./static/js/16.5ed162fe.chunk.js.map",
"static/js/17.21848d07.chunk.js": "./static/js/17.21848d07.chunk.js",
"static/js/17.21848d07.chunk.js.map": "./static/js/17.21848d07.chunk.js.map",
"static/css/18.f324abd6.chunk.css": "./static/css/18.f324abd6.chunk.css",
"static/js/18.a7d18626.chunk.js": "./static/js/18.a7d18626.chunk.js",
"static/js/18.a7d18626.chunk.js.map": "./static/js/18.a7d18626.chunk.js.map",
"static/js/19.1a867b14.chunk.js": "./static/js/19.1a867b14.chunk.js",
"static/js/19.1a867b14.chunk.js.map": "./static/js/19.1a867b14.chunk.js.map",
"static/css/20.6b194dc9.chunk.css": "./static/css/20.6b194dc9.chunk.css",
"static/js/20.403b4b86.chunk.js": "./static/js/20.403b4b86.chunk.js",
"static/js/20.403b4b86.chunk.js.map": "./static/js/20.403b4b86.chunk.js.map",
"static/js/21.450b6032.chunk.js": "./static/js/21.450b6032.chunk.js",
"static/js/21.450b6032.chunk.js.map": "./static/js/21.450b6032.chunk.js.map",
"static/js/22.0d1b899b.chunk.js": "./static/js/22.0d1b899b.chunk.js",
"static/js/22.0d1b899b.chunk.js.map": "./static/js/22.0d1b899b.chunk.js.map",
"static/js/23.8b895b3a.chunk.js": "./static/js/23.8b895b3a.chunk.js",
"static/js/23.8b895b3a.chunk.js.map": "./static/js/23.8b895b3a.chunk.js.map",
"static/css/24.6b194dc9.chunk.css": "./static/css/24.6b194dc9.chunk.css",
"static/js/24.d67662c1.chunk.js": "./static/js/24.d67662c1.chunk.js",
"static/js/24.d67662c1.chunk.js.map": "./static/js/24.d67662c1.chunk.js.map",
"static/js/25.c2a20410.chunk.js": "./static/js/25.c2a20410.chunk.js",
"static/js/25.c2a20410.chunk.js.map": "./static/js/25.c2a20410.chunk.js.map",
"static/js/26.d6d6dd11.chunk.js": "./static/js/26.d6d6dd11.chunk.js",
"static/js/26.d6d6dd11.chunk.js.map": "./static/js/26.d6d6dd11.chunk.js.map",
"static/js/27.7f709b1f.chunk.js": "./static/js/27.7f709b1f.chunk.js",
"static/js/27.7f709b1f.chunk.js.map": "./static/js/27.7f709b1f.chunk.js.map",
"static/js/28.9a05dc15.chunk.js": "./static/js/28.9a05dc15.chunk.js",
"static/js/28.9a05dc15.chunk.js.map": "./static/js/28.9a05dc15.chunk.js.map",
"static/js/29.d35d5c75.chunk.js": "./static/js/29.d35d5c75.chunk.js",
"static/js/29.d35d5c75.chunk.js.map": "./static/js/29.d35d5c75.chunk.js.map",
"static/js/30.c2930a7f.chunk.js": "./static/js/30.c2930a7f.chunk.js",
"static/js/30.c2930a7f.chunk.js.map": "./static/js/30.c2930a7f.chunk.js.map",
"static/js/31.81b55354.chunk.js": "./static/js/31.81b55354.chunk.js",
"static/js/31.81b55354.chunk.js.map": "./static/js/31.81b55354.chunk.js.map",
"static/js/32.6c02b5ca.chunk.js": "./static/js/32.6c02b5ca.chunk.js",
"static/js/32.6c02b5ca.chunk.js.map": "./static/js/32.6c02b5ca.chunk.js.map",
"static/js/33.84557aa4.chunk.js": "./static/js/33.84557aa4.chunk.js",
"static/js/33.84557aa4.chunk.js.map": "./static/js/33.84557aa4.chunk.js.map",
"static/js/34.9d6400d3.chunk.js": "./static/js/34.9d6400d3.chunk.js",
"static/js/34.9d6400d3.chunk.js.map": "./static/js/34.9d6400d3.chunk.js.map",
"static/js/35.481a69d5.chunk.js": "./static/js/35.481a69d5.chunk.js",
"static/js/35.481a69d5.chunk.js.map": "./static/js/35.481a69d5.chunk.js.map",
"static/js/36.85f2f46d.chunk.js": "./static/js/36.85f2f46d.chunk.js",
"static/js/36.85f2f46d.chunk.js.map": "./static/js/36.85f2f46d.chunk.js.map",
"static/js/37.0ace1551.chunk.js": "./static/js/37.0ace1551.chunk.js",
"static/js/37.0ace1551.chunk.js.map": "./static/js/37.0ace1551.chunk.js.map",
"static/js/38.93590454.chunk.js": "./static/js/38.93590454.chunk.js",
"static/js/38.93590454.chunk.js.map": "./static/js/38.93590454.chunk.js.map",
"static/js/39.f42b42eb.chunk.js": "./static/js/39.f42b42eb.chunk.js",
"static/js/39.f42b42eb.chunk.js.map": "./static/js/39.f42b42eb.chunk.js.map",
"static/js/40.8d90a759.chunk.js": "./static/js/40.8d90a759.chunk.js",
"static/js/40.8d90a759.chunk.js.map": "./static/js/40.8d90a759.chunk.js.map",
"static/js/41.c1d199d2.chunk.js": "./static/js/41.c1d199d2.chunk.js",
"static/js/41.c1d199d2.chunk.js.map": "./static/js/41.c1d199d2.chunk.js.map",
"static/js/42.89b00241.chunk.js": "./static/js/42.89b00241.chunk.js",
"static/js/42.89b00241.chunk.js.map": "./static/js/42.89b00241.chunk.js.map",
"static/js/43.8e856c33.chunk.js": "./static/js/43.8e856c33.chunk.js",
"static/js/43.8e856c33.chunk.js.map": "./static/js/43.8e856c33.chunk.js.map",
"static/js/44.43e33c33.chunk.js": "./static/js/44.43e33c33.chunk.js",
"static/js/44.43e33c33.chunk.js.map": "./static/js/44.43e33c33.chunk.js.map",
"static/js/45.5f25b4d8.chunk.js": "./static/js/45.5f25b4d8.chunk.js",
"static/js/45.5f25b4d8.chunk.js.map": "./static/js/45.5f25b4d8.chunk.js.map",
"static/js/46.c82c9815.chunk.js": "./static/js/46.c82c9815.chunk.js",
"static/js/46.c82c9815.chunk.js.map": "./static/js/46.c82c9815.chunk.js.map",
"static/js/47.60af91fe.chunk.js": "./static/js/47.60af91fe.chunk.js",
"static/js/47.60af91fe.chunk.js.map": "./static/js/47.60af91fe.chunk.js.map",
"static/js/48.39511227.chunk.js": "./static/js/48.39511227.chunk.js",
"static/js/48.39511227.chunk.js.map": "./static/js/48.39511227.chunk.js.map",
"static/js/49.eb9d18f3.chunk.js": "./static/js/49.eb9d18f3.chunk.js",
"static/js/49.eb9d18f3.chunk.js.map": "./static/js/49.eb9d18f3.chunk.js.map",
"static/js/50.38ae74de.chunk.js": "./static/js/50.38ae74de.chunk.js",
"static/js/50.38ae74de.chunk.js.map": "./static/js/50.38ae74de.chunk.js.map",
"static/js/51.d3ea31df.chunk.js": "./static/js/51.d3ea31df.chunk.js",
"static/js/51.d3ea31df.chunk.js.map": "./static/js/51.d3ea31df.chunk.js.map",
"static/js/52.16d79d9c.chunk.js": "./static/js/52.16d79d9c.chunk.js",
"static/js/52.16d79d9c.chunk.js.map": "./static/js/52.16d79d9c.chunk.js.map",
"static/js/53.00903129.chunk.js": "./static/js/53.00903129.chunk.js",
"static/js/53.00903129.chunk.js.map": "./static/js/53.00903129.chunk.js.map",
"static/js/54.83a33e19.chunk.js": "./static/js/54.83a33e19.chunk.js",
"static/js/54.83a33e19.chunk.js.map": "./static/js/54.83a33e19.chunk.js.map",
"static/js/55.6e76a15b.chunk.js": "./static/js/55.6e76a15b.chunk.js",
"static/js/55.6e76a15b.chunk.js.map": "./static/js/55.6e76a15b.chunk.js.map",
"static/js/56.ac23329e.chunk.js": "./static/js/56.ac23329e.chunk.js",
"static/js/56.ac23329e.chunk.js.map": "./static/js/56.ac23329e.chunk.js.map",
"static/js/57.bc6b2353.chunk.js": "./static/js/57.bc6b2353.chunk.js",
"static/js/57.bc6b2353.chunk.js.map": "./static/js/57.bc6b2353.chunk.js.map",
"static/js/58.151e4454.chunk.js": "./static/js/58.151e4454.chunk.js",
"static/js/58.151e4454.chunk.js.map": "./static/js/58.151e4454.chunk.js.map",
"static/js/59.31635310.chunk.js": "./static/js/59.31635310.chunk.js",
"static/js/59.31635310.chunk.js.map": "./static/js/59.31635310.chunk.js.map",
"static/js/60.f06460fb.chunk.js": "./static/js/60.f06460fb.chunk.js",
"static/js/60.f06460fb.chunk.js.map": "./static/js/60.f06460fb.chunk.js.map",
"static/js/61.80c7b467.chunk.js": "./static/js/61.80c7b467.chunk.js",
"static/js/61.80c7b467.chunk.js.map": "./static/js/61.80c7b467.chunk.js.map",
"static/js/62.75395315.chunk.js": "./static/js/62.75395315.chunk.js",
"static/js/62.75395315.chunk.js.map": "./static/js/62.75395315.chunk.js.map",
"static/js/63.583ab3e1.chunk.js": "./static/js/63.583ab3e1.chunk.js",
"static/js/63.583ab3e1.chunk.js.map": "./static/js/63.583ab3e1.chunk.js.map",
"static/js/64.27d7ec0b.chunk.js": "./static/js/64.27d7ec0b.chunk.js",
"static/js/64.27d7ec0b.chunk.js.map": "./static/js/64.27d7ec0b.chunk.js.map",
"static/js/65.6b671c69.chunk.js": "./static/js/65.6b671c69.chunk.js",
"static/js/65.6b671c69.chunk.js.map": "./static/js/65.6b671c69.chunk.js.map",
"static/js/66.836ae09c.chunk.js": "./static/js/66.836ae09c.chunk.js",
"static/js/66.836ae09c.chunk.js.map": "./static/js/66.836ae09c.chunk.js.map",
"static/js/67.33b066bc.chunk.js": "./static/js/67.33b066bc.chunk.js",
"static/js/67.33b066bc.chunk.js.map": "./static/js/67.33b066bc.chunk.js.map",
"static/js/68.a1d2353a.chunk.js": "./static/js/68.a1d2353a.chunk.js",
"static/js/68.a1d2353a.chunk.js.map": "./static/js/68.a1d2353a.chunk.js.map",
"static/js/69.318b2252.chunk.js": "./static/js/69.318b2252.chunk.js",
"static/js/69.318b2252.chunk.js.map": "./static/js/69.318b2252.chunk.js.map",
"static/js/70.9706af72.chunk.js": "./static/js/70.9706af72.chunk.js",
"static/js/70.9706af72.chunk.js.map": "./static/js/70.9706af72.chunk.js.map",
"static/js/71.caa0071f.chunk.js": "./static/js/71.caa0071f.chunk.js",
"static/js/71.caa0071f.chunk.js.map": "./static/js/71.caa0071f.chunk.js.map",
"static/js/72.0f0f9990.chunk.js": "./static/js/72.0f0f9990.chunk.js",
"static/js/72.0f0f9990.chunk.js.map": "./static/js/72.0f0f9990.chunk.js.map",
"static/js/73.4143c0df.chunk.js": "./static/js/73.4143c0df.chunk.js",
"static/js/73.4143c0df.chunk.js.map": "./static/js/73.4143c0df.chunk.js.map",
"static/js/74.544576ad.chunk.js": "./static/js/74.544576ad.chunk.js",
"static/js/74.544576ad.chunk.js.map": "./static/js/74.544576ad.chunk.js.map",
"static/js/75.7c8f2bc1.chunk.js": "./static/js/75.7c8f2bc1.chunk.js",
"static/js/75.7c8f2bc1.chunk.js.map": "./static/js/75.7c8f2bc1.chunk.js.map",
"static/js/76.ed8b684e.chunk.js": "./static/js/76.ed8b684e.chunk.js",
"static/js/76.ed8b684e.chunk.js.map": "./static/js/76.ed8b684e.chunk.js.map",
"static/js/77.aed4e09e.chunk.js": "./static/js/77.aed4e09e.chunk.js",
"static/js/77.aed4e09e.chunk.js.map": "./static/js/77.aed4e09e.chunk.js.map",
"static/js/78.e3fadd3c.chunk.js": "./static/js/78.e3fadd3c.chunk.js",
"static/js/78.e3fadd3c.chunk.js.map": "./static/js/78.e3fadd3c.chunk.js.map",
"static/js/79.0de4c88d.chunk.js": "./static/js/79.0de4c88d.chunk.js",
"static/js/79.0de4c88d.chunk.js.map": "./static/js/79.0de4c88d.chunk.js.map",
"static/js/80.45e27426.chunk.js": "./static/js/80.45e27426.chunk.js",
"static/js/80.45e27426.chunk.js.map": "./static/js/80.45e27426.chunk.js.map",
"static/js/81.1115d1b3.chunk.js": "./static/js/81.1115d1b3.chunk.js",
"static/js/81.1115d1b3.chunk.js.map": "./static/js/81.1115d1b3.chunk.js.map",
"static/js/82.efb7d7fb.chunk.js": "./static/js/82.efb7d7fb.chunk.js",
"static/js/82.efb7d7fb.chunk.js.map": "./static/js/82.efb7d7fb.chunk.js.map",
"static/js/83.d035f073.chunk.js": "./static/js/83.d035f073.chunk.js",
"static/js/83.d035f073.chunk.js.map": "./static/js/83.d035f073.chunk.js.map",
"static/js/84.fc8c205e.chunk.js": "./static/js/84.fc8c205e.chunk.js",
"static/js/84.fc8c205e.chunk.js.map": "./static/js/84.fc8c205e.chunk.js.map",
"static/js/85.f4fcc302.chunk.js": "./static/js/85.f4fcc302.chunk.js",
"static/js/85.f4fcc302.chunk.js.map": "./static/js/85.f4fcc302.chunk.js.map",
"static/js/86.8badb158.chunk.js": "./static/js/86.8badb158.chunk.js",
"static/js/86.8badb158.chunk.js.map": "./static/js/86.8badb158.chunk.js.map",
"static/js/87.45e618b4.chunk.js": "./static/js/87.45e618b4.chunk.js",
"static/js/87.45e618b4.chunk.js.map": "./static/js/87.45e618b4.chunk.js.map",
"static/js/88.cfde196a.chunk.js": "./static/js/88.cfde196a.chunk.js",
"static/js/88.cfde196a.chunk.js.map": "./static/js/88.cfde196a.chunk.js.map",
"static/js/89.aa4762b3.chunk.js": "./static/js/89.aa4762b3.chunk.js",
"static/js/89.aa4762b3.chunk.js.map": "./static/js/89.aa4762b3.chunk.js.map",
"static/js/90.d2e87c3b.chunk.js": "./static/js/90.d2e87c3b.chunk.js",
"static/js/90.d2e87c3b.chunk.js.map": "./static/js/90.d2e87c3b.chunk.js.map",
"static/js/91.eefacc4a.chunk.js": "./static/js/91.eefacc4a.chunk.js",
"static/js/91.eefacc4a.chunk.js.map": "./static/js/91.eefacc4a.chunk.js.map",
"static/js/92.2ee4fd9e.chunk.js": "./static/js/92.2ee4fd9e.chunk.js",
"static/js/92.2ee4fd9e.chunk.js.map": "./static/js/92.2ee4fd9e.chunk.js.map",
"static/js/93.99f2b03d.chunk.js": "./static/js/93.99f2b03d.chunk.js",
"static/js/93.99f2b03d.chunk.js.map": "./static/js/93.99f2b03d.chunk.js.map",
"static/js/94.81a9a16d.chunk.js": "./static/js/94.81a9a16d.chunk.js",
"static/js/94.81a9a16d.chunk.js.map": "./static/js/94.81a9a16d.chunk.js.map",
"static/js/95.b72f29ae.chunk.js": "./static/js/95.b72f29ae.chunk.js",
"static/js/95.b72f29ae.chunk.js.map": "./static/js/95.b72f29ae.chunk.js.map",
"static/js/96.39ddd5ec.chunk.js": "./static/js/96.39ddd5ec.chunk.js",
"static/js/96.39ddd5ec.chunk.js.map": "./static/js/96.39ddd5ec.chunk.js.map",
"static/js/97.bb4de9b6.chunk.js": "./static/js/97.bb4de9b6.chunk.js",
"static/js/97.bb4de9b6.chunk.js.map": "./static/js/97.bb4de9b6.chunk.js.map",
"static/js/98.a8b77dbd.chunk.js": "./static/js/98.a8b77dbd.chunk.js",
"static/js/98.a8b77dbd.chunk.js.map": "./static/js/98.a8b77dbd.chunk.js.map",
"static/js/99.84cf0f84.chunk.js": "./static/js/99.84cf0f84.chunk.js",
"static/js/99.84cf0f84.chunk.js.map": "./static/js/99.84cf0f84.chunk.js.map",
"static/js/100.6299b626.chunk.js": "./static/js/100.6299b626.chunk.js",
"static/js/100.6299b626.chunk.js.map": "./static/js/100.6299b626.chunk.js.map",
"static/js/101.34a91628.chunk.js": "./static/js/101.34a91628.chunk.js",
"static/js/101.34a91628.chunk.js.map": "./static/js/101.34a91628.chunk.js.map",
"static/js/102.6e64a997.chunk.js": "./static/js/102.6e64a997.chunk.js",
"static/js/102.6e64a997.chunk.js.map": "./static/js/102.6e64a997.chunk.js.map",
"static/js/103.1b1d19c9.chunk.js": "./static/js/103.1b1d19c9.chunk.js",
"static/js/103.1b1d19c9.chunk.js.map": "./static/js/103.1b1d19c9.chunk.js.map",
"static/js/104.6768e9ed.chunk.js": "./static/js/104.6768e9ed.chunk.js",
"static/js/104.6768e9ed.chunk.js.map": "./static/js/104.6768e9ed.chunk.js.map",
"static/js/105.2b8c04ef.chunk.js": "./static/js/105.2b8c04ef.chunk.js",
"static/js/105.2b8c04ef.chunk.js.map": "./static/js/105.2b8c04ef.chunk.js.map",
"static/js/106.3d1121a5.chunk.js": "./static/js/106.3d1121a5.chunk.js",
"static/js/106.3d1121a5.chunk.js.map": "./static/js/106.3d1121a5.chunk.js.map",
"static/js/107.6df4ee34.chunk.js": "./static/js/107.6df4ee34.chunk.js",
"static/js/107.6df4ee34.chunk.js.map": "./static/js/107.6df4ee34.chunk.js.map",
"static/js/108.c9698302.chunk.js": "./static/js/108.c9698302.chunk.js",
"static/js/108.c9698302.chunk.js.map": "./static/js/108.c9698302.chunk.js.map",
"static/js/109.b12bf36d.chunk.js": "./static/js/109.b12bf36d.chunk.js",
"static/js/109.b12bf36d.chunk.js.map": "./static/js/109.b12bf36d.chunk.js.map",
"static/js/110.4160d1cf.chunk.js": "./static/js/110.4160d1cf.chunk.js",
"static/js/110.4160d1cf.chunk.js.map": "./static/js/110.4160d1cf.chunk.js.map",
"static/js/111.8071a262.chunk.js": "./static/js/111.8071a262.chunk.js",
"static/js/111.8071a262.chunk.js.map": "./static/js/111.8071a262.chunk.js.map",
"static/js/112.41140a20.chunk.js": "./static/js/112.41140a20.chunk.js",
"static/js/112.41140a20.chunk.js.map": "./static/js/112.41140a20.chunk.js.map",
"static/js/113.aa291f2b.chunk.js": "./static/js/113.aa291f2b.chunk.js",
"static/js/113.aa291f2b.chunk.js.map": "./static/js/113.aa291f2b.chunk.js.map",
"static/js/114.3e9f3d6f.chunk.js": "./static/js/114.3e9f3d6f.chunk.js",
"static/js/114.3e9f3d6f.chunk.js.map": "./static/js/114.3e9f3d6f.chunk.js.map",
"static/js/115.a30115de.chunk.js": "./static/js/115.a30115de.chunk.js",
"static/js/115.a30115de.chunk.js.map": "./static/js/115.a30115de.chunk.js.map",
"static/js/116.d1f1794c.chunk.js": "./static/js/116.d1f1794c.chunk.js",
"static/js/116.d1f1794c.chunk.js.map": "./static/js/116.d1f1794c.chunk.js.map",
"static/js/117.ac5e3d3f.chunk.js": "./static/js/117.ac5e3d3f.chunk.js",
"static/js/117.ac5e3d3f.chunk.js.map": "./static/js/117.ac5e3d3f.chunk.js.map",
"static/js/118.75e137ea.chunk.js": "./static/js/118.75e137ea.chunk.js",
"static/js/118.75e137ea.chunk.js.map": "./static/js/118.75e137ea.chunk.js.map",
"static/js/119.3829b916.chunk.js": "./static/js/119.3829b916.chunk.js",
"static/js/119.3829b916.chunk.js.map": "./static/js/119.3829b916.chunk.js.map",
"static/js/120.a152a982.chunk.js": "./static/js/120.a152a982.chunk.js",
"static/js/120.a152a982.chunk.js.map": "./static/js/120.a152a982.chunk.js.map",
"static/js/121.8a84c08f.chunk.js": "./static/js/121.8a84c08f.chunk.js",
"static/js/121.8a84c08f.chunk.js.map": "./static/js/121.8a84c08f.chunk.js.map",
"static/js/122.b59117f1.chunk.js": "./static/js/122.b59117f1.chunk.js",
"static/js/122.b59117f1.chunk.js.map": "./static/js/122.b59117f1.chunk.js.map",
"static/js/123.3b2fcf96.chunk.js": "./static/js/123.3b2fcf96.chunk.js",
"static/js/123.3b2fcf96.chunk.js.map": "./static/js/123.3b2fcf96.chunk.js.map",
"static/js/124.f686bc55.chunk.js": "./static/js/124.f686bc55.chunk.js",
"static/js/124.f686bc55.chunk.js.map": "./static/js/124.f686bc55.chunk.js.map",
"static/js/125.3716e01d.chunk.js": "./static/js/125.3716e01d.chunk.js",
"static/js/125.3716e01d.chunk.js.map": "./static/js/125.3716e01d.chunk.js.map",
"static/js/126.dc80cc09.chunk.js": "./static/js/126.dc80cc09.chunk.js",
"static/js/126.dc80cc09.chunk.js.map": "./static/js/126.dc80cc09.chunk.js.map",
"static/js/127.456d964d.chunk.js": "./static/js/127.456d964d.chunk.js",
"static/js/127.456d964d.chunk.js.map": "./static/js/127.456d964d.chunk.js.map",
"static/js/128.857aed05.chunk.js": "./static/js/128.857aed05.chunk.js",
"static/js/128.857aed05.chunk.js.map": "./static/js/128.857aed05.chunk.js.map",
"static/js/129.c9119817.chunk.js": "./static/js/129.c9119817.chunk.js",
"static/js/129.c9119817.chunk.js.map": "./static/js/129.c9119817.chunk.js.map",
"static/js/130.002b076a.chunk.js": "./static/js/130.002b076a.chunk.js",
"static/js/130.002b076a.chunk.js.map": "./static/js/130.002b076a.chunk.js.map",
"static/js/131.b3ff42ed.chunk.js": "./static/js/131.b3ff42ed.chunk.js",
"static/js/131.b3ff42ed.chunk.js.map": "./static/js/131.b3ff42ed.chunk.js.map",
"static/js/132.d779112d.chunk.js": "./static/js/132.d779112d.chunk.js",
"static/js/132.d779112d.chunk.js.map": "./static/js/132.d779112d.chunk.js.map",
"static/js/133.fa8f764a.chunk.js": "./static/js/133.fa8f764a.chunk.js",
"static/js/133.fa8f764a.chunk.js.map": "./static/js/133.fa8f764a.chunk.js.map",
"static/js/134.c0345466.chunk.js": "./static/js/134.c0345466.chunk.js",
"static/js/134.c0345466.chunk.js.map": "./static/js/134.c0345466.chunk.js.map",
"static/js/135.9ff2b814.chunk.js": "./static/js/135.9ff2b814.chunk.js",
"static/js/135.9ff2b814.chunk.js.map": "./static/js/135.9ff2b814.chunk.js.map",
"static/js/136.46fa081d.chunk.js": "./static/js/136.46fa081d.chunk.js",
"static/js/136.46fa081d.chunk.js.map": "./static/js/136.46fa081d.chunk.js.map",
"static/js/137.1aafc2ce.chunk.js": "./static/js/137.1aafc2ce.chunk.js",
"static/js/137.1aafc2ce.chunk.js.map": "./static/js/137.1aafc2ce.chunk.js.map",
"static/js/138.d6b4d31f.chunk.js": "./static/js/138.d6b4d31f.chunk.js",
"static/js/138.d6b4d31f.chunk.js.map": "./static/js/138.d6b4d31f.chunk.js.map",
"static/js/139.9f3b7a83.chunk.js": "./static/js/139.9f3b7a83.chunk.js",
"static/js/139.9f3b7a83.chunk.js.map": "./static/js/139.9f3b7a83.chunk.js.map",
"static/js/140.94226bd3.chunk.js": "./static/js/140.94226bd3.chunk.js",
"static/js/140.94226bd3.chunk.js.map": "./static/js/140.94226bd3.chunk.js.map",
"static/js/141.08ea2e6f.chunk.js": "./static/js/141.08ea2e6f.chunk.js",
"static/js/141.08ea2e6f.chunk.js.map": "./static/js/141.08ea2e6f.chunk.js.map",
"static/js/142.9aad0162.chunk.js": "./static/js/142.9aad0162.chunk.js",
"static/js/142.9aad0162.chunk.js.map": "./static/js/142.9aad0162.chunk.js.map",
"static/js/143.6b054de5.chunk.js": "./static/js/143.6b054de5.chunk.js",
"static/js/143.6b054de5.chunk.js.map": "./static/js/143.6b054de5.chunk.js.map",
"static/js/144.710f22e0.chunk.js": "./static/js/144.710f22e0.chunk.js",
"static/js/144.710f22e0.chunk.js.map": "./static/js/144.710f22e0.chunk.js.map",
"static/js/145.b34f91a6.chunk.js": "./static/js/145.b34f91a6.chunk.js",
"static/js/145.b34f91a6.chunk.js.map": "./static/js/145.b34f91a6.chunk.js.map",
"static/js/146.461d939d.chunk.js": "./static/js/146.461d939d.chunk.js",
"static/js/146.461d939d.chunk.js.map": "./static/js/146.461d939d.chunk.js.map",
"static/js/147.c3e6b738.chunk.js": "./static/js/147.c3e6b738.chunk.js",
"static/js/147.c3e6b738.chunk.js.map": "./static/js/147.c3e6b738.chunk.js.map",
"static/js/148.7930bf90.chunk.js": "./static/js/148.7930bf90.chunk.js",
"static/js/148.7930bf90.chunk.js.map": "./static/js/148.7930bf90.chunk.js.map",
"static/js/149.5bbf4dec.chunk.js": "./static/js/149.5bbf4dec.chunk.js",
"static/js/149.5bbf4dec.chunk.js.map": "./static/js/149.5bbf4dec.chunk.js.map",
"static/js/150.dc404782.chunk.js": "./static/js/150.dc404782.chunk.js",
"static/js/150.dc404782.chunk.js.map": "./static/js/150.dc404782.chunk.js.map",
"static/js/151.b148b310.chunk.js": "./static/js/151.b148b310.chunk.js",
"static/js/151.b148b310.chunk.js.map": "./static/js/151.b148b310.chunk.js.map",
"static/js/152.41b05532.chunk.js": "./static/js/152.41b05532.chunk.js",
"static/js/152.41b05532.chunk.js.map": "./static/js/152.41b05532.chunk.js.map",
"static/js/153.0c334304.chunk.js": "./static/js/153.0c334304.chunk.js",
"static/js/153.0c334304.chunk.js.map": "./static/js/153.0c334304.chunk.js.map",
"static/js/154.972b7fe1.chunk.js": "./static/js/154.972b7fe1.chunk.js",
"static/js/154.972b7fe1.chunk.js.map": "./static/js/154.972b7fe1.chunk.js.map",
"static/js/155.f61be17a.chunk.js": "./static/js/155.f61be17a.chunk.js",
"static/js/155.f61be17a.chunk.js.map": "./static/js/155.f61be17a.chunk.js.map",
"static/js/156.55ee670c.chunk.js": "./static/js/156.55ee670c.chunk.js",
"static/js/156.55ee670c.chunk.js.map": "./static/js/156.55ee670c.chunk.js.map",
"static/js/157.de124a2f.chunk.js": "./static/js/157.de124a2f.chunk.js",
"static/js/157.de124a2f.chunk.js.map": "./static/js/157.de124a2f.chunk.js.map",
"static/js/158.bfc41a16.chunk.js": "./static/js/158.bfc41a16.chunk.js",
"static/js/158.bfc41a16.chunk.js.map": "./static/js/158.bfc41a16.chunk.js.map",
"static/js/159.89112ee8.chunk.js": "./static/js/159.89112ee8.chunk.js",
"static/js/159.89112ee8.chunk.js.map": "./static/js/159.89112ee8.chunk.js.map",
"static/js/160.45dc50b0.chunk.js": "./static/js/160.45dc50b0.chunk.js",
"static/js/160.45dc50b0.chunk.js.map": "./static/js/160.45dc50b0.chunk.js.map",
"static/js/161.aec4eb58.chunk.js": "./static/js/161.aec4eb58.chunk.js",
"static/js/161.aec4eb58.chunk.js.map": "./static/js/161.aec4eb58.chunk.js.map",
"static/js/162.69652a57.chunk.js": "./static/js/162.69652a57.chunk.js",
"static/js/162.69652a57.chunk.js.map": "./static/js/162.69652a57.chunk.js.map",
"static/js/163.a5abf14d.chunk.js": "./static/js/163.a5abf14d.chunk.js",
"static/js/163.a5abf14d.chunk.js.map": "./static/js/163.a5abf14d.chunk.js.map",
"index.html": "./index.html",
"static/css/2.34c487e1.chunk.css.map": "./static/css/2.34c487e1.chunk.css.map",
"static/css/18.f324abd6.chunk.css.map": "./static/css/18.f324abd6.chunk.css.map",
"static/css/20.6b194dc9.chunk.css.map": "./static/css/20.6b194dc9.chunk.css.map",
"static/css/24.6b194dc9.chunk.css.map": "./static/css/24.6b194dc9.chunk.css.map",
"static/css/7.6b194dc9.chunk.css.map": "./static/css/7.6b194dc9.chunk.css.map",
"static/css/main.ed78990a.chunk.css.map": "./static/css/main.ed78990a.chunk.css.map",
"static/js/2.fef97d1a.chunk.js.LICENSE.txt": "./static/js/2.fef97d1a.chunk.js.LICENSE.txt"
"static/js/112.41140a20.chunk.js.LICENSE.txt": "./static/js/112.41140a20.chunk.js.LICENSE.txt",
"static/js/15.1baad81d.chunk.js.LICENSE.txt": "./static/js/15.1baad81d.chunk.js.LICENSE.txt",
"static/js/16.5ed162fe.chunk.js.LICENSE.txt": "./static/js/16.5ed162fe.chunk.js.LICENSE.txt",
"static/js/17.21848d07.chunk.js.LICENSE.txt": "./static/js/17.21848d07.chunk.js.LICENSE.txt",
"static/js/18.a7d18626.chunk.js.LICENSE.txt": "./static/js/18.a7d18626.chunk.js.LICENSE.txt",
"static/js/19.1a867b14.chunk.js.LICENSE.txt": "./static/js/19.1a867b14.chunk.js.LICENSE.txt",
"static/js/22.0d1b899b.chunk.js.LICENSE.txt": "./static/js/22.0d1b899b.chunk.js.LICENSE.txt",
"static/js/25.c2a20410.chunk.js.LICENSE.txt": "./static/js/25.c2a20410.chunk.js.LICENSE.txt",
"static/js/26.d6d6dd11.chunk.js.LICENSE.txt": "./static/js/26.d6d6dd11.chunk.js.LICENSE.txt",
"static/js/28.9a05dc15.chunk.js.LICENSE.txt": "./static/js/28.9a05dc15.chunk.js.LICENSE.txt",
"static/js/38.93590454.chunk.js.LICENSE.txt": "./static/js/38.93590454.chunk.js.LICENSE.txt",
"static/js/4.1c829629.chunk.js.LICENSE.txt": "./static/js/4.1c829629.chunk.js.LICENSE.txt",
"static/js/47.60af91fe.chunk.js.LICENSE.txt": "./static/js/47.60af91fe.chunk.js.LICENSE.txt",
"static/js/49.eb9d18f3.chunk.js.LICENSE.txt": "./static/js/49.eb9d18f3.chunk.js.LICENSE.txt",
"static/js/5.061631f9.chunk.js.LICENSE.txt": "./static/js/5.061631f9.chunk.js.LICENSE.txt",
"static/js/50.38ae74de.chunk.js.LICENSE.txt": "./static/js/50.38ae74de.chunk.js.LICENSE.txt",
"static/js/51.d3ea31df.chunk.js.LICENSE.txt": "./static/js/51.d3ea31df.chunk.js.LICENSE.txt",
"static/js/75.7c8f2bc1.chunk.js.LICENSE.txt": "./static/js/75.7c8f2bc1.chunk.js.LICENSE.txt",
"static/js/76.ed8b684e.chunk.js.LICENSE.txt": "./static/js/76.ed8b684e.chunk.js.LICENSE.txt",
"static/js/8.ae7674a3.chunk.js.LICENSE.txt": "./static/js/8.ae7674a3.chunk.js.LICENSE.txt",
"static/js/82.efb7d7fb.chunk.js.LICENSE.txt": "./static/js/82.efb7d7fb.chunk.js.LICENSE.txt",
"static/js/86.8badb158.chunk.js.LICENSE.txt": "./static/js/86.8badb158.chunk.js.LICENSE.txt",
"static/js/87.45e618b4.chunk.js.LICENSE.txt": "./static/js/87.45e618b4.chunk.js.LICENSE.txt",
"static/js/88.cfde196a.chunk.js.LICENSE.txt": "./static/js/88.cfde196a.chunk.js.LICENSE.txt",
"static/js/89.aa4762b3.chunk.js.LICENSE.txt": "./static/js/89.aa4762b3.chunk.js.LICENSE.txt",
"static/js/9.46c2ef0c.chunk.js.LICENSE.txt": "./static/js/9.46c2ef0c.chunk.js.LICENSE.txt",
"static/js/95.b72f29ae.chunk.js.LICENSE.txt": "./static/js/95.b72f29ae.chunk.js.LICENSE.txt",
"static/js/97.bb4de9b6.chunk.js.LICENSE.txt": "./static/js/97.bb4de9b6.chunk.js.LICENSE.txt"
},
"entrypoints": [
"static/js/runtime-main.30f8243a.js",
"static/css/2.34c487e1.chunk.css",
"static/js/2.fef97d1a.chunk.js",
"static/js/runtime-main.4514f95a.js",
"static/css/18.f324abd6.chunk.css",
"static/js/18.a7d18626.chunk.js",
"static/css/main.ed78990a.chunk.css",
"static/js/main.841aeb65.chunk.js"
"static/js/main.52981f9d.chunk.js"
]
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
.ReactVirtualized__Table__headerRow{font-weight:700;text-transform:uppercase}.ReactVirtualized__Table__headerRow,.ReactVirtualized__Table__row{display:flex;flex-direction:row;align-items:center}.ReactVirtualized__Table__headerTruncatedText{display:inline-block;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.ReactVirtualized__Table__headerColumn,.ReactVirtualized__Table__rowColumn{margin-right:10px;min-width:0}.ReactVirtualized__Table__rowColumn{text-overflow:ellipsis;white-space:nowrap}.ReactVirtualized__Table__headerColumn:first-of-type,.ReactVirtualized__Table__rowColumn:first-of-type{margin-left:10px}.ReactVirtualized__Table__sortableHeaderColumn{cursor:pointer}.ReactVirtualized__Table__sortableHeaderIconContainer{display:flex;align-items:center}.ReactVirtualized__Table__sortableHeaderIcon{flex:0 0 24px;height:1em;width:1em;fill:currentColor}.react-grid-layout{position:relative;transition:height .2s ease}.react-grid-item{transition:all .2s ease;transition-property:left,top}.react-grid-item img{pointer-events:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.react-grid-item.cssTransforms{transition-property:transform}.react-grid-item.resizing{z-index:1;will-change:width,height}.react-grid-item.react-draggable-dragging{transition:none;z-index:3;will-change:transform}.react-grid-item.dropping{visibility:hidden}.react-grid-item.react-grid-placeholder{background:red;opacity:.2;transition-duration:.1s;z-index:2;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.react-grid-item>.react-resizable-handle{position:absolute;width:20px;height:20px}.react-grid-item>.react-resizable-handle:after{content:"";position:absolute;right:3px;bottom:3px;width:5px;height:5px;border-right:2px solid rgba(0,0,0,.4);border-bottom:2px solid rgba(0,0,0,.4)}.react-resizable-hide>.react-resizable-handle{display:none}.react-grid-item>.react-resizable-handle.react-resizable-handle-sw{bottom:0;left:0;cursor:sw-resize;transform:rotate(90deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-se{bottom:0;right:0;cursor:se-resize}.react-grid-item>.react-resizable-handle.react-resizable-handle-nw{top:0;left:0;cursor:nw-resize;transform:rotate(180deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-ne{top:0;right:0;cursor:ne-resize;transform:rotate(270deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-e,.react-grid-item>.react-resizable-handle.react-resizable-handle-w{top:50%;margin-top:-10px;cursor:ew-resize}.react-grid-item>.react-resizable-handle.react-resizable-handle-w{left:0;transform:rotate(135deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-e{right:0;transform:rotate(315deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-n,.react-grid-item>.react-resizable-handle.react-resizable-handle-s{left:50%;margin-left:-10px;cursor:ns-resize}.react-grid-item>.react-resizable-handle.react-resizable-handle-n{top:0;transform:rotate(225deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-s{bottom:0;transform:rotate(45deg)}.react-resizable{position:relative}.react-resizable-handle{position:absolute;width:20px;height:20px;background-repeat:no-repeat;background-origin:content-box;box-sizing:border-box;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmYwMCIgd2lkdGg9IjYiIGhlaWdodD0iNiI+PHBhdGggZD0iTTYgNkgwVjQuMmg0LjJWMEg2djZ6IiBvcGFjaXR5PSIuMzAyIi8+PC9zdmc+");background-position:100% 100%;padding:0 3px 3px 0}.react-resizable-handle-sw{bottom:0;left:0;cursor:sw-resize;transform:rotate(90deg)}.react-resizable-handle-se{bottom:0;right:0;cursor:se-resize}.react-resizable-handle-nw{top:0;left:0;cursor:nw-resize;transform:rotate(180deg)}.react-resizable-handle-ne{top:0;right:0;cursor:ne-resize;transform:rotate(270deg)}.react-resizable-handle-e,.react-resizable-handle-w{top:50%;margin-top:-10px;cursor:ew-resize}.react-resizable-handle-w{left:0;transform:rotate(135deg)}.react-resizable-handle-e{right:0;transform:rotate(315deg)}.react-resizable-handle-n,.react-resizable-handle-s{left:50%;margin-left:-10px;cursor:ns-resize}.react-resizable-handle-n{top:0;transform:rotate(225deg)}.react-resizable-handle-s{bottom:0;transform:rotate(45deg)}
/*# sourceMappingURL=18.f324abd6.chunk.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,8 @@
/** @license React v17.0.2
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More