From c33c6a2c9a34ff6fa6fd1a1d29a3ddde91939212 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 21 Aug 2020 11:57:41 +0800 Subject: [PATCH 001/126] test listener --- pkg/cluster/manager.go | 8 ++++++++ pkg/cluster/task/ssh_keygen.go | 8 ++++---- pkg/cluster/task/step.go | 13 +++++++++---- pkg/cluster/task/task.go | 12 ++++++------ 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index ce3c223a9f..66630188e2 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -1108,6 +1108,14 @@ func (m *Manager) Deploy( t := builder.Build() + ctx := task.NewContext() + ctx.Ev.Subscribe(task.EventTaskBegin, func(task task.Task) { + fmt.Println("external /////////////", task) + }) + ctx.Ev.Subscribe(task.EventTaskProgress, func(task task.Task, p string) { + fmt.Println("external /////////////", task, p) + }) + if err := t.Execute(task.NewContext()); err != nil { if errorx.Cast(err) != nil { // FIXME: Map possible task errors and give suggestions. diff --git a/pkg/cluster/task/ssh_keygen.go b/pkg/cluster/task/ssh_keygen.go index 577fb88a99..f37b5ab856 100644 --- a/pkg/cluster/task/ssh_keygen.go +++ b/pkg/cluster/task/ssh_keygen.go @@ -35,7 +35,7 @@ type SSHKeyGen struct { // Execute implements the Task interface func (s *SSHKeyGen) Execute(ctx *Context) error { - ctx.ev.PublishTaskProgress(s, "Generate SSH keys") + ctx.Ev.PublishTaskProgress(s, "Generate SSH keys") savePrivateFileTo := s.keypath savePublicFileTo := s.keypath + ".pub" @@ -49,13 +49,13 @@ func (s *SSHKeyGen) Execute(ctx *Context) error { bitSize := 4096 - ctx.ev.PublishTaskProgress(s, "Generate private key") + ctx.Ev.PublishTaskProgress(s, "Generate private key") privateKey, err := s.generatePrivateKey(bitSize) if err != nil { return errors.Trace(err) } - ctx.ev.PublishTaskProgress(s, "Generate public key") + ctx.Ev.PublishTaskProgress(s, "Generate public key") publicKeyBytes, err := s.generatePublicKey(&privateKey.PublicKey) if err != nil { return errors.Trace(err) @@ -63,7 +63,7 @@ func (s *SSHKeyGen) Execute(ctx *Context) error { privateKeyBytes := s.encodePrivateKeyToPEM(privateKey) - ctx.ev.PublishTaskProgress(s, "Persist keys") + ctx.Ev.PublishTaskProgress(s, "Persist keys") err = s.writeKeyToFile(privateKeyBytes, savePrivateFileTo) if err != nil { return errors.Trace(err) diff --git a/pkg/cluster/task/step.go b/pkg/cluster/task/step.go index 5b40c3d7ce..3c32673729 100644 --- a/pkg/cluster/task/step.go +++ b/pkg/cluster/task/step.go @@ -14,6 +14,7 @@ package task import ( + "fmt" "strings" "github.com/pingcap/tiup/pkg/cliutil/progress" @@ -80,11 +81,11 @@ func (s *StepDisplay) Execute(ctx *Context) error { if singleBar, ok := s.progressBar.(*progress.SingleBar); ok { singleBar.StartRenderLoop() } - ctx.ev.Subscribe(EventTaskBegin, s.handleTaskBegin) - ctx.ev.Subscribe(EventTaskProgress, s.handleTaskProgress) + ctx.Ev.Subscribe(EventTaskBegin, s.handleTaskBegin) + ctx.Ev.Subscribe(EventTaskProgress, s.handleTaskProgress) err := s.inner.Execute(ctx) - ctx.ev.Unsubscribe(EventTaskProgress, s.handleTaskProgress) - ctx.ev.Unsubscribe(EventTaskBegin, s.handleTaskBegin) + ctx.Ev.Unsubscribe(EventTaskProgress, s.handleTaskProgress) + ctx.Ev.Unsubscribe(EventTaskBegin, s.handleTaskBegin) if err != nil { s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, @@ -113,6 +114,8 @@ func (s *StepDisplay) String() string { } func (s *StepDisplay) handleTaskBegin(task Task) { + fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@", task) + if _, ok := s.children[task]; !ok { return } @@ -123,6 +126,8 @@ func (s *StepDisplay) handleTaskBegin(task Task) { } func (s *StepDisplay) handleTaskProgress(task Task, p string) { + fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@", task, p) + if _, ok := s.children[task]; !ok { return } diff --git a/pkg/cluster/task/task.go b/pkg/cluster/task/task.go index fc9e63e7a3..d50f117978 100644 --- a/pkg/cluster/task/task.go +++ b/pkg/cluster/task/task.go @@ -46,7 +46,7 @@ type ( // We should use mutex to prevent concurrent R/W for some fields // because of the same context can be shared in parallel tasks. Context struct { - ev EventBus + Ev EventBus exec struct { sync.RWMutex @@ -77,7 +77,7 @@ type ( // NewContext create a context instance. func NewContext() *Context { return &Context{ - ev: NewEventBus(), + Ev: NewEventBus(), exec: struct { sync.RWMutex executors map[string]executor.Executor @@ -185,9 +185,9 @@ func (s *Serial) Execute(ctx *Context) error { log.Infof("+ [ Serial ] - %s", t.String()) } } - ctx.ev.PublishTaskBegin(t) + ctx.Ev.PublishTaskBegin(t) err := t.Execute(ctx) - ctx.ev.PublishTaskFinish(t, err) + ctx.Ev.PublishTaskFinish(t, err) if err != nil { return err } @@ -238,9 +238,9 @@ func (pt *Parallel) Execute(ctx *Context) error { log.Infof("+ [Parallel] - %s", t.String()) } } - ctx.ev.PublishTaskBegin(t) + ctx.Ev.PublishTaskBegin(t) err := t.Execute(ctx) - ctx.ev.PublishTaskFinish(t, err) + ctx.Ev.PublishTaskFinish(t, err) if err != nil { mu.Lock() if firstError == nil { From 331db68800e376713ef365798bab8ae70556e033 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 21 Aug 2020 12:00:13 +0800 Subject: [PATCH 002/126] add vagrant for test --- examples/manualTestEnv/.gitignore | 2 + .../_shared/Vagrantfile.partial.pubKey.ruby | 12 ++++ examples/manualTestEnv/_shared/vagrant_key | 27 ++++++++ .../manualTestEnv/_shared/vagrant_key.pub | 1 + examples/manualTestEnv/multiHost/README.md | 36 +++++++++++ examples/manualTestEnv/multiHost/Vagrantfile | 14 ++++ .../manualTestEnv/multiHost/topology.yaml | 42 ++++++++++++ examples/manualTestEnv/multiReplica/README.md | 36 +++++++++++ .../manualTestEnv/multiReplica/Vagrantfile | 10 +++ .../manualTestEnv/multiReplica/topology.yaml | 64 +++++++++++++++++++ examples/manualTestEnv/singleHost/README.md | 36 +++++++++++ examples/manualTestEnv/singleHost/Vagrantfile | 10 +++ .../manualTestEnv/singleHost/topology.yaml | 37 +++++++++++ .../singleHostMultiDisk/.gitignore | 1 + .../singleHostMultiDisk/README.md | 36 +++++++++++ .../singleHostMultiDisk/Vagrantfile | 10 +++ .../singleHostMultiDisk/topology.yaml | 39 +++++++++++ 17 files changed, 413 insertions(+) create mode 100644 examples/manualTestEnv/.gitignore create mode 100644 examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.ruby create mode 100644 examples/manualTestEnv/_shared/vagrant_key create mode 100644 examples/manualTestEnv/_shared/vagrant_key.pub create mode 100644 examples/manualTestEnv/multiHost/README.md create mode 100644 examples/manualTestEnv/multiHost/Vagrantfile create mode 100644 examples/manualTestEnv/multiHost/topology.yaml create mode 100644 examples/manualTestEnv/multiReplica/README.md create mode 100644 examples/manualTestEnv/multiReplica/Vagrantfile create mode 100644 examples/manualTestEnv/multiReplica/topology.yaml create mode 100644 examples/manualTestEnv/singleHost/README.md create mode 100644 examples/manualTestEnv/singleHost/Vagrantfile create mode 100644 examples/manualTestEnv/singleHost/topology.yaml create mode 100644 examples/manualTestEnv/singleHostMultiDisk/.gitignore create mode 100644 examples/manualTestEnv/singleHostMultiDisk/README.md create mode 100644 examples/manualTestEnv/singleHostMultiDisk/Vagrantfile create mode 100644 examples/manualTestEnv/singleHostMultiDisk/topology.yaml diff --git a/examples/manualTestEnv/.gitignore b/examples/manualTestEnv/.gitignore new file mode 100644 index 0000000000..2f8e58cd1e --- /dev/null +++ b/examples/manualTestEnv/.gitignore @@ -0,0 +1,2 @@ +.vagrant/ +tiup-cluster-*.log diff --git a/examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.ruby b/examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.ruby new file mode 100644 index 0000000000..3af2b17570 --- /dev/null +++ b/examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.ruby @@ -0,0 +1,12 @@ +Vagrant.configure("2") do |config| + ssh_pub_key = File.readlines("#{File.dirname(__FILE__)}/vagrant_key.pub").first.strip + + config.vm.box = "hashicorp/bionic64" + config.vm.provision "shell", privileged: false, inline: <<-SHELL + sudo apt install -y zsh + sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" + sudo chsh -s /usr/bin/zsh vagrant + + echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys + SHELL +end diff --git a/examples/manualTestEnv/_shared/vagrant_key b/examples/manualTestEnv/_shared/vagrant_key new file mode 100644 index 0000000000..7b55495744 --- /dev/null +++ b/examples/manualTestEnv/_shared/vagrant_key @@ -0,0 +1,27 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn +NhAAAAAwEAAQAAAQEAxboZzYumqNoVOQ/hKKhIZHxNhf5tmnkLZry8i6Xur4FPLDiRxos/ +xVVDx0ynTPOyQVVaXtNxZnAmbR4HuNBzRvNoklwSXazt5YgWeiKCHtPpKFt3PJeE2cn6FJ +p6F6qFChG0NSPbZxJWWxv4noX0U3PLKgHNIehYK2Fu0E6plhSZazzJEVWapwo9d7aGnAsz +bBCd5TNZ5ogrXn+3bSFcdCbAfWOwYg54a+PzTQlzgt6JmhlEjpFfPhhpBW92pQXxmQ2c17 +iPCbA8G++FiaEwA5teex8k1+HzmHf7YjyhPr+I67EzEiIueJg2+0PYbM1p06S8kVTNDXsf +0eJx4Dr8qQAAA9iFPcpVhT3KVQAAAAdzc2gtcnNhAAABAQDFuhnNi6ao2hU5D+EoqEhkfE +2F/m2aeQtmvLyLpe6vgU8sOJHGiz/FVUPHTKdM87JBVVpe03FmcCZtHge40HNG82iSXBJd +rO3liBZ6IoIe0+koW3c8l4TZyfoUmnoXqoUKEbQ1I9tnElZbG/iehfRTc8sqAc0h6FgrYW +7QTqmWFJlrPMkRVZqnCj13toacCzNsEJ3lM1nmiCtef7dtIVx0JsB9Y7BiDnhr4/NNCXOC +3omaGUSOkV8+GGkFb3alBfGZDZzXuI8JsDwb74WJoTADm157HyTX4fOYd/tiPKE+v4jrsT +MSIi54mDb7Q9hszWnTpLyRVM0Nex/R4nHgOvypAAAAAwEAAQAAAQBtk0+/YDgQ9SKzx8AQ +xwmvXk+cBT76T0BpRAj9HwziiDe3GvZ2YC8MDc+NAEbq11ae7E0zpdv/WAGDkRPYcPShij +0Wdx3aef4wqLVEJCGWMfvRWLcAhjuiclM73cvxl5c42EzU8jUhrsDapuql9zhKky4w7mSe ++OL7z3gYyq8isvcQMe+1eXJqiv27AJJfAir+rLJZO/gDW36hOowhnZxYRlVYPgZ8GwetxD +VdCrgwUgR/2HYmbXYdVxI0PwswGc6rEqs5XXOYRzwvPTvRKdD3J5MxmsvJljT7FMr4kCLT +X1+aWysk1cgAUIdzzwQL8DLE/N9PFFYdZyNBkZMgedl9AAAAgCtP3F8XYFR18gQLPGLDyQ +FFg8+JHN9b/yIg2pymC6SI8qEp+GnuEK9IKhqh/Uw14KEKcs/9sgbZo0K9uTBTDG5F6Qmp +hADVbWXJ/97Xeya6kH2Sa56UKLCQ/uQWBKwLQ0auU/qwxATIZowh31XUXjzVBg6wgUjT7Q ++3Fk1zGYxnAAAAgQD5USIRUNwkI+htv+f1g8QdmrFAGymcGEkXAixKvBTon9cWQb2iyiK+ +2IO8EwFwRdL5kw2foILCnlp/4FevfxHU7wTcoFEp3PItUlcxYqO8vY2VCZ913oNLKBIt9p +uFfG2BZM5szMRNMh0svelu61FePsfN5Z8J0ltPrS8UKB95ywAAAIEAywbyNbjz1AxEjWIX +2Vbk4/MjQyjui8Wi7H0F+LDWyMfPJHzhnbr79Z/lIZmDAo++3EYU9J9s0C+wJ6vXGK+gvC +7e5qGfT/0J0DwBfLbpeTdDELCa/LmfLWVPzZ9Q+9Fq0AjmW9YXFZ/+qT9xfY1v9XfztFRS +xR1iXJ42q6ff5NsAAAAeYnJlZXpld2lzaEBCcmVlemV3aXNoTUJQLmxvY2FsAQIDBAU= +-----END OPENSSH PRIVATE KEY----- diff --git a/examples/manualTestEnv/_shared/vagrant_key.pub b/examples/manualTestEnv/_shared/vagrant_key.pub new file mode 100644 index 0000000000..e9962c03b1 --- /dev/null +++ b/examples/manualTestEnv/_shared/vagrant_key.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFuhnNi6ao2hU5D+EoqEhkfE2F/m2aeQtmvLyLpe6vgU8sOJHGiz/FVUPHTKdM87JBVVpe03FmcCZtHge40HNG82iSXBJdrO3liBZ6IoIe0+koW3c8l4TZyfoUmnoXqoUKEbQ1I9tnElZbG/iehfRTc8sqAc0h6FgrYW7QTqmWFJlrPMkRVZqnCj13toacCzNsEJ3lM1nmiCtef7dtIVx0JsB9Y7BiDnhr4/NNCXOC3omaGUSOkV8+GGkFb3alBfGZDZzXuI8JsDwb74WJoTADm157HyTX4fOYd/tiPKE+v4jrsTMSIi54mDb7Q9hszWnTpLyRVM0Nex/R4nHgOvyp diff --git a/examples/manualTestEnv/multiHost/README.md b/examples/manualTestEnv/multiHost/README.md new file mode 100644 index 0000000000..60b8058c4f --- /dev/null +++ b/examples/manualTestEnv/multiHost/README.md @@ -0,0 +1,36 @@ +# multiHost + +TiDB, PD, TiKV, TiFlash each in different hosts. + +## Usage + +1. Start the box: + + ```bash + vagrant up + ``` + +1. Use [TiUP](https://tiup.io/) to deploy the cluster to the box (only need to do it once): + + ```bash + tiup cluster deploy multiHost v4.0.4 topology.yaml -i ../_shared/vagrant_key -y --user vagrant + ``` + +1. Start the cluster in the box: + + ```bash + tiup cluster start multiHost + ``` + +1. Start TiDB Dashboard server: + + ```bash + bin/tidb-dashboard --pd http://10.0.1.11:2379 + ``` + +## Cleanup + +```bash +tiup cluster destroy multiHost -y +vagrant destroy --force +``` diff --git a/examples/manualTestEnv/multiHost/Vagrantfile b/examples/manualTestEnv/multiHost/Vagrantfile new file mode 100644 index 0000000000..9f4890fdd1 --- /dev/null +++ b/examples/manualTestEnv/multiHost/Vagrantfile @@ -0,0 +1,14 @@ +load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.ruby" + +Vagrant.configure("2") do |config| + config.vm.provider "virtualbox" do |v| + v.memory = 1024 + v.cpus = 1 + end + + (1..4).each do |i| + config.vm.define "node#{i}" do |node| + node.vm.network "private_network", ip: "10.0.1.#{i+10}" + end + end +end diff --git a/examples/manualTestEnv/multiHost/topology.yaml b/examples/manualTestEnv/multiHost/topology.yaml new file mode 100644 index 0000000000..f695125db3 --- /dev/null +++ b/examples/manualTestEnv/multiHost/topology.yaml @@ -0,0 +1,42 @@ +global: + user: tidb + deploy_dir: tidb-deploy + data_dir: tidb-data + +server_configs: + tikv: + server.grpc-concurrency: 1 + raftstore.apply-pool-size: 1 + raftstore.store-pool-size: 1 + readpool.unified.max-thread-count: 1 + readpool.storage.use-unified-pool: false + readpool.coprocessor.use-unified-pool: true + storage.block-cache.capacity: 256MB + raftstore.capacity: 10GB + pd: + replication.enable-placement-rules: true + +pd_servers: + - host: 10.0.1.11 + - host: 10.0.1.12 + - host: 10.0.1.13 + +tikv_servers: + - host: 10.0.1.12 + +tidb_servers: + - host: 10.0.1.11 + - host: 10.0.1.12 + - host: 10.0.1.13 + +tiflash_servers: + - host: 10.0.1.14 + +grafana_servers: + - host: 10.0.1.11 + +monitoring_servers: + - host: 10.0.1.11 + +alertmanager_servers: + - host: 10.0.1.11 diff --git a/examples/manualTestEnv/multiReplica/README.md b/examples/manualTestEnv/multiReplica/README.md new file mode 100644 index 0000000000..fc31ff5941 --- /dev/null +++ b/examples/manualTestEnv/multiReplica/README.md @@ -0,0 +1,36 @@ +# multiReplica + +Multiple TiKV nodes in different labels. + +## Usage + +1. Start the box: + + ```bash + vagrant up + ``` + +1. Use [TiUP](https://tiup.io/) to deploy the cluster to the box (only need to do it once): + + ```bash + tiup cluster deploy multiReplica v4.0.4 topology.yaml -i ../_shared/vagrant_key -y --user vagrant + ``` + +1. Start the cluster in the box: + + ```bash + tiup cluster start multiReplica + ``` + +1. Start TiDB Dashboard server: + + ```bash + bin/tidb-dashboard --pd http://10.0.1.20:2379 + ``` + +## Cleanup + +```bash +tiup cluster destroy multiReplica -y +vagrant destroy --force +``` diff --git a/examples/manualTestEnv/multiReplica/Vagrantfile b/examples/manualTestEnv/multiReplica/Vagrantfile new file mode 100644 index 0000000000..82098283c1 --- /dev/null +++ b/examples/manualTestEnv/multiReplica/Vagrantfile @@ -0,0 +1,10 @@ +load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.ruby" + +Vagrant.configure("2") do |config| + config.vm.provider "virtualbox" do |v| + v.memory = 4 * 1024 + v.cpus = 2 + end + + config.vm.network "private_network", ip: "10.0.1.20" +end diff --git a/examples/manualTestEnv/multiReplica/topology.yaml b/examples/manualTestEnv/multiReplica/topology.yaml new file mode 100644 index 0000000000..cad40a20ea --- /dev/null +++ b/examples/manualTestEnv/multiReplica/topology.yaml @@ -0,0 +1,64 @@ +global: + user: tidb + deploy_dir: tidb-deploy + data_dir: tidb-data + +server_configs: + tikv: + server.grpc-concurrency: 1 + raftstore.apply-pool-size: 1 + raftstore.store-pool-size: 1 + readpool.unified.max-thread-count: 1 + readpool.storage.use-unified-pool: false + readpool.coprocessor.use-unified-pool: true + storage.block-cache.capacity: 256MB + raftstore.capacity: 10GB + pd: + replication.location-labels: + - zone + - rack + - host + +pd_servers: + - host: 10.0.1.20 + +tikv_servers: + - host: 10.0.1.20 + port: 20160 + status_port: 20180 + config: + server.labels: { host: tikv1, rack: rack1 } + - host: 10.0.1.20 + port: 20161 + status_port: 20181 + config: + server.labels: { host: tikv1, rack: rack1 } + - host: 10.0.1.20 + port: 20162 + status_port: 20182 + config: + server.labels: { host: tikv2, rack: rack1 } + - host: 10.0.1.20 + port: 20163 + status_port: 20183 + config: + server.labels: { host: tikv2, rack: rack1 } + - host: 10.0.1.20 + port: 20164 + status_port: 20184 + config: + server.labels: { host: tikv3, rack: rack2 } + - host: 10.0.1.20 + port: 20165 + status_port: 20185 + config: + server.labels: { host: tikv3, rack: rack2 } + +tidb_servers: + - host: 10.0.1.20 + +grafana_servers: + - host: 10.0.1.20 + +monitoring_servers: + - host: 10.0.1.20 diff --git a/examples/manualTestEnv/singleHost/README.md b/examples/manualTestEnv/singleHost/README.md new file mode 100644 index 0000000000..4d3f7413ab --- /dev/null +++ b/examples/manualTestEnv/singleHost/README.md @@ -0,0 +1,36 @@ +# singleHost + +TiDB, PD, TiKV, TiFlash in the same host. + +## Usage + +1. Start the box: + + ```bash + vagrant up + ``` + +1. Use [TiUP](https://tiup.io/) to deploy the cluster to the box (only need to do it once): + + ```bash + tiup cluster deploy singleHost v4.0.4 topology.yaml -i ../_shared/vagrant_key -y --user vagrant + ``` + +1. Start the cluster in the box: + + ```bash + tiup cluster start singleHost + ``` + +1. Start TiDB Dashboard server: + + ```bash + bin/tidb-dashboard --pd http://10.0.1.2:2379 + ``` + +## Cleanup + +```bash +tiup cluster destroy singleHost -y +vagrant destroy --force +``` diff --git a/examples/manualTestEnv/singleHost/Vagrantfile b/examples/manualTestEnv/singleHost/Vagrantfile new file mode 100644 index 0000000000..77d49ffdea --- /dev/null +++ b/examples/manualTestEnv/singleHost/Vagrantfile @@ -0,0 +1,10 @@ +load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.ruby" + +Vagrant.configure("2") do |config| + config.vm.provider "virtualbox" do |v| + v.memory = 3 * 1024 + v.cpus = 2 + end + + config.vm.network "private_network", ip: "10.0.1.2" +end diff --git a/examples/manualTestEnv/singleHost/topology.yaml b/examples/manualTestEnv/singleHost/topology.yaml new file mode 100644 index 0000000000..bf79c98bff --- /dev/null +++ b/examples/manualTestEnv/singleHost/topology.yaml @@ -0,0 +1,37 @@ +global: + user: tidb + deploy_dir: tidb-deploy + data_dir: tidb-data + +server_configs: + tikv: + server.grpc-concurrency: 1 + raftstore.apply-pool-size: 1 + raftstore.store-pool-size: 1 + readpool.unified.max-thread-count: 1 + readpool.storage.use-unified-pool: false + readpool.coprocessor.use-unified-pool: true + storage.block-cache.capacity: 256MB + pd: + replication.enable-placement-rules: true + +pd_servers: + - host: 10.0.1.2 + +tikv_servers: + - host: 10.0.1.2 + +tidb_servers: + - host: 10.0.1.2 + +tiflash_servers: + - host: 10.0.1.2 + +grafana_servers: + - host: 10.0.1.2 + +monitoring_servers: + - host: 10.0.1.2 + +alertmanager_servers: + - host: 10.0.1.2 diff --git a/examples/manualTestEnv/singleHostMultiDisk/.gitignore b/examples/manualTestEnv/singleHostMultiDisk/.gitignore new file mode 100644 index 0000000000..8fce603003 --- /dev/null +++ b/examples/manualTestEnv/singleHostMultiDisk/.gitignore @@ -0,0 +1 @@ +data/ diff --git a/examples/manualTestEnv/singleHostMultiDisk/README.md b/examples/manualTestEnv/singleHostMultiDisk/README.md new file mode 100644 index 0000000000..4cb2dd419e --- /dev/null +++ b/examples/manualTestEnv/singleHostMultiDisk/README.md @@ -0,0 +1,36 @@ +# singleHostMultiDisk + +All instances in a single host, but on different disks. + +## Usage + +1. Start the box: + + ```bash + vagrant up + ``` + +1. Use [TiUP](https://tiup.io/) to deploy the cluster to the box (only need to do it once): + + ```bash + tiup cluster deploy singleHostMultiDisk v4.0.4 topology.yaml -i ../_shared/vagrant_key -y --user vagrant + ``` + +1. Start the cluster in the box: + + ```bash + tiup cluster start singleHostMultiDisk + ``` + +1. Start TiDB Dashboard server: + + ```bash + bin/tidb-dashboard --pd http://10.0.1.3:2379 + ``` + +## Cleanup + +```bash +tiup cluster destroy singleHostMultiDisk -y +vagrant destroy --force +``` diff --git a/examples/manualTestEnv/singleHostMultiDisk/Vagrantfile b/examples/manualTestEnv/singleHostMultiDisk/Vagrantfile new file mode 100644 index 0000000000..971db113cc --- /dev/null +++ b/examples/manualTestEnv/singleHostMultiDisk/Vagrantfile @@ -0,0 +1,10 @@ +load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.ruby" + +Vagrant.configure("2") do |config| + config.vm.provider "virtualbox" do |v| + v.memory = 3 * 1024 + v.cpus = 2 + end + + config.vm.network "private_network", ip: "10.0.1.3" +end diff --git a/examples/manualTestEnv/singleHostMultiDisk/topology.yaml b/examples/manualTestEnv/singleHostMultiDisk/topology.yaml new file mode 100644 index 0000000000..516de7cb5c --- /dev/null +++ b/examples/manualTestEnv/singleHostMultiDisk/topology.yaml @@ -0,0 +1,39 @@ +global: + user: vagrant + deploy_dir: tidb-deploy + data_dir: tidb-data + +server_configs: + tikv: + server.grpc-concurrency: 1 + raftstore.apply-pool-size: 1 + raftstore.store-pool-size: 1 + readpool.unified.max-thread-count: 1 + readpool.storage.use-unified-pool: false + readpool.coprocessor.use-unified-pool: true + storage.block-cache.capacity: 256MB + pd: + replication.enable-placement-rules: true + +pd_servers: + - host: 10.0.1.3 + +tikv_servers: + - host: 10.0.1.3 + +tidb_servers: + - host: 10.0.1.3 + deploy_dir: /vagrant/data/tidb + log_dir: /vagrant/data/tidb/log + +tiflash_servers: + - host: 10.0.1.3 + +grafana_servers: + - host: 10.0.1.3 + +monitoring_servers: + - host: 10.0.1.3 + +alertmanager_servers: + - host: 10.0.1.3 From e293bcc2a4ee60c6ac163ffbdce386d660060ca2 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 21 Aug 2020 14:31:32 +0800 Subject: [PATCH 003/126] update vagrant config --- .../_shared/Vagrantfile.partial.pubKey.rb | 23 +++++++++++++++++++ .../_shared/Vagrantfile.partial.pubKey.ruby | 12 ---------- examples/manualTestEnv/multiHost/Vagrantfile | 2 +- .../manualTestEnv/multiHost/topology.yaml | 4 ++-- .../manualTestEnv/multiReplica/Vagrantfile | 2 +- examples/manualTestEnv/singleHost/Vagrantfile | 2 +- .../singleHostMultiDisk/Vagrantfile | 2 +- pkg/cluster/task/step.go | 10 ++++---- 8 files changed, 35 insertions(+), 22 deletions(-) create mode 100644 examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.rb delete mode 100644 examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.ruby diff --git a/examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.rb b/examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.rb new file mode 100644 index 0000000000..3d04eaea50 --- /dev/null +++ b/examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.rb @@ -0,0 +1,23 @@ +Vagrant.configure("2") do |config| + ssh_pub_key = File.readlines("#{File.dirname(__FILE__)}/vagrant_key.pub").first.strip + + config.vm.box = "hashicorp/bionic64" + config.vm.provision "shell", privileged: false, inline: <<-SHELL + sudo apt install -y zsh + sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" + sudo chsh -s /usr/bin/zsh vagrant + echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys + SHELL + + config.vm.provision "shell", privileged: true, inline: <<-SHELL + echo "setting ulimit" + sudo echo "fs.file-max = 65535" >> /etc/sysctl.conf + sudo sysctl -p + sudo echo "* hard nofile 65535" >> /etc/security/limits.conf + sudo echo "* soft nofile 65535" >> /etc/security/limits.conf + sudo echo "root hard nofile 65535" >> /etc/security/limits.conf + sudo echo "root hard nofile 65535" >> /etc/security/limits.conf + SHELL +end + +# ulimit ref: https://my.oschina.net/u/914655/blog/3067520 diff --git a/examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.ruby b/examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.ruby deleted file mode 100644 index 3af2b17570..0000000000 --- a/examples/manualTestEnv/_shared/Vagrantfile.partial.pubKey.ruby +++ /dev/null @@ -1,12 +0,0 @@ -Vagrant.configure("2") do |config| - ssh_pub_key = File.readlines("#{File.dirname(__FILE__)}/vagrant_key.pub").first.strip - - config.vm.box = "hashicorp/bionic64" - config.vm.provision "shell", privileged: false, inline: <<-SHELL - sudo apt install -y zsh - sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" - sudo chsh -s /usr/bin/zsh vagrant - - echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys - SHELL -end diff --git a/examples/manualTestEnv/multiHost/Vagrantfile b/examples/manualTestEnv/multiHost/Vagrantfile index 9f4890fdd1..10db798e87 100644 --- a/examples/manualTestEnv/multiHost/Vagrantfile +++ b/examples/manualTestEnv/multiHost/Vagrantfile @@ -1,4 +1,4 @@ -load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.ruby" +load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb" Vagrant.configure("2") do |config| config.vm.provider "virtualbox" do |v| diff --git a/examples/manualTestEnv/multiHost/topology.yaml b/examples/manualTestEnv/multiHost/topology.yaml index f695125db3..937e4ddc29 100644 --- a/examples/manualTestEnv/multiHost/topology.yaml +++ b/examples/manualTestEnv/multiHost/topology.yaml @@ -29,8 +29,8 @@ tidb_servers: - host: 10.0.1.12 - host: 10.0.1.13 -tiflash_servers: - - host: 10.0.1.14 +# tiflash_servers: +# - host: 10.0.1.14 grafana_servers: - host: 10.0.1.11 diff --git a/examples/manualTestEnv/multiReplica/Vagrantfile b/examples/manualTestEnv/multiReplica/Vagrantfile index 82098283c1..00b3d0945d 100644 --- a/examples/manualTestEnv/multiReplica/Vagrantfile +++ b/examples/manualTestEnv/multiReplica/Vagrantfile @@ -1,4 +1,4 @@ -load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.ruby" +load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb" Vagrant.configure("2") do |config| config.vm.provider "virtualbox" do |v| diff --git a/examples/manualTestEnv/singleHost/Vagrantfile b/examples/manualTestEnv/singleHost/Vagrantfile index 77d49ffdea..6bfcc26d49 100644 --- a/examples/manualTestEnv/singleHost/Vagrantfile +++ b/examples/manualTestEnv/singleHost/Vagrantfile @@ -1,4 +1,4 @@ -load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.ruby" +load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb" Vagrant.configure("2") do |config| config.vm.provider "virtualbox" do |v| diff --git a/examples/manualTestEnv/singleHostMultiDisk/Vagrantfile b/examples/manualTestEnv/singleHostMultiDisk/Vagrantfile index 971db113cc..b3e910a81d 100644 --- a/examples/manualTestEnv/singleHostMultiDisk/Vagrantfile +++ b/examples/manualTestEnv/singleHostMultiDisk/Vagrantfile @@ -1,4 +1,4 @@ -load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.ruby" +load "#{File.dirname(__FILE__)}/../_shared/Vagrantfile.partial.pubKey.rb" Vagrant.configure("2") do |config| config.vm.provider "virtualbox" do |v| diff --git a/pkg/cluster/task/step.go b/pkg/cluster/task/step.go index 3c32673729..8474d6dd77 100644 --- a/pkg/cluster/task/step.go +++ b/pkg/cluster/task/step.go @@ -114,11 +114,12 @@ func (s *StepDisplay) String() string { } func (s *StepDisplay) handleTaskBegin(task Task) { - fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@", task) - if _, ok := s.children[task]; !ok { return } + + fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@", task) + s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, Suffix: strings.Split(task.String(), "\n")[0], @@ -126,11 +127,12 @@ func (s *StepDisplay) handleTaskBegin(task Task) { } func (s *StepDisplay) handleTaskProgress(task Task, p string) { - fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@", task, p) - if _, ok := s.children[task]; !ok { return } + + fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@", task, p) + s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, Suffix: strings.Split(p, "\n")[0], From 4bba02f61b6f72a3f111ed8783af3703481f9e01 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 21 Aug 2020 17:21:30 +0800 Subject: [PATCH 004/126] add comments --- examples/manualTestEnv/multiHost/Vagrantfile | 2 +- pkg/cluster/manager.go | 25 +++++++++++++------- pkg/cluster/task/step.go | 11 ++++++--- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/examples/manualTestEnv/multiHost/Vagrantfile b/examples/manualTestEnv/multiHost/Vagrantfile index 10db798e87..b23fbb55bd 100644 --- a/examples/manualTestEnv/multiHost/Vagrantfile +++ b/examples/manualTestEnv/multiHost/Vagrantfile @@ -6,7 +6,7 @@ Vagrant.configure("2") do |config| v.cpus = 1 end - (1..4).each do |i| + (1..3).each do |i| config.vm.define "node#{i}" do |node| node.vm.network "private_network", ip: "10.0.1.#{i+10}" end diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 66630188e2..b9e05bb789 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -1101,22 +1101,31 @@ func (m *Manager) Deploy( ParallelStep("+ Download TiDB components", downloadCompTasks...). ParallelStep("+ Initialize target host environments", envInitTasks...). ParallelStep("+ Copy files", deployCompTasks...) + // 并行任务里的小任务每一个都是 StepDisplay if afterDeploy != nil { afterDeploy(builder, topo) } + // 最终得到的是一个串行执行的大 Serial task + // 里面有 4 个大步骤: + // - Generate SSH keys + // - Download TiDB components + // - Initialize target host environments + // - Copy files + // 这 4 个步骤串行执行 + // 除了第一个大步骤 Generate SSH keys 是 Serial 外,其它三个是 Parallel Task,是说它内部的子 task 是并行执行的 t := builder.Build() ctx := task.NewContext() - ctx.Ev.Subscribe(task.EventTaskBegin, func(task task.Task) { - fmt.Println("external /////////////", task) - }) - ctx.Ev.Subscribe(task.EventTaskProgress, func(task task.Task, p string) { - fmt.Println("external /////////////", task, p) - }) - - if err := t.Execute(task.NewContext()); err != nil { + // ctx.Ev.Subscribe(task.EventTaskBegin, func(task task.Task) { + // fmt.Println("external ----------- begin:", task, "----") + // }) + // ctx.Ev.Subscribe(task.EventTaskProgress, func(task task.Task, p string) { + // fmt.Println("external ----------- progress:", task, "----", p, "----") + // }) + + if err := t.Execute(ctx); err != nil { if errorx.Cast(err) != nil { // FIXME: Map possible task errors and give suggestions. return err diff --git a/pkg/cluster/task/step.go b/pkg/cluster/task/step.go index 8474d6dd77..b42d338f18 100644 --- a/pkg/cluster/task/step.go +++ b/pkg/cluster/task/step.go @@ -14,7 +14,6 @@ package task import ( - "fmt" "strings" "github.com/pingcap/tiup/pkg/cliutil/progress" @@ -86,12 +85,16 @@ func (s *StepDisplay) Execute(ctx *Context) error { err := s.inner.Execute(ctx) ctx.Ev.Unsubscribe(EventTaskProgress, s.handleTaskProgress) ctx.Ev.Unsubscribe(EventTaskBegin, s.handleTaskBegin) + + // fmt.Println("=========== Step Finish ============") + if err != nil { s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, Mode: progress.ModeError, }) } else { + // fmt.Println("=========== Step Done ============") s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, Mode: progress.ModeDone, @@ -114,11 +117,13 @@ func (s *StepDisplay) String() string { } func (s *StepDisplay) handleTaskBegin(task Task) { + // 可能同时会收到其它 StepDisplay 发生的事件 + // 要判断这个 task 是否属于这个 StepDisplay if _, ok := s.children[task]; !ok { return } - fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@", task) + // fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@ begin:", task, "@@@@") s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, @@ -131,7 +136,7 @@ func (s *StepDisplay) handleTaskProgress(task Task, p string) { return } - fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@", task, p) + // fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@ progress:", task, "@@@@", p, "@@@@") s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, From 22909d67df735c3cc8c7f7774188faf2e6764ee0 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 09:46:23 +0800 Subject: [PATCH 005/126] calc progress --- pkg/cluster/manager.go | 17 ++++++++--------- pkg/cluster/task/step.go | 9 ++++++--- pkg/cluster/task/task.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index b9e05bb789..d46508bca3 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -1117,15 +1117,7 @@ func (m *Manager) Deploy( // 除了第一个大步骤 Generate SSH keys 是 Serial 外,其它三个是 Parallel Task,是说它内部的子 task 是并行执行的 t := builder.Build() - ctx := task.NewContext() - // ctx.Ev.Subscribe(task.EventTaskBegin, func(task task.Task) { - // fmt.Println("external ----------- begin:", task, "----") - // }) - // ctx.Ev.Subscribe(task.EventTaskProgress, func(task task.Task, p string) { - // fmt.Println("external ----------- progress:", task, "----", p, "----") - // }) - - if err := t.Execute(ctx); err != nil { + if err := t.Execute(task.NewContext()); err != nil { if errorx.Cast(err) != nil { // FIXME: Map possible task errors and give suggestions. return err @@ -1143,6 +1135,13 @@ func (m *Manager) Deploy( hint := color.New(color.Bold).Sprintf("%s start %s", cliutil.OsArgs0(), clusterName) log.Infof("Deployed cluster `%s` successfully, you can start the cluster via `%s`", clusterName, hint) + + // test + s := t.(*task.Serial) + status, progress := s.ComputeProgress() + fmt.Println("======== status ===========", status) + fmt.Println("======== progress ===========", progress) + return nil } diff --git a/pkg/cluster/task/step.go b/pkg/cluster/task/step.go index b42d338f18..c888dda36b 100644 --- a/pkg/cluster/task/step.go +++ b/pkg/cluster/task/step.go @@ -26,6 +26,9 @@ type StepDisplay struct { prefix string children map[Task]struct{} progressBar progress.Bar + + startedTask int + progress int // 0~100 } func addChildren(m map[Task]struct{}, task Task) { @@ -86,19 +89,17 @@ func (s *StepDisplay) Execute(ctx *Context) error { ctx.Ev.Unsubscribe(EventTaskProgress, s.handleTaskProgress) ctx.Ev.Unsubscribe(EventTaskBegin, s.handleTaskBegin) - // fmt.Println("=========== Step Finish ============") - if err != nil { s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, Mode: progress.ModeError, }) } else { - // fmt.Println("=========== Step Done ============") s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, Mode: progress.ModeDone, }) + s.progress = 100 } if singleBar, ok := s.progressBar.(*progress.SingleBar); ok { singleBar.StopRenderLoop() @@ -124,6 +125,8 @@ func (s *StepDisplay) handleTaskBegin(task Task) { } // fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@ begin:", task, "@@@@") + s.progress = s.startedTask * 100 / len(s.children) + s.startedTask++ s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, diff --git a/pkg/cluster/task/task.go b/pkg/cluster/task/task.go index d50f117978..36866638cb 100644 --- a/pkg/cluster/task/task.go +++ b/pkg/cluster/task/task.go @@ -216,6 +216,37 @@ func (s *Serial) String() string { return strings.Join(ss, "\n") } +// ComputeProgress compute whole progress +func (s *Serial) ComputeProgress() ([]string, int) { + stepsStatus := []string{} + allStepsCount := 0 + finishedSteps := 0 + + handleStepDisplay := func(sd *StepDisplay) { + allStepsCount++ + if sd.progress == 100 { + finishedSteps++ + } + stepsStatus = append(stepsStatus, fmt.Sprintf("%s ... %d%%", sd.prefix, sd.progress)) + } + + for _, step := range s.inner { + if sd, ok := step.(*StepDisplay); ok { + handleStepDisplay(sd) + } + if psd, ok := step.(*ParallelStepDisplay); ok { + stepsStatus = append(stepsStatus, psd.prefix) + for _, s := range psd.inner.inner { + if sd, ok := s.(*StepDisplay); ok { + handleStepDisplay(sd) + } + } + } + } + + return stepsStatus, finishedSteps * 100 / allStepsCount +} + // NewParallel create a Parallel task. func NewParallel(hideDetailDisplay bool, tasks ...Task) *Parallel { return &Parallel{ From 1d0af1fa1d4a99cf9ecd93bbe92a6f2d4a21e990 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 10:55:51 +0800 Subject: [PATCH 006/126] move web to tiup --- Makefile | 5 ++- components/web/main.go | 80 ++++++++++++++++++++++++++++++++++++++++++ go.mod | 2 ++ go.sum | 10 ++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 components/web/main.go diff --git a/Makefile b/Makefile index a609012065..3406b19d37 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ include ./tests/Makefile # Build TiUP and all components build: tiup components -components: playground client cluster dm bench server +components: playground client cluster dm bench web server tiup: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup @@ -58,6 +58,9 @@ doc: err: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-err ./components/err +web: + $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-web ./components/web + server: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-server ./server diff --git a/components/web/main.go b/components/web/main.go new file mode 100644 index 0000000000..ac900a2be1 --- /dev/null +++ b/components/web/main.go @@ -0,0 +1,80 @@ +package main + +import ( + "fmt" + "io/ioutil" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/pingcap/tiup/pkg/cluster" + "github.com/pingcap/tiup/pkg/cluster/spec" + cors "github.com/rs/cors/wrapper/gin" +) + +var tidbSpec *spec.SpecManager +var manager *cluster.Manager + +func main() { + if err := spec.Initialize("cluster"); err != nil { + panic("initialize spec failed") + } + tidbSpec = spec.GetSpecManager() + manager = cluster.NewManager("tidb", tidbSpec, spec.TiDBComponentVersion) + + router := gin.Default() + router.Use(cors.AllowAll()) + api := router.Group("/api") + { + api.POST("/deploy", deployHandler) + } + _ = router.Run() +} + +// DeployReq represents for the request of deploy API +type DeployReq struct { + ClusterName string `json:"cluster_name"` + TiDBVersion string `json:"tidb_version"` + TopoYaml string `json:"topo_yaml"` +} + +func deployHandler(c *gin.Context) { + fmt.Println("start to deploy") + + var req DeployReq + if err := c.ShouldBindJSON(&req); err != nil { + _ = c.Error(err) + return + } + + // create temp topo yaml file + tmpfile, err := ioutil.TempFile("", "topo") + if err != nil { + _ = c.Error(err) + return + } + defer tmpfile.Close() + _, _ = tmpfile.WriteString(req.TopoYaml) + topoFilePath := tmpfile.Name() + fmt.Println("topo file path:", topoFilePath) + + // parse request parameters + topoFilePath = "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/multiHost/topology.yaml" + identifyFile := "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/_shared/vagrant_key" + _ = manager.Deploy( + req.ClusterName, + req.TiDBVersion, + topoFilePath, + cluster.DeployOptions{ + User: "vagrant", + IdentityFile: identifyFile, + }, + nil, + true, + 120, + 5, + true, + ) + c.JSON(http.StatusOK, gin.H{ + "message": "success", + }) +} diff --git a/go.mod b/go.mod index 0ee87a5769..61045dd785 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect github.com/fatih/color v1.9.0 github.com/gibson042/canonicaljson-go v1.0.3 + github.com/gin-gonic/gin v1.5.0 github.com/gizak/termui/v3 v3.1.0 github.com/go-sql-driver/mysql v1.5.0 github.com/gogo/protobuf v1.3.1 @@ -51,6 +52,7 @@ require ( github.com/pingcap/tidb-insight v0.3.1 github.com/r3labs/diff v0.0.0-20200627101315-aecd9dd05dd2 github.com/relex/aini v1.1.3 + github.com/rs/cors v1.7.0 github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44 github.com/shirou/gopsutil v2.20.3+incompatible github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 diff --git a/go.sum b/go.sum index f0f7bb2ddd..7de49cd10b 100644 --- a/go.sum +++ b/go.sum @@ -244,9 +244,11 @@ github.com/gibson042/canonicaljson-go v1.0.3/go.mod h1:DsLpJTThXyGNO+KZlI85C1/KD github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gin-gonic/gin v1.5.0 h1:fi+bqFAx/oLK54somfCtEZs9HeH1LHVoEPUgARpTqyc= github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= @@ -281,9 +283,11 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/overalls v0.0.0-20180201144345-22ec1a223b7c/go.mod h1:UqxAgEOt89sCiXlrc/ycnx00LVvUO/eS8tMUkWX4R7w= github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -481,6 +485,7 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -703,6 +708,7 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -829,10 +835,12 @@ github.com/uber/jaeger-lib v2.0.0+incompatible h1:iMSCV0rmXEogjNWPh2D0xk9YVKvrtG github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/unrolled/render v0.0.0-20171102162132-65450fb6b2d3 h1:ZsIlNwu/G0zbChIZaWOeZ2TPGNmKMt46jZLXi3e8LFc= github.com/unrolled/render v0.0.0-20171102162132-65450fb6b2d3/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg= @@ -1162,9 +1170,11 @@ gopkg.in/fatih/color.v1 v1.7.0 h1:bYGjb+HezBM6j/QmgBfgm1adxHpzzrss6bj4r9ROppk= gopkg.in/fatih/color.v1 v1.7.0/go.mod h1:P7yosIhqIl/sX8J8UypY5M+dDpD2KmyfP5IRs5v/fo0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/go-playground/validator.v9 v9.31.0 h1:bmXmP2RSNtFES+bn4uYuHT7iJFJv7Vj+an+ZQdDaD1M= gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.55.0 h1:E8yzL5unfpW3M6fz/eB7Cb5MQAYSZ7GKo4Qth+N2sgQ= From e8698b0876325444e3dc8a6adde393052f8eed0d Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 11:07:45 +0800 Subject: [PATCH 007/126] run deploy in a routine --- components/web/main.go | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index ac900a2be1..24d0bf4bdf 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -60,20 +60,22 @@ func deployHandler(c *gin.Context) { // parse request parameters topoFilePath = "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/multiHost/topology.yaml" identifyFile := "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/_shared/vagrant_key" - _ = manager.Deploy( - req.ClusterName, - req.TiDBVersion, - topoFilePath, - cluster.DeployOptions{ - User: "vagrant", - IdentityFile: identifyFile, - }, - nil, - true, - 120, - 5, - true, - ) + go func() { + _ = manager.Deploy( + "multiHost", + "v4.0.4", + topoFilePath, + cluster.DeployOptions{ + User: "vagrant", + IdentityFile: identifyFile, + }, + nil, + true, + 120, + 5, + true, + ) + }() c.JSON(http.StatusOK, gin.H{ "message": "success", }) From e3325df3e96b585db3ceb5957db6deb81f0a5ae8 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 11:18:46 +0800 Subject: [PATCH 008/126] update Deploy parameter --- components/web/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/web/main.go b/components/web/main.go index 24d0bf4bdf..e60499fe81 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -73,7 +73,7 @@ func deployHandler(c *gin.Context) { true, 120, 5, - true, + false, ) }() c.JSON(http.StatusOK, gin.H{ From 3be76e2b604c5a040b1462904393d8bf8276fe00 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 11:29:50 +0800 Subject: [PATCH 009/126] move web ui --- web-ui/.gitignore | 23 + web-ui/README.md | 44 + web-ui/config-overrides.js | 10 + web-ui/package.json | 51 + web-ui/public/favicon.ico | Bin 0 -> 3150 bytes web-ui/public/index.html | 43 + web-ui/public/logo192.png | Bin 0 -> 5347 bytes web-ui/public/logo512.png | Bin 0 -> 9664 bytes web-ui/public/manifest.json | 25 + web-ui/public/robots.txt | 3 + web-ui/src/App.less | 1 + web-ui/src/App.tsx | 63 + web-ui/src/index.css | 13 + web-ui/src/index.tsx | 11 + .../src/pages/Deployment/DeploymentTable.tsx | 278 + web-ui/src/pages/Deployment/EditCompForm.tsx | 165 + web-ui/src/pages/Deployment/TopoPreview.tsx | 71 + web-ui/src/pages/Deployment/index.tsx | 237 + web-ui/src/pages/Machines/MachineForm.tsx | 298 + web-ui/src/pages/Machines/MachinesTable.tsx | 86 + web-ui/src/pages/Machines/index.tsx | 136 + web-ui/src/react-app-env.d.ts | 1 + web-ui/tsconfig.json | 25 + web-ui/yarn.lock | 11528 ++++++++++++++++ 24 files changed, 13112 insertions(+) create mode 100644 web-ui/.gitignore create mode 100644 web-ui/README.md create mode 100644 web-ui/config-overrides.js create mode 100644 web-ui/package.json create mode 100644 web-ui/public/favicon.ico create mode 100644 web-ui/public/index.html create mode 100644 web-ui/public/logo192.png create mode 100644 web-ui/public/logo512.png create mode 100644 web-ui/public/manifest.json create mode 100644 web-ui/public/robots.txt create mode 100644 web-ui/src/App.less create mode 100644 web-ui/src/App.tsx create mode 100644 web-ui/src/index.css create mode 100644 web-ui/src/index.tsx create mode 100644 web-ui/src/pages/Deployment/DeploymentTable.tsx create mode 100644 web-ui/src/pages/Deployment/EditCompForm.tsx create mode 100644 web-ui/src/pages/Deployment/TopoPreview.tsx create mode 100644 web-ui/src/pages/Deployment/index.tsx create mode 100644 web-ui/src/pages/Machines/MachineForm.tsx create mode 100644 web-ui/src/pages/Machines/MachinesTable.tsx create mode 100644 web-ui/src/pages/Machines/index.tsx create mode 100644 web-ui/src/react-app-env.d.ts create mode 100644 web-ui/tsconfig.json create mode 100644 web-ui/yarn.lock diff --git a/web-ui/.gitignore b/web-ui/.gitignore new file mode 100644 index 0000000000..4d29575de8 --- /dev/null +++ b/web-ui/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/web-ui/README.md b/web-ui/README.md new file mode 100644 index 0000000000..64e343e184 --- /dev/null +++ b/web-ui/README.md @@ -0,0 +1,44 @@ +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `yarn start` + +Runs the app in the development mode.
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.
+You will also see any lint errors in the console. + +### `yarn test` + +Launches the test runner in the interactive watch mode.
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `yarn build` + +Builds the app for production to the `build` folder.
+It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.
+Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `yarn eject` + +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** + +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. + +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/web-ui/config-overrides.js b/web-ui/config-overrides.js new file mode 100644 index 0000000000..2f16e3ea15 --- /dev/null +++ b/web-ui/config-overrides.js @@ -0,0 +1,10 @@ +const { override, addLessLoader } = require('customize-cra') + +module.exports = override( + addLessLoader({ + lessOptions: { + javascriptEnabled: true, + modifyVars: { '@primary-color': '#3351ff' }, + } + }) +) diff --git a/web-ui/package.json b/web-ui/package.json new file mode 100644 index 0000000000..2f3c22d600 --- /dev/null +++ b/web-ui/package.json @@ -0,0 +1,51 @@ +{ + "name": "tiup-ui", + "version": "0.1.0", + "private": true, + "dependencies": { + "@ant-design/icons": "^4.2.2", + "@testing-library/jest-dom": "^4.2.4", + "@testing-library/react": "^9.3.2", + "@testing-library/user-event": "^7.1.2", + "@types/jest": "^24.0.0", + "@types/node": "^12.0.0", + "@types/react": "^16.9.0", + "@types/react-dom": "^16.9.0", + "@types/uniqid": "^5.2.0", + "ahooks": "^2.5.0", + "antd": "^4.5.3", + "history": "^5.0.0", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "react-router-dom": "^6.0.0-beta.0", + "react-scripts": "3.4.2", + "typescript": "~3.7.2", + "uniqid": "^5.2.0", + "yaml": "^1.10.0" + }, + "scripts": { + "start": "react-app-rewired start", + "build": "react-app-rewired build", + "test": "react-app-rewired test" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "customize-cra": "^1.0.0", + "less-loader": "^6.2.0", + "react-app-rewired": "^2.1.6" + } +} diff --git a/web-ui/public/favicon.ico b/web-ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bcd5dfd67cd0361b78123e95c2dd96031f27f743 GIT binary patch literal 3150 zcmaKtc{Ei0AIGn;MZ^<@lHD*OV;K7~W1q3jSjJcqNywTkMOhP*k~Oj?GO|6{m(*C2 zC7JA+hN%%Bp7T4;J@?%2_x=5zbI<2~->=X60stMr0B~{wzpi9D0MG|# zyuANt7z6;uz%?PEfAnimLl^)6h5ARwGXemG2>?hqQv-I^Gpyh$JH}Ag92}3{$a#z& zd`il2Sb#$U&e&4#^4R|GTgk!Qs+x*PCL{2+`uB5mqtnqLaaw`*H2oqJ?XF(zUACc2 zSibBrdQzcidqv*TK}rpEv1ie&;Famq2IK5%4c}1Jt2b1x_{y1C!?EU)@`_F)yN*NK z)(u03@%g%uDawwXGAMm%EnP9FgoucUedioDwL~{6RVO@A-Q$+pwVRR%WYR>{K3E&Q zzqzT!EEZ$_NHGYM6&PK#CGUV$pTWsiI5#~m>htoJ!vbc0=gm3H8sz8KzIiVN5xdCT z%;}`UH2Pc8))1VS-unh?v4*H*NIy5On{MRKw7BTmOO9oE2UApwkCl9Z?^dod9M^#w z51tEZhf+#dpTo#GDDy#kuzoIjMjZ?%v*h$ z*vwUMOjGc?R0(FjLWkMD)kca4z6~H45FIzQ!Zzu&-yWyMdCBsDr2`l}Q{8fH$H@O< z$&snNzbqLk?(GIe?!PVh?F~2qk4z^rMcp$P^hw^rUPjyCyoNTRw%;hNOwrCoN?G0E z!wT^=4Loa9@O{t;Wk(Nj=?ms1Z?UN_;21m%sUm?uib=pg&x|u)8pP#l--$;B9l47n zUUnMV0sXLe*@Gvy>XWjRoqc2tOzgYn%?g@Lb8C&WsxV1Kjssh^ZBs*Ysr+E6%tsC_ zCo-)hkYY=Bn?wMB4sqm?WS>{kh<6*DO)vXnQpQ9`-_qF6!#b;3Nf@;#B>e2j$yokl6F|9p1<($2 z=WSr%)Z?^|r6njhgbuMrIN>8JE05u0x5t@_dEfbGn9r0hK4c2vp>(*$GXsjeLL_uz zWpyfUgdv!~-2N;llVzik#s2*XB*%7u8(^sJv&T3pzaR&<9({17Zs~UY>#ugZZkHBs zD+>0_an$?}utGp$dcXtyFHnTQZJ}SF=oZ}X07dz~K>^o(vjTzw8ZQc!Fw1W=&Z?9% zv63|~l}70sJbY?H8ON8j)w5=6OpXuaZ}YT03`2%u8{;B0Vafo_iY7&BiQTbRkdJBYL}?%ATfmc zLG$uXt$@3j#OIjALdT&Ut$=9F8cgV{w_f5eS)PjoVi z&oemp-SKJ~UuGuCP1|iY?J^S&P z)-IG?O-*=z6kfZrX5H*G=aQ{ZaqnOqP@&+_;nq@mA>EcjgxrYX8EK|Iq4&E&rxR?R z8N$QOdRwY zr{P`O)=87>YLHtFfGXW z6P)ucrhj~It_9w<^v5>T6N1U}+BkS))=WX*2JY=}^b2czGhH<`?`(}}qMcpPx_%>M zM|fs(+I1m&_h(zqp-HgP>re$2O^o$q)xu#fl0ivOJE({duU)a*OD(eYgSi^cdTn}pqcPM(;S)2%1By^Wh%-CaC%>d9hi`7J zaxL7@;nhA>PE%s99&;z{8>VFgf{u!(-B-x7Of6ueme+ScryL`h(^qKE)DtieWY>-7 zgB)VJESQS4*1LU(2&@pgLvSt{(((C?K_V(rQk``i&5}ZPG;G^FiPlZ$7|-vEmMWlU z5lQ%iK2nu=h2wd_7>gK@vX=*AG+u~rQP$NwPC`ZA?4nh{3tui1x@bT6-;Rk3yDQ>d z?3qRD#+PeV7#FAa>s`Xwxsx_oRFcN$StW2=CW`=qObsT?SD^#^jM1Yk}PSPxJ zG@-_mnNU_)vM|iLRSI>UMp|hatyS}17R{10IuL0TLlupt>9dRs_SPQbv7BLYyC#qv16E-y@XZ= z-!p7I%#r-BVi$nQq3&ssRc_IC%R6$tA&^s_l46880~Wst3@>(|EO<}T4~ci~#!=e; zD)B>o%1+$ksURD1p7I-<3ehlFyVkqrySf&gg>Bp0Z9?JaG|gyTZ{Cb8SdvAWVmFX7v2ohs!OCc!Udk zUITUpmZ33rKLI#(&lDj}cKA#dpL4Fil=$5pu_wi1XJR!llw` zSItPBDEdMHk2>c7#%lBxZHHvtVUOZ$}v?=?AT~9!Jcqa@IJGuMg(s^7r>pcTrd)pS`{5Cu8WPey` z9)!!OUUY@L%9Q+bZa*S5`3f_|lFCPN6kdp_M2>{le8;cn^XUsPa+TUk47qd6)IBR% zk*&Ip?!Ge_gmmdj)BX}P_5o@VI2*wbZ^>UhFju}0gQZh!pP%4XT9{@w;G#b3XK8sN zF(7i$Jv(IM$8Akys9dhP^^~H2(7BfJp}yDW1#@!CL-!mGcSCnJ599WK9MV@yo_u$v MDeX2GIKR{Qf5okjU;qFB literal 0 HcmV?d00001 diff --git a/web-ui/public/index.html b/web-ui/public/index.html new file mode 100644 index 0000000000..aa069f27cb --- /dev/null +++ b/web-ui/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/web-ui/public/logo192.png b/web-ui/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 zcmZWtbyO6NvR-oO24RV%BvuJ&=?+<7=`LvyB&A_#M7mSDYw1v6DJkiYl9XjT!%$dLEBTQ8R9|wd3008in6lFF3GV-6mLi?MoP_y~}QUnaDCHI#t z7w^m$@6DI)|C8_jrT?q=f8D?0AM?L)Z}xAo^e^W>t$*Y0KlT5=@bBjT9kxb%-KNdk zeOS1tKO#ChhG7%{ApNBzE2ZVNcxbrin#E1TiAw#BlUhXllzhN$qWez5l;h+t^q#Eav8PhR2|T}y5kkflaK`ba-eoE+Z2q@o6P$)=&` z+(8}+-McnNO>e#$Rr{32ngsZIAX>GH??tqgwUuUz6kjns|LjsB37zUEWd|(&O!)DY zQLrq%Y>)Y8G`yYbYCx&aVHi@-vZ3|ebG!f$sTQqMgi0hWRJ^Wc+Ibv!udh_r%2|U) zPi|E^PK?UE!>_4`f`1k4hqqj_$+d!EB_#IYt;f9)fBOumGNyglU(ofY`yHq4Y?B%- zp&G!MRY<~ajTgIHErMe(Z8JG*;D-PJhd@RX@QatggM7+G(Lz8eZ;73)72Hfx5KDOE zkT(m}i2;@X2AT5fW?qVp?@WgN$aT+f_6eo?IsLh;jscNRp|8H}Z9p_UBO^SJXpZew zEK8fz|0Th%(Wr|KZBGTM4yxkA5CFdAj8=QSrT$fKW#tweUFqr0TZ9D~a5lF{)%-tTGMK^2tz(y2v$i%V8XAxIywrZCp=)83p(zIk6@S5AWl|Oa2hF`~~^W zI;KeOSkw1O#TiQ8;U7OPXjZM|KrnN}9arP)m0v$c|L)lF`j_rpG(zW1Qjv$=^|p*f z>)Na{D&>n`jOWMwB^TM}slgTEcjxTlUby89j1)|6ydRfWERn3|7Zd2&e7?!K&5G$x z`5U3uFtn4~SZq|LjFVrz$3iln-+ucY4q$BC{CSm7Xe5c1J<=%Oagztj{ifpaZk_bQ z9Sb-LaQMKp-qJA*bP6DzgE3`}*i1o3GKmo2pn@dj0;He}F=BgINo};6gQF8!n0ULZ zL>kC0nPSFzlcB7p41doao2F7%6IUTi_+!L`MM4o*#Y#0v~WiO8uSeAUNp=vA2KaR&=jNR2iVwG>7t%sG2x_~yXzY)7K& zk3p+O0AFZ1eu^T3s};B%6TpJ6h-Y%B^*zT&SN7C=N;g|#dGIVMSOru3iv^SvO>h4M=t-N1GSLLDqVTcgurco6)3&XpU!FP6Hlrmj}f$ zp95;b)>M~`kxuZF3r~a!rMf4|&1=uMG$;h^g=Kl;H&Np-(pFT9FF@++MMEx3RBsK?AU0fPk-#mdR)Wdkj)`>ZMl#^<80kM87VvsI3r_c@_vX=fdQ`_9-d(xiI z4K;1y1TiPj_RPh*SpDI7U~^QQ?%0&!$Sh#?x_@;ag)P}ZkAik{_WPB4rHyW#%>|Gs zdbhyt=qQPA7`?h2_8T;-E6HI#im9K>au*(j4;kzwMSLgo6u*}-K`$_Gzgu&XE)udQ zmQ72^eZd|vzI)~!20JV-v-T|<4@7ruqrj|o4=JJPlybwMg;M$Ud7>h6g()CT@wXm` zbq=A(t;RJ^{Xxi*Ff~!|3!-l_PS{AyNAU~t{h;(N(PXMEf^R(B+ZVX3 z8y0;0A8hJYp@g+c*`>eTA|3Tgv9U8#BDTO9@a@gVMDxr(fVaEqL1tl?md{v^j8aUv zm&%PX4^|rX|?E4^CkplWWNv*OKM>DxPa z!RJ)U^0-WJMi)Ksc!^ixOtw^egoAZZ2Cg;X7(5xZG7yL_;UJ#yp*ZD-;I^Z9qkP`} zwCTs0*%rIVF1sgLervtnUo&brwz?6?PXRuOCS*JI-WL6GKy7-~yi0giTEMmDs_-UX zo=+nFrW_EfTg>oY72_4Z0*uG>MnXP=c0VpT&*|rvv1iStW;*^={rP1y?Hv+6R6bxFMkxpWkJ>m7Ba{>zc_q zEefC3jsXdyS5??Mz7IET$Kft|EMNJIv7Ny8ZOcKnzf`K5Cd)&`-fTY#W&jnV0l2vt z?Gqhic}l}mCv1yUEy$%DP}4AN;36$=7aNI^*AzV(eYGeJ(Px-j<^gSDp5dBAv2#?; zcMXv#aj>%;MiG^q^$0MSg-(uTl!xm49dH!{X0){Ew7ThWV~Gtj7h%ZD zVN-R-^7Cf0VH!8O)uUHPL2mO2tmE*cecwQv_5CzWeh)ykX8r5Hi`ehYo)d{Jnh&3p z9ndXT$OW51#H5cFKa76c<%nNkP~FU93b5h-|Cb}ScHs@4Q#|}byWg;KDMJ#|l zE=MKD*F@HDBcX@~QJH%56eh~jfPO-uKm}~t7VkHxHT;)4sd+?Wc4* z>CyR*{w@4(gnYRdFq=^(#-ytb^5ESD?x<0Skhb%Pt?npNW1m+Nv`tr9+qN<3H1f<% zZvNEqyK5FgPsQ`QIu9P0x_}wJR~^CotL|n zk?dn;tLRw9jJTur4uWoX6iMm914f0AJfB@C74a;_qRrAP4E7l890P&{v<}>_&GLrW z)klculcg`?zJO~4;BBAa=POU%aN|pmZJn2{hA!d!*lwO%YSIzv8bTJ}=nhC^n}g(ld^rn#kq9Z3)z`k9lvV>y#!F4e{5c$tnr9M{V)0m(Z< z#88vX6-AW7T2UUwW`g<;8I$Jb!R%z@rCcGT)-2k7&x9kZZT66}Ztid~6t0jKb&9mm zpa}LCb`bz`{MzpZR#E*QuBiZXI#<`5qxx=&LMr-UUf~@dRk}YI2hbMsAMWOmDzYtm zjof16D=mc`^B$+_bCG$$@R0t;e?~UkF?7<(vkb70*EQB1rfUWXh$j)R2)+dNAH5%R zEBs^?N;UMdy}V};59Gu#0$q53$}|+q7CIGg_w_WlvE}AdqoS<7DY1LWS9?TrfmcvT zaypmplwn=P4;a8-%l^e?f`OpGb}%(_mFsL&GywhyN(-VROj`4~V~9bGv%UhcA|YW% zs{;nh@aDX11y^HOFXB$a7#Sr3cEtNd4eLm@Y#fc&j)TGvbbMwze zXtekX_wJqxe4NhuW$r}cNy|L{V=t#$%SuWEW)YZTH|!iT79k#?632OFse{+BT_gau zJwQcbH{b}dzKO?^dV&3nTILYlGw{27UJ72ZN){BILd_HV_s$WfI2DC<9LIHFmtyw? zQ;?MuK7g%Ym+4e^W#5}WDLpko%jPOC=aN)3!=8)s#Rnercak&b3ESRX3z{xfKBF8L z5%CGkFmGO@x?_mPGlpEej!3!AMddChabyf~nJNZxx!D&{@xEb!TDyvqSj%Y5@A{}9 zRzoBn0?x}=krh{ok3Nn%e)#~uh;6jpezhA)ySb^b#E>73e*frBFu6IZ^D7Ii&rsiU z%jzygxT-n*joJpY4o&8UXr2s%j^Q{?e-voloX`4DQyEK+DmrZh8A$)iWL#NO9+Y@!sO2f@rI!@jN@>HOA< z?q2l{^%mY*PNx2FoX+A7X3N}(RV$B`g&N=e0uvAvEN1W^{*W?zT1i#fxuw10%~))J zjx#gxoVlXREWZf4hRkgdHx5V_S*;p-y%JtGgQ4}lnA~MBz-AFdxUxU1RIT$`sal|X zPB6sEVRjGbXIP0U+?rT|y5+ev&OMX*5C$n2SBPZr`jqzrmpVrNciR0e*Wm?fK6DY& zl(XQZ60yWXV-|Ps!A{EF;=_z(YAF=T(-MkJXUoX zI{UMQDAV2}Ya?EisdEW;@pE6dt;j0fg5oT2dxCi{wqWJ<)|SR6fxX~5CzblPGr8cb zUBVJ2CQd~3L?7yfTpLNbt)He1D>*KXI^GK%<`bq^cUq$Q@uJifG>p3LU(!H=C)aEL zenk7pVg}0{dKU}&l)Y2Y2eFMdS(JS0}oZUuVaf2+K*YFNGHB`^YGcIpnBlMhO7d4@vV zv(@N}(k#REdul8~fP+^F@ky*wt@~&|(&&meNO>rKDEnB{ykAZ}k>e@lad7to>Ao$B zz<1(L=#J*u4_LB=8w+*{KFK^u00NAmeNN7pr+Pf+N*Zl^dO{LM-hMHyP6N!~`24jd zXYP|Ze;dRXKdF2iJG$U{k=S86l@pytLx}$JFFs8e)*Vi?aVBtGJ3JZUj!~c{(rw5>vuRF$`^p!P8w1B=O!skwkO5yd4_XuG^QVF z`-r5K7(IPSiKQ2|U9+`@Js!g6sfJwAHVd|s?|mnC*q zp|B|z)(8+mxXyxQ{8Pg3F4|tdpgZZSoU4P&9I8)nHo1@)9_9u&NcT^FI)6|hsAZFk zZ+arl&@*>RXBf-OZxhZerOr&dN5LW9@gV=oGFbK*J+m#R-|e6(Loz(;g@T^*oO)0R zN`N=X46b{7yk5FZGr#5&n1!-@j@g02g|X>MOpF3#IjZ_4wg{dX+G9eqS+Es9@6nC7 zD9$NuVJI}6ZlwtUm5cCAiYv0(Yi{%eH+}t)!E^>^KxB5^L~a`4%1~5q6h>d;paC9c zTj0wTCKrhWf+F#5>EgX`sl%POl?oyCq0(w0xoL?L%)|Q7d|Hl92rUYAU#lc**I&^6p=4lNQPa0 znQ|A~i0ip@`B=FW-Q;zh?-wF;Wl5!+q3GXDu-x&}$gUO)NoO7^$BeEIrd~1Dh{Tr` z8s<(Bn@gZ(mkIGnmYh_ehXnq78QL$pNDi)|QcT*|GtS%nz1uKE+E{7jdEBp%h0}%r zD2|KmYGiPa4;md-t_m5YDz#c*oV_FqXd85d@eub?9N61QuYcb3CnVWpM(D-^|CmkL z(F}L&N7qhL2PCq)fRh}XO@U`Yn<?TNGR4L(mF7#4u29{i~@k;pLsgl({YW5`Mo+p=zZn3L*4{JU;++dG9 X@eDJUQo;Ye2mwlRs?y0|+_a0zY+Zo%Dkae}+MySoIppb75o?vUW_?)>@g{U2`ERQIXV zeY$JrWnMZ$QC<=ii4X|@0H8`si75jB(ElJb00HAB%>SlLR{!zO|C9P3zxw_U8?1d8uRZ=({Ga4shyN}3 zAK}WA(ds|``G4jA)9}Bt2Hy0+f3rV1E6b|@?hpGA=PI&r8)ah|)I2s(P5Ic*Ndhn^ z*T&j@gbCTv7+8rpYbR^Ty}1AY)YH;p!m948r#%7x^Z@_-w{pDl|1S4`EM3n_PaXvK z1JF)E3qy$qTj5Xs{jU9k=y%SQ0>8E$;x?p9ayU0bZZeo{5Z@&FKX>}s!0+^>C^D#z z>xsCPvxD3Z=dP}TTOSJhNTPyVt14VCQ9MQFN`rn!c&_p?&4<5_PGm4a;WS&1(!qKE z_H$;dDdiPQ!F_gsN`2>`X}$I=B;={R8%L~`>RyKcS$72ai$!2>d(YkciA^J0@X%G4 z4cu!%Ps~2JuJ8ex`&;Fa0NQOq_nDZ&X;^A=oc1&f#3P1(!5il>6?uK4QpEG8z0Rhu zvBJ+A9RV?z%v?!$=(vcH?*;vRs*+PPbOQ3cdPr5=tOcLqmfx@#hOqX0iN)wTTO21jH<>jpmwRIAGw7`a|sl?9y9zRBh>(_%| zF?h|P7}~RKj?HR+q|4U`CjRmV-$mLW>MScKnNXiv{vD3&2@*u)-6P@h0A`eeZ7}71 zK(w%@R<4lLt`O7fs1E)$5iGb~fPfJ?WxhY7c3Q>T-w#wT&zW522pH-B%r5v#5y^CF zcC30Se|`D2mY$hAlIULL%-PNXgbbpRHgn<&X3N9W!@BUk@9g*P5mz-YnZBb*-$zMM z7Qq}ic0mR8n{^L|=+diODdV}Q!gwr?y+2m=3HWwMq4z)DqYVg0J~^}-%7rMR@S1;9 z7GFj6K}i32X;3*$SmzB&HW{PJ55kT+EI#SsZf}bD7nW^Haf}_gXciYKX{QBxIPSx2Ma? zHQqgzZq!_{&zg{yxqv3xq8YV+`S}F6A>Gtl39_m;K4dA{pP$BW0oIXJ>jEQ!2V3A2 zdpoTxG&V=(?^q?ZTj2ZUpDUdMb)T?E$}CI>r@}PFPWD9@*%V6;4Ag>D#h>!s)=$0R zRXvdkZ%|c}ubej`jl?cS$onl9Tw52rBKT)kgyw~Xy%z62Lr%V6Y=f?2)J|bZJ5(Wx zmji`O;_B+*X@qe-#~`HFP<{8$w@z4@&`q^Q-Zk8JG3>WalhnW1cvnoVw>*R@c&|o8 zZ%w!{Z+MHeZ*OE4v*otkZqz11*s!#s^Gq>+o`8Z5 z^i-qzJLJh9!W-;SmFkR8HEZJWiXk$40i6)7 zZpr=k2lp}SasbM*Nbn3j$sn0;rUI;%EDbi7T1ZI4qL6PNNM2Y%6{LMIKW+FY_yF3) zSKQ2QSujzNMSL2r&bYs`|i2Dnn z=>}c0>a}>|uT!IiMOA~pVT~R@bGlm}Edf}Kq0?*Af6#mW9f9!}RjW7om0c9Qlp;yK z)=XQs(|6GCadQbWIhYF=rf{Y)sj%^Id-ARO0=O^Ad;Ph+ z0?$eE1xhH?{T$QI>0JP75`r)U_$#%K1^BQ8z#uciKf(C701&RyLQWBUp*Q7eyn76} z6JHpC9}R$J#(R0cDCkXoFSp;j6{x{b&0yE@P7{;pCEpKjS(+1RQy38`=&Yxo%F=3y zCPeefABp34U-s?WmU#JJw23dcC{sPPFc2#J$ZgEN%zod}J~8dLm*fx9f6SpO zn^Ww3bt9-r0XaT2a@Wpw;C23XM}7_14#%QpubrIw5aZtP+CqIFmsG4`Cm6rfxl9n5 z7=r2C-+lM2AB9X0T_`?EW&Byv&K?HS4QLoylJ|OAF z`8atBNTzJ&AQ!>sOo$?^0xj~D(;kS$`9zbEGd>f6r`NC3X`tX)sWgWUUOQ7w=$TO&*j;=u%25ay-%>3@81tGe^_z*C7pb9y*Ed^H3t$BIKH2o+olp#$q;)_ zfpjCb_^VFg5fU~K)nf*d*r@BCC>UZ!0&b?AGk_jTPXaSnCuW110wjHPPe^9R^;jo3 zwvzTl)C`Zl5}O2}3lec=hZ*$JnkW#7enKKc)(pM${_$9Hc=Sr_A9Biwe*Y=T?~1CK z6eZ9uPICjy-sMGbZl$yQmpB&`ouS8v{58__t0$JP%i3R&%QR3ianbZqDs<2#5FdN@n5bCn^ZtH992~5k(eA|8|@G9u`wdn7bnpg|@{m z^d6Y`*$Zf2Xr&|g%sai#5}Syvv(>Jnx&EM7-|Jr7!M~zdAyjt*xl;OLhvW-a%H1m0 z*x5*nb=R5u><7lyVpNAR?q@1U59 zO+)QWwL8t zyip?u_nI+K$uh{y)~}qj?(w0&=SE^8`_WMM zTybjG=999h38Yes7}-4*LJ7H)UE8{mE(6;8voE+TYY%33A>S6`G_95^5QHNTo_;Ao ztIQIZ_}49%{8|=O;isBZ?=7kfdF8_@azfoTd+hEJKWE!)$)N%HIe2cplaK`ry#=pV z0q{9w-`i0h@!R8K3GC{ivt{70IWG`EP|(1g7i_Q<>aEAT{5(yD z=!O?kq61VegV+st@XCw475j6vS)_z@efuqQgHQR1T4;|-#OLZNQJPV4k$AX1Uk8Lm z{N*b*ia=I+MB}kWpupJ~>!C@xEN#Wa7V+7{m4j8c?)ChV=D?o~sjT?0C_AQ7B-vxqX30s0I_`2$in86#`mAsT-w?j{&AL@B3$;P z31G4(lV|b}uSDCIrjk+M1R!X7s4Aabn<)zpgT}#gE|mIvV38^ODy@<&yflpCwS#fRf9ZX3lPV_?8@C5)A;T zqmouFLFk;qIs4rA=hh=GL~sCFsXHsqO6_y~*AFt939UYVBSx1s(=Kb&5;j7cSowdE;7()CC2|-i9Zz+_BIw8#ll~-tyH?F3{%`QCsYa*b#s*9iCc`1P1oC26?`g<9))EJ3%xz+O!B3 zZ7$j~To)C@PquR>a1+Dh>-a%IvH_Y7^ys|4o?E%3`I&ADXfC8++hAdZfzIT#%C+Jz z1lU~K_vAm0m8Qk}K$F>|>RPK%<1SI0(G+8q~H zAsjezyP+u!Se4q3GW)`h`NPSRlMoBjCzNPesWJwVTY!o@G8=(6I%4XHGaSiS3MEBK zhgGFv6Jc>L$4jVE!I?TQuwvz_%CyO!bLh94nqK11C2W$*aa2ueGopG8DnBICVUORP zgytv#)49fVXDaR$SukloYC3u7#5H)}1K21=?DKj^U)8G;MS)&Op)g^zR2($<>C*zW z;X7`hLxiIO#J`ANdyAOJle4V%ppa*(+0i3w;8i*BA_;u8gOO6)MY`ueq7stBMJTB; z-a0R>hT*}>z|Gg}@^zDL1MrH+2hsR8 zHc}*9IvuQC^Ju)^#Y{fOr(96rQNPNhxc;mH@W*m206>Lo<*SaaH?~8zg&f&%YiOEG zGiz?*CP>Bci}!WiS=zj#K5I}>DtpregpP_tfZtPa(N<%vo^#WCQ5BTv0vr%Z{)0q+ z)RbfHktUm|lg&U3YM%lMUM(fu}i#kjX9h>GYctkx9Mt_8{@s%!K_EI zScgwy6%_fR?CGJQtmgNAj^h9B#zmaMDWgH55pGuY1Gv7D z;8Psm(vEPiwn#MgJYu4Ty9D|h!?Rj0ddE|&L3S{IP%H4^N!m`60ZwZw^;eg4sk6K{ ziA^`Sbl_4~f&Oo%n;8Ye(tiAdlZKI!Z=|j$5hS|D$bDJ}p{gh$KN&JZYLUjv4h{NY zBJ>X9z!xfDGY z+oh_Z&_e#Q(-}>ssZfm=j$D&4W4FNy&-kAO1~#3Im;F)Nwe{(*75(p=P^VI?X0GFakfh+X-px4a%Uw@fSbmp9hM1_~R>?Z8+ ziy|e9>8V*`OP}4x5JjdWp}7eX;lVxp5qS}0YZek;SNmm7tEeSF*-dI)6U-A%m6YvCgM(}_=k#a6o^%-K4{`B1+}O4x zztDT%hVb;v#?j`lTvlFQ3aV#zkX=7;YFLS$uIzb0E3lozs5`Xy zi~vF+%{z9uLjKvKPhP%x5f~7-Gj+%5N`%^=yk*Qn{`> z;xj&ROY6g`iy2a@{O)V(jk&8#hHACVDXey5a+KDod_Z&}kHM}xt7}Md@pil{2x7E~ zL$k^d2@Ec2XskjrN+IILw;#7((abu;OJii&v3?60x>d_Ma(onIPtcVnX@ELF0aL?T zSmWiL3(dOFkt!x=1O!_0n(cAzZW+3nHJ{2S>tgSK?~cFha^y(l@-Mr2W$%MN{#af8J;V*>hdq!gx=d0h$T7l}>91Wh07)9CTX zh2_ZdQCyFOQ)l(}gft0UZG`Sh2`x-w`5vC2UD}lZs*5 zG76$akzn}Xi))L3oGJ75#pcN=cX3!=57$Ha=hQ2^lwdyU#a}4JJOz6ddR%zae%#4& za)bFj)z=YQela(F#Y|Q#dp}PJghITwXouVaMq$BM?K%cXn9^Y@g43$=O)F&ZlOUom zJiad#dea;-eywBA@e&D6Pdso1?2^(pXiN91?jvcaUyYoKUmvl5G9e$W!okWe*@a<^ z8cQQ6cNSf+UPDx%?_G4aIiybZHHagF{;IcD(dPO!#=u zWfqLcPc^+7Uu#l(Bpxft{*4lv#*u7X9AOzDO z1D9?^jIo}?%iz(_dwLa{ex#T}76ZfN_Z-hwpus9y+4xaUu9cX}&P{XrZVWE{1^0yw zO;YhLEW!pJcbCt3L8~a7>jsaN{V3>tz6_7`&pi%GxZ=V3?3K^U+*ryLSb)8^IblJ0 zSRLNDvIxt)S}g30?s_3NX>F?NKIGrG_zB9@Z>uSW3k2es_H2kU;Rnn%j5qP)!XHKE zPB2mHP~tLCg4K_vH$xv`HbRsJwbZMUV(t=ez;Ec(vyHH)FbfLg`c61I$W_uBB>i^r z&{_P;369-&>23R%qNIULe=1~T$(DA`ev*EWZ6j(B$(te}x1WvmIll21zvygkS%vwG zzkR6Z#RKA2!z!C%M!O>!=Gr0(J0FP=-MN=5t-Ir)of50y10W}j`GtRCsXBakrKtG& zazmITDJMA0C51&BnLY)SY9r)NVTMs);1<=oosS9g31l{4ztjD3#+2H7u_|66b|_*O z;Qk6nalpqdHOjx|K&vUS_6ITgGll;TdaN*ta=M_YtyC)I9Tmr~VaPrH2qb6sd~=AcIxV+%z{E&0@y=DPArw zdV7z(G1hBx7hd{>(cr43^WF%4Y@PXZ?wPpj{OQ#tvc$pABJbvPGvdR`cAtHn)cSEV zrpu}1tJwQ3y!mSmH*uz*x0o|CS<^w%&KJzsj~DU0cLQUxk5B!hWE>aBkjJle8z~;s z-!A=($+}Jq_BTK5^B!`R>!MulZN)F=iXXeUd0w5lUsE5VP*H*oCy(;?S$p*TVvTxwAeWFB$jHyb0593)$zqalVlDX=GcCN1gU0 zlgU)I$LcXZ8Oyc2TZYTPu@-;7<4YYB-``Qa;IDcvydIA$%kHhJKV^m*-zxcvU4viy&Kr5GVM{IT>WRywKQ9;>SEiQD*NqplK-KK4YR`p0@JW)n_{TU3bt0 zim%;(m1=#v2}zTps=?fU5w^(*y)xT%1vtQH&}50ZF!9YxW=&7*W($2kgKyz1mUgfs zfV<*XVVIFnohW=|j+@Kfo!#liQR^x>2yQdrG;2o8WZR+XzU_nG=Ed2rK?ntA;K5B{ z>M8+*A4!Jm^Bg}aW?R?6;@QG@uQ8&oJ{hFixcfEnJ4QH?A4>P=q29oDGW;L;= z9-a0;g%c`C+Ai!UmK$NC*4#;Jp<1=TioL=t^YM)<<%u#hnnfSS`nq63QKGO1L8RzX z@MFDqs1z ztYmxDl@LU)5acvHk)~Z`RW7=aJ_nGD!mOSYD>5Odjn@TK#LY{jf?+piB5AM-CAoT_ z?S-*q7}wyLJzK>N%eMPuFgN)Q_otKP;aqy=D5f!7<=n(lNkYRXVpkB{TAYLYg{|(jtRqYmg$xH zjmq?B(RE4 zQx^~Pt}gxC2~l=K$$-sYy_r$CO(d=+b3H1MB*y_5g6WLaWTXn+TKQ|hNY^>Mp6k*$ zwkovomhu776vQATqT4blf~g;TY(MWCrf^^yfWJvSAB$p5l;jm@o#=!lqw+Lqfq>X= z$6~kxfm7`3q4zUEB;u4qa#BdJxO!;xGm)wwuisj{0y2x{R(IGMrsIzDY9LW>m!Y`= z04sx3IjnYvL<4JqxQ8f7qYd0s2Ig%`ytYPEMKI)s(LD}D@EY>x`VFtqvnADNBdeao zC96X+MxnwKmjpg{U&gP3HE}1=s!lv&D{6(g_lzyF3A`7Jn*&d_kL<;dAFx!UZ>hB8 z5A*%LsAn;VLp>3${0>M?PSQ)9s3}|h2e?TG4_F{}{Cs>#3Q*t$(CUc}M)I}8cPF6% z=+h(Kh^8)}gj(0}#e7O^FQ6`~fd1#8#!}LMuo3A0bN`o}PYsm!Y}sdOz$+Tegc=qT z8x`PH$7lvnhJp{kHWb22l;@7B7|4yL4UOOVM0MP_>P%S1Lnid)+k9{+3D+JFa#Pyf zhVc#&df87APl4W9X)F3pGS>@etfl=_E5tBcVoOfrD4hmVeTY-cj((pkn%n@EgN{0f zwb_^Rk0I#iZuHK!l*lN`ceJn(sI{$Fq6nN& zE<-=0_2WN}m+*ivmIOxB@#~Q-cZ>l136w{#TIJe478`KE7@=a{>SzPHsKLzYAyBQO zAtuuF$-JSDy_S@6GW0MOE~R)b;+0f%_NMrW(+V#c_d&U8Z9+ec4=HmOHw?gdjF(Lu zzra83M_BoO-1b3;9`%&DHfuUY)6YDV21P$C!Rc?mv&{lx#f8oc6?0?x zK08{WP65?#>(vPfA-c=MCY|%*1_<3D4NX zeVTi-JGl2uP_2@0F{G({pxQOXt_d{g_CV6b?jNpfUG9;8yle-^4KHRvZs-_2siata zt+d_T@U$&t*xaD22(fH(W1r$Mo?3dc%Tncm=C6{V9y{v&VT#^1L04vDrLM9qBoZ4@ z6DBN#m57hX7$C(=#$Y5$bJmwA$T8jKD8+6A!-IJwA{WOfs%s}yxUw^?MRZjF$n_KN z6`_bGXcmE#5e4Ym)aQJ)xg3Pg0@k`iGuHe?f(5LtuzSq=nS^5z>vqU0EuZ&75V%Z{ zYyhRLN^)$c6Ds{f7*FBpE;n5iglx5PkHfWrj3`x^j^t z7ntuV`g!9Xg#^3!x)l*}IW=(Tz3>Y5l4uGaB&lz{GDjm2D5S$CExLT`I1#n^lBH7Y zDgpMag@`iETKAI=p<5E#LTkwzVR@=yY|uBVI1HG|8h+d;G-qfuj}-ZR6fN>EfCCW z9~wRQoAPEa#aO?3h?x{YvV*d+NtPkf&4V0k4|L=uj!U{L+oLa(z#&iuhJr3-PjO3R z5s?=nn_5^*^Rawr>>Nr@K(jwkB#JK-=+HqwfdO<+P5byeim)wvqGlP-P|~Nse8=XF zz`?RYB|D6SwS}C+YQv+;}k6$-%D(@+t14BL@vM z2q%q?f6D-A5s$_WY3{^G0F131bbh|g!}#BKw=HQ7mx;Dzg4Z*bTLQSfo{ed{4}NZW zfrRm^Ca$rlE{Ue~uYv>R9{3smwATcdM_6+yWIO z*ZRH~uXE@#p$XTbCt5j7j2=86e{9>HIB6xDzV+vAo&B?KUiMP|ttOElepnl%|DPqL b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/web-ui/public/manifest.json b/web-ui/public/manifest.json new file mode 100644 index 0000000000..080d6c77ac --- /dev/null +++ b/web-ui/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/web-ui/public/robots.txt b/web-ui/public/robots.txt new file mode 100644 index 0000000000..e9e57dc4d4 --- /dev/null +++ b/web-ui/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/web-ui/src/App.less b/web-ui/src/App.less new file mode 100644 index 0000000000..ce63c10da7 --- /dev/null +++ b/web-ui/src/App.less @@ -0,0 +1 @@ +@import '~antd/dist/antd.less'; diff --git a/web-ui/src/App.tsx b/web-ui/src/App.tsx new file mode 100644 index 0000000000..86cb49f6ae --- /dev/null +++ b/web-ui/src/App.tsx @@ -0,0 +1,63 @@ +import React from 'react' +import { + BrowserRouter as Router, + Routes, + Route, + NavLink, + Navigate, +} from 'react-router-dom' +import { Layout, Menu } from 'antd' +import { + HddOutlined, + DeploymentUnitOutlined, + ClusterOutlined, +} from '@ant-design/icons' + +import MachinesPage from './pages/Machines' +import DeploymentPage from './pages/Deployment' + +import './App.less' + +const { Sider, Content } = Layout + +function Clusters() { + return
Clusters
+} + +function SiderMenu() { + return ( + + + }> + 配置机器 + + }> + 部署 + + }> + 集群管理 + + + + ) +} + +function App() { + return ( + + + + + + } /> + } /> + } /> + } /> + + + + + ) +} + +export default App diff --git a/web-ui/src/index.css b/web-ui/src/index.css new file mode 100644 index 0000000000..ec2585e8c0 --- /dev/null +++ b/web-ui/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/web-ui/src/index.tsx b/web-ui/src/index.tsx new file mode 100644 index 0000000000..606a3cf44e --- /dev/null +++ b/web-ui/src/index.tsx @@ -0,0 +1,11 @@ +import React from 'react' +import ReactDOM from 'react-dom' +import './index.css' +import App from './App' + +ReactDOM.render( + + + , + document.getElementById('root') +) diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx new file mode 100644 index 0000000000..fee79cabd7 --- /dev/null +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -0,0 +1,278 @@ +import React, { useMemo } from 'react' +import { Tag, Table, Menu, Dropdown, Space, Divider, Popconfirm } from 'antd' +import { DownOutlined } from '@ant-design/icons' + +import { IMachine, DEF_SSH_PORT } from '../Machines/MachineForm' + +export const COMPONENT_TYPES = [ + 'TiDB', + 'TiKV', + 'TiFlash', + 'PD', + 'Prometheus', + 'Grafana', + 'AlertManager', +] + +const COMPONENT_COLORS = { + TiDB: 'magenta', + TiKV: 'orange', + TiFlash: 'red', + PD: 'purple', + Prometheus: 'green', + Grafana: 'cyan', + AlertManager: 'blue', +} + +export interface IComponent { + id: string + machineID: string + type: string + priority: number + + deploy_dir_prefix?: string // "/tidb-deploy" + data_dir_prefix?: string // "/tidb-data", TiDB and Grafana have no data_dir +} +export const DEF_DEPLOY_DIR_PREFIX = '/tidb-deploy' +export const DEF_DATA_DIR_PREFIX = '/tidb-data' + +export interface ITiDBComponent extends IComponent { + port?: number // 4000 + status_port?: number // 10080 +} +export const DEF_TIDB_PORT = 4000 +export const DEF_TIDB_STATUS_PORT = 10080 + +export interface ITiKVComponent extends IComponent { + port?: number // 20160 + status_port?: number // 20180 +} +export const DEF_TIKV_PORT = 20160 +export const DEF_TIKV_STATUS_PORT = 20180 + +export interface ITiFlashComponent extends IComponent { + tcp_port?: number // 9000 + http_port?: number // 8123 + flash_service_port?: number // 3930 + flash_proxy_port?: number // 20170 + flash_proxy_status_port?: number // 20292 + metrics_port?: number // 8234 +} +export const DEF_TIFLASH_TCP_PORT = 9000 +export const DEF_TIFLASH_HTTP_PORT = 8123 +export const DEF_TIFLASH_SERVICE_PORT = 3930 +export const DEF_TIFLASH_PROXY_PORT = 20170 +export const DEF_TIFLASH_PROXY_STATUS_PORT = 20292 +export const DEF_TIFLASH_METRICS_PORT = 8234 + +export interface IPDComponent extends IComponent { + client_port?: number // 2379 + peer_port?: number // 2380 +} +export const DEF_PD_CLIENT_PORT = 2379 +export const DEF_PD_PEER_PORT = 2380 + +export interface IPrometheusComponent extends IComponent { + port?: number // 9090 +} +export const DEF_PROM_PORT = 9090 + +export interface IGrafanaComponent extends IComponent { + port?: number // 3000 +} +export const DEF_GRAFANA_PORT = 3000 + +export interface IAlertManagerComponent extends IComponent { + web_port?: number // 9093 + cluster_port?: number // 9094 +} +export const DEF_ALERT_WEB_PORT = 9093 +export const DEF_ALERT_CLUSTER_PORT = 9094 + +interface IDeploymentTableProps { + machines: { [key: string]: IMachine } + components: { [key: string]: IComponent } + onAddComponent?: (machine: IMachine, componentType: string) => void + onEditComponent?: (comp: IComponent) => void + onDeleteComponent?: (comp: IComponent) => void + onDeleteComponents?: (machine: IMachine) => void +} + +export default function DeploymentTable({ + machines, + components, + onAddComponent, + onEditComponent, + onDeleteComponent, + onDeleteComponents, +}: IDeploymentTableProps) { + const dataSource = useMemo(() => { + let machinesAndComps: (IMachine | IComponent)[] = [] + const sortedMachines = Object.values(machines).sort((a, b) => + a.host > b.host ? 1 : -1 + ) + for (const machine of sortedMachines) { + machinesAndComps.push(machine) + const respondComps = Object.values(components).filter( + (c) => c.machineID === machine.id + ) + if (respondComps.length > 0) { + respondComps.sort((a: any, b: any) => { + let delta + delta = a.priority - b.priority + if (delta === 0) { + delta = + (a.port || a.tcp_port || a.client_port || a.web_port || 0) - + (b.port || b.tcp_port || b.client_port || b.web_port || 0) + } + return delta + }) + machinesAndComps.splice(machinesAndComps.length, 0, ...respondComps) + } + } + return machinesAndComps + }, [machines, components]) + + const columns = useMemo(() => { + return [ + { + title: '目标机器 / 组件', + key: 'target_machine_component', + render: (text: any, rec: any) => { + if (rec.username) { + return `${rec.name} (${rec.host})` + } + return ( + + {rec.type} + + ) + }, + }, + { + title: '信息', + key: 'information', + render: (text: any, rec: any) => { + if (rec.username) { + return `SSH Port=${rec.ssh_port || DEF_SSH_PORT}, User=${ + rec.username + }, DC=${rec.dc}, Rack=${rec.rack}` + } + switch (rec.type) { + case 'TiDB': + return `Port=${rec.port || DEF_TIDB_PORT}/${ + rec.status_port || DEF_TIDB_STATUS_PORT + }, Path=${rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX}` + case 'TiKV': + return `Port=${rec.port || DEF_TIKV_PORT}/${ + rec.status_port || DEF_TIKV_STATUS_PORT + }, Path=${rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX},${ + rec.data_dir_prefix || DEF_DATA_DIR_PREFIX + }` + case 'TiFlash': + return `Port=${rec.tcp_port || DEF_TIFLASH_TCP_PORT}/${ + rec.http_port || DEF_TIFLASH_HTTP_PORT + }/${rec.flash_service_port || DEF_TIFLASH_SERVICE_PORT}/${ + rec.flash_proxy_port || DEF_TIFLASH_PROXY_PORT + }/${ + rec.flash_proxy_status_port || DEF_TIFLASH_PROXY_STATUS_PORT + }/${rec.metrics_port || DEF_TIFLASH_METRICS_PORT}, Path=${ + rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX + },${rec.data_dir_prefix || DEF_DATA_DIR_PREFIX}` + case 'PD': + return `Port=${rec.client_port || DEF_PD_CLIENT_PORT}/${ + rec.peer_port || DEF_PD_PEER_PORT + }, Path=${rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX},${ + rec.data_dir_prefix || DEF_DATA_DIR_PREFIX + }` + case 'Prometheus': + return `Port=${rec.port || DEF_PROM_PORT}, Path=${ + rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX + },${rec.data_dir_prefix || DEF_DATA_DIR_PREFIX}` + case 'Grafana': + return `Port=${rec.port || DEF_GRAFANA_PORT}, Path=${ + rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX + }` + case 'AlertManager': + return `Port=${rec.web_port || DEF_ALERT_WEB_PORT}/${ + rec.cluster_port || DEF_ALERT_CLUSTER_PORT + }, Path=${rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX},${ + rec.data_dir_prefix || DEF_DATA_DIR_PREFIX + }` + } + return '...' + }, + }, + { + title: '操作', + key: 'action', + render: (text: any, rec: any) => { + if (rec.username) { + return ( + + + onAddComponent && onAddComponent(rec, e.key as string) + } + > + {COMPONENT_TYPES.map((t) => ( + {t} + ))} + + } + trigger={['click']} + > + e.preventDefault()}> + 添加组件 + + + + + onDeleteComponents && onDeleteComponents(rec) + } + okText="删除" + cancelText="取消" + > + 删除所有组件 + + + ) + } + return ( + + onEditComponent && onEditComponent(rec)} + > + 编辑 + + + onDeleteComponent && onDeleteComponent(rec)} + okText="删除" + cancelText="取消" + > + 删除 + + + ) + }, + }, + ] + }, [onAddComponent, onEditComponent, onDeleteComponent, onDeleteComponents]) + + return ( + + ) +} diff --git a/web-ui/src/pages/Deployment/EditCompForm.tsx b/web-ui/src/pages/Deployment/EditCompForm.tsx new file mode 100644 index 0000000000..2512078a7b --- /dev/null +++ b/web-ui/src/pages/Deployment/EditCompForm.tsx @@ -0,0 +1,165 @@ +import React from 'react' +import { Form, Input, Button } from 'antd' + +import { + IComponent, + DEF_DEPLOY_DIR_PREFIX, + DEF_DATA_DIR_PREFIX, + DEF_TIDB_PORT, + DEF_TIDB_STATUS_PORT, + DEF_TIKV_STATUS_PORT, + DEF_TIKV_PORT, + DEF_TIFLASH_TCP_PORT, + DEF_TIFLASH_HTTP_PORT, + DEF_TIFLASH_SERVICE_PORT, + DEF_TIFLASH_PROXY_PORT, + DEF_TIFLASH_PROXY_STATUS_PORT, + DEF_TIFLASH_METRICS_PORT, + DEF_PD_CLIENT_PORT, + DEF_PD_PEER_PORT, + DEF_GRAFANA_PORT, + DEF_PROM_PORT, + DEF_ALERT_WEB_PORT, + DEF_ALERT_CLUSTER_PORT, +} from './DeploymentTable' + +interface IEditCompFormProps { + comp?: IComponent + onUpdateComp: (comp: IComponent) => void +} + +export default function EditCompForm({ + comp, + onUpdateComp, +}: IEditCompFormProps) { + function handleFinish(values: any) { + console.log('before:', values) + for (const key of Object.keys(values)) { + let v = values[key] + if (v === undefined) { + continue + } + if (typeof v === 'number') { + continue + } + if (typeof v === 'string') { + v = v.trim() + } + if (v === '') { + values[key] = undefined + continue + } + if (key === 'deploy_dir_prefix' || key === 'data_dir_prefix') { + continue + } + values[key] = parseInt(v) + if (values[key] <= 0) { + values[key] = undefined + } + } + console.log('after:', values) + onUpdateComp({ + ...comp, + ...values, + }) + } + + if (comp === undefined) { + return null + } + + const componentType = comp.type + + return ( + + + + + {['TiDB', 'Grafana'].indexOf(componentType) === -1 && ( + + + + )} + {componentType === 'TiDB' && ( + <> + + + + + + + + )} + {componentType === 'TiKV' && ( + <> + + + + + + + + )} + {componentType === 'TiFlash' && ( + <> + + + + + + + + + + + + + + + + + + + + )} + {componentType === 'PD' && ( + <> + + + + + + + + )} + {componentType === 'Prometheus' && ( + + + + )} + {componentType === 'Grafana' && ( + + + + )} + {componentType === 'AlertManager' && ( + <> + + + + + + + + )} + + + + + ) +} diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx new file mode 100644 index 0000000000..512e25b85b --- /dev/null +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -0,0 +1,71 @@ +import React, { useMemo } from 'react' +import yaml from 'yaml' + +import { IMachine } from '../Machines/MachineForm' +import { IComponent, COMPONENT_TYPES } from './DeploymentTable' + +interface ITopoPreviewProps { + machines: { [key: string]: IMachine } + components: { [key: string]: IComponent } +} + +export function genTopo({ machines, components }: ITopoPreviewProps) { + const componentsArr = Object.values(components) + + let topo = {} as any + for (const compType of COMPONENT_TYPES) { + const comps = componentsArr.filter( + (comp) => comp.type === compType + ) as any[] + if (comps.length === 0) { + continue + } + + let topoKey = '' + if (compType === 'Prometheus') { + topoKey = 'monitoring_servers' + } else { + topoKey = `${compType.toLowerCase()}_servers` + } + topo[topoKey] = [] + + for (const comp of comps) { + const targetMachine = machines[comp.machineID] + let m = {} as any + m.host = targetMachine.host + if (targetMachine.ssh_port !== undefined) { + m.ssh_port = targetMachine.ssh_port + } + // TODO: + // username / password / privateKey ... + + for (const key of Object.keys(comp)) { + if (key.indexOf('port') !== -1 && comp[key] !== undefined) { + m[key] = comp[key] + } + // TODO: handle deploy dir and data dir + } + + topo[topoKey].push(m) + topo[topoKey].sort((a: any, b: any) => (a.host > b.host ? 1 : -1)) + } + } + return topo +} + +export default function TopoPreview({ + machines, + components, +}: ITopoPreviewProps) { + const topo = useMemo(() => genTopo({ machines, components }), [ + machines, + components, + ]) + + return ( +
+ {/* TODO: syntax highlight */} +
{yaml.stringify(topo)}
+
+ ) +} diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx new file mode 100644 index 0000000000..dbd1c7ad2d --- /dev/null +++ b/web-ui/src/pages/Deployment/index.tsx @@ -0,0 +1,237 @@ +import React, { useCallback, useState } from 'react' +import { useLocalStorageState } from 'ahooks' +import { Drawer, Space, Button, Modal, Form, Input, Select } from 'antd' +import uniqid from 'uniqid' +import yaml from 'yaml' + +import { IMachine } from '../Machines/MachineForm' +import DeploymentTable, { + IComponent, + COMPONENT_TYPES, + DEF_TIDB_PORT, + DEF_TIDB_STATUS_PORT, + DEF_TIKV_PORT, + DEF_TIKV_STATUS_PORT, + DEF_TIFLASH_TCP_PORT, + DEF_TIFLASH_HTTP_PORT, + DEF_TIFLASH_SERVICE_PORT, + DEF_TIFLASH_PROXY_PORT, + DEF_TIFLASH_PROXY_STATUS_PORT, + DEF_TIFLASH_METRICS_PORT, + DEF_PD_PEER_PORT, + DEF_PROM_PORT, + DEF_GRAFANA_PORT, + DEF_ALERT_CLUSTER_PORT, +} from './DeploymentTable' +import EditCompForm from './EditCompForm' +import TopoPreview, { genTopo } from './TopoPreview' + +// TODO: fetch from API +const TIDB_VERSIONS = [ + 'v4.0.4', + 'v4.0.3', + 'v4.0.2', + 'v4.0.1', + 'v4.0.0', + 'v3.1.2', + 'v3.1.1', + 'v3.1.0', +] + +export default function DeploymentPage() { + const [machines] = useLocalStorageState<{ + [key: string]: IMachine + }>('machines', {}) + const [components, setComponents] = useLocalStorageState<{ + [key: string]: IComponent + }>('components', {}) + const [curComp, setCurComp] = useState(undefined) + + const [previewYaml, setPreviewYaml] = useState(false) + + const handleAddComponent = useCallback( + (machine: IMachine, componentType: string) => { + let comp: IComponent = { + id: uniqid(), + machineID: machine.id, + type: componentType, + priority: COMPONENT_TYPES.indexOf(componentType), + } + const existedSameComps = Object.values(components).filter( + (comp) => comp.type === componentType && comp.machineID === machine.id + ) + if (existedSameComps.length > 0) { + const lastComp = existedSameComps[existedSameComps.length - 1] as any + comp.deploy_dir_prefix = lastComp.deploy_dir_prefix + comp.data_dir_prefix = lastComp.data_dir_prefix + let newComp = comp as any + switch (componentType) { + case 'TiDB': + newComp.port = (lastComp.port || DEF_TIDB_PORT) + 1 + newComp.status_port = + (lastComp.status_port || DEF_TIDB_STATUS_PORT) + 1 + break + case 'TiKV': + newComp.port = (lastComp.port || DEF_TIKV_PORT) + 1 + newComp.status_port = + (lastComp.status_port || DEF_TIKV_STATUS_PORT) + 1 + break + case 'TiFlash': + newComp.tcp_port = (lastComp.tcp_port || DEF_TIFLASH_TCP_PORT) + 1 + newComp.http_port = + (lastComp.http_port || DEF_TIFLASH_HTTP_PORT) + 1 + newComp.flash_service_port = + (lastComp.flash_service_port || DEF_TIFLASH_SERVICE_PORT) + 1 + newComp.flash_proxy_port = + (lastComp.flash_proxy_port || DEF_TIFLASH_PROXY_PORT) + 1 + newComp.flash_proxy_status_port = + (lastComp.flash_proxy_status_port || + DEF_TIFLASH_PROXY_STATUS_PORT) + 1 + newComp.metrics_port = + (lastComp.metrics_port || DEF_TIFLASH_METRICS_PORT) + 1 + break + case 'PD': + newComp.client_port = (lastComp.peer_port || DEF_PD_PEER_PORT) + 1 + newComp.peer_port = (lastComp.peer_port || DEF_PD_PEER_PORT) + 2 + break + case 'Prometheus': + newComp.port = (lastComp.port || DEF_PROM_PORT) + 1 + break + case 'Grafana': + newComp.port = (lastComp.port || DEF_GRAFANA_PORT) + 2 + break + case 'AlertManager': + newComp.web_port = + (lastComp.cluster_port || DEF_ALERT_CLUSTER_PORT) + 1 + newComp.cluster_port = + (lastComp.cluster_port || DEF_ALERT_CLUSTER_PORT) + 2 + break + } + comp = newComp + } + setComponents({ + ...components, + [comp.id]: comp, + }) + }, + [components, setComponents] + ) + + const handleUpdateComponent = useCallback( + (comp: IComponent) => { + setComponents({ + ...components, + [comp.id]: comp, + }) + setCurComp(undefined) + }, + [components, setComponents] + ) + + const handleDeleteComponent = useCallback( + (comp: IComponent) => { + const newComps = { ...components } + delete newComps[comp.id] + setComponents(newComps) + }, + [components, setComponents] + ) + + const handleDeleteComponents = useCallback( + (machine: IMachine) => { + const newComps = { ...components } + const belongedComps = Object.values(components).filter( + (c) => c.machineID === machine.id + ) + for (const c of belongedComps) { + delete newComps[c.id] + } + setComponents(newComps) + }, + [components, setComponents] + ) + + function handleFinish(values: any) { + const topoYaml = yaml.stringify(genTopo({ machines, components })) + fetch('http://localhost:8080/api/deploy', { + method: 'post', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + ...values, + topo_yaml: topoYaml, + }), + }) + .then((res) => res.json()) + .then((data) => console.log(data)) + .catch((err) => console.log(err)) + } + + return ( +
+
+ + + + + + + + + + + + + + +
+ setCurComp(rec)} + onDeleteComponent={handleDeleteComponent} + onDeleteComponents={handleDeleteComponents} + /> +
+ + setCurComp(undefined)} + destroyOnClose={true} + > + + + + setPreviewYaml(false)} + onCancel={() => setPreviewYaml(false)} + > + + +
+ ) +} diff --git a/web-ui/src/pages/Machines/MachineForm.tsx b/web-ui/src/pages/Machines/MachineForm.tsx new file mode 100644 index 0000000000..5e906e932a --- /dev/null +++ b/web-ui/src/pages/Machines/MachineForm.tsx @@ -0,0 +1,298 @@ +import React from 'react' +import { + Form, + Input, + Checkbox, + Button, + Collapse, + Space, + Select, + Typography, +} from 'antd' +import uniqid from 'uniqid' + +export interface IMachine { + id: string + name: string + host: string + ssh_port?: number + + isPubKeyAuth: boolean + privateKey: string + privateKeyPassword: string + + username: string + password: string + + dc: string + rack: string +} +export const DEF_SSH_PORT = 22 + +const defMachine: IMachine = { + id: '', + name: '', + host: '', + ssh_port: undefined, + + isPubKeyAuth: false, + privateKey: '', + privateKeyPassword: '', + + username: '', + password: '', + + dc: '', + rack: '', +} + +function correctFormValues(values: any) { + for (const key of Object.keys(values)) { + if (key !== 'ssh_port' && key !== 'isPubKeyAuth') { + values[key] = values[key].trim() + } + if (key === 'ssh_port' && values[key] !== undefined) { + values[key] = parseInt(values[key]) + if (values[key] === 0) { + values[key] = undefined + } + } + } + if (values.name === '') { + values.name = `${values.username}@${values.host}:${ + values.ssh_port || DEF_SSH_PORT + }` + } +} + +interface IMachineFormProps { + machine?: IMachine + machines: { [key: string]: IMachine } + onAdd?: (machine: IMachine, close: boolean) => boolean + onUpdate?: (machine: IMachine) => boolean +} + +export default function MachineForm({ + machine, + machines, + onAdd, + onUpdate, +}: IMachineFormProps) { + const [form] = Form.useForm() + + const addNew: boolean = machine === undefined + + function onReset() { + form.resetFields() + } + + function onAddAndNext() { + form + .validateFields() + .then((values) => { + correctFormValues(values) + const ok = + onAdd && + onAdd( + { + ...defMachine, + ...(values as IMachine), + id: uniqid(), + }, + false + ) + if (ok) { + form.resetFields() + } + }) + .catch((_err) => {}) + } + + function handleFinish(values: any) { + correctFormValues(values) + if (addNew) { + onAdd && + onAdd( + { + ...defMachine, + ...(values as IMachine), + id: uniqid(), + }, + true + ) + } else { + onUpdate && + onUpdate({ + ...defMachine, + ...(values as IMachine), + id: machine!.id, + }) + } + } + + function handleTemplateChange(machineID: any) { + if (machineID === undefined) { + return + } + + const m = machines[machineID] + form.setFieldsValue({ + ssh_port: m.ssh_port, + + isPubKeyAuth: m.isPubKeyAuth, + privateKey: m.privateKey, + privateKeyPassword: m.privateKeyPassword, + + username: m.username, + password: m.password, + + dc: m.dc, + rack: m.rack, + }) + } + + return ( +
+ + {addNew && ( + + + + + + )} + + + + + + + + + + + + + + + + 使用私钥登录 + + + prevValues.isPubKeyAuth !== currentValues.isPubKeyAuth + } + > + {({ getFieldValue }) => { + return getFieldValue('isPubKeyAuth') ? ( + <> + + + + + + + + ) : ( + + + + ) + }} + + + + + + + + + + + + + + + + {addNew && ( + + )} + + + + + + ) +} diff --git a/web-ui/src/pages/Machines/MachinesTable.tsx b/web-ui/src/pages/Machines/MachinesTable.tsx new file mode 100644 index 0000000000..75aade4c7e --- /dev/null +++ b/web-ui/src/pages/Machines/MachinesTable.tsx @@ -0,0 +1,86 @@ +import React, { useMemo } from 'react' +import { Table, Space, Divider, Popconfirm } from 'antd' + +import { IMachine, DEF_SSH_PORT } from './MachineForm' + +interface IMachinesTableProps { + machines: { [key: string]: IMachine } + onEdit?: (m: IMachine) => void + onDelete?: (m: IMachine) => void +} + +export default function MachinesTable({ + machines, + onEdit, + onDelete, +}: IMachinesTableProps) { + const dataSource = useMemo( + () => Object.values(machines).sort((a, b) => (a.host > b.host ? 1 : -1)), + [machines] + ) + const columns = useMemo(() => { + return [ + { + title: '机器名字', + dataIndex: 'name', + key: 'name', + }, + { + title: '地址', + key: 'address', + render: (text: any, rec: any) => + `${rec.host}:${rec.ssh_port || DEF_SSH_PORT}`, + }, + { + title: '登录用户', + dataIndex: 'username', + key: 'username', + }, + { + title: '使用公钥登录', + key: 'isPubKeyAuth', + render: (text: any, rec: any) => (rec.isPubKeyAuth ? '是' : '否'), + }, + { + title: '标签: DC', + key: 'label_dc', + dataIndex: 'dc', + }, + { + title: '标签: Rack', + key: 'label_rack', + dataIndex: 'rack', + }, + { + title: '操作', + key: 'action', + render: (text: any, rec: any) => ( + + onEdit && onEdit(rec)}> + 编辑 + + + onDelete && onDelete(rec)} + okText="删除" + cancelText="取消" + > + 删除 + + + ), + }, + ] + }, [onEdit, onDelete]) + + return ( +
+ ) +} diff --git a/web-ui/src/pages/Machines/index.tsx b/web-ui/src/pages/Machines/index.tsx new file mode 100644 index 0000000000..69eb5c4a93 --- /dev/null +++ b/web-ui/src/pages/Machines/index.tsx @@ -0,0 +1,136 @@ +import React, { useState, useCallback } from 'react' +import { Button, Drawer, Modal, Space } from 'antd' +import { useLocalStorageState } from 'ahooks' + +import MachineForm, { IMachine } from './MachineForm' +import MachinesTable from './MachinesTable' +import { IComponent } from '../Deployment/DeploymentTable' + +export default function MachinesPage() { + const [showForm, setShowForm] = useState(false) + const [curMachine, setCurMachine] = useState(undefined) + + const [machines, setMachines] = useLocalStorageState<{ + [key: string]: IMachine + }>('machines', {}) + const [components, setComponents] = useLocalStorageState<{ + [key: string]: IComponent + }>('components', {}) + + function handleAddMachine(machine: IMachine, close: boolean) { + let dup = Object.values(machines).find((m) => m.host === machine.host) + if (dup !== undefined) { + Modal.error({ + title: '添加失败', + content: `该主机 ${machine.host} 已存在`, + }) + return false + } + + dup = Object.values(machines).find((m) => m.name === machine.name) + if (dup !== undefined) { + Modal.error({ + title: '添加失败', + content: `该主机 name ${machine.name} 已被使用`, + }) + return false + } + + setMachines({ ...machines, [machine.id]: machine }) + if (close) { + setShowForm(false) + } + return true + } + + function handleUpdateMachine(machine: IMachine) { + // TODO: duplicated with above code + let dup = Object.values(machines).find((m) => m.host === machine.host) + if (dup && dup.id !== machine.id) { + Modal.error({ + title: '添加失败', + content: `该主机 ${machine.host} 已存在`, + }) + return false + } + + dup = Object.values(machines).find((m) => m.name === machine.name) + if (dup && dup.id !== machine.id) { + Modal.error({ + title: '添加失败', + content: `该主机 name ${machine.name} 已被使用`, + }) + return false + } + setMachines({ + ...machines, + [machine.id]: machine, + }) + setShowForm(false) + return true + } + + const addMachine = useCallback(() => { + setCurMachine(undefined) + setShowForm(true) + }, []) + + const editMachine = useCallback((m: IMachine) => { + setCurMachine(m) + setShowForm(true) + }, []) + + const deleteMachine = useCallback( + (m: IMachine) => { + const newMachines = { ...machines } + delete newMachines[m.id] + setMachines(newMachines) + + // delete related component + const newComps = { ...components } + const belongedComps = Object.values(components).filter( + (c) => c.machineID === m.id + ) + for (const c of belongedComps) { + delete newComps[c.id] + } + setComponents(newComps) + }, + [machines, setMachines, components, setComponents] + ) + + return ( +
+ + + + +
+ +
+ + setShowForm(false)} + destroyOnClose={true} + > + + +
+ ) +} diff --git a/web-ui/src/react-app-env.d.ts b/web-ui/src/react-app-env.d.ts new file mode 100644 index 0000000000..6431bc5fc6 --- /dev/null +++ b/web-ui/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/web-ui/tsconfig.json b/web-ui/tsconfig.json new file mode 100644 index 0000000000..f2850b7161 --- /dev/null +++ b/web-ui/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react" + }, + "include": [ + "src" + ] +} diff --git a/web-ui/yarn.lock b/web-ui/yarn.lock new file mode 100644 index 0000000000..bebf6e4b69 --- /dev/null +++ b/web-ui/yarn.lock @@ -0,0 +1,11528 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ahooksjs/use-request@^2.3.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@ahooksjs/use-request/-/use-request-2.5.0.tgz#a818ad5dc5e6d64ffafdf3058886a69912af8289" + integrity sha512-lZJ3ArQkQKS9vqASSTFcrTrHrB5L8vzCH7T8CCDdlvyiCSC4cmc9j10BneNKrlxGJCiDnSuQHhA5cVyecr9R1g== + dependencies: + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" + +"@ant-design/colors@^3.1.0": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-3.2.2.tgz#5ad43d619e911f3488ebac303d606e66a8423903" + integrity sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ== + dependencies: + tinycolor2 "^1.4.1" + +"@ant-design/css-animation@^1.7.2": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@ant-design/css-animation/-/css-animation-1.7.3.tgz#60a1c970014e86b28f940510d69e503e428f1136" + integrity sha512-LrX0OGZtW+W6iLnTAqnTaoIsRelYeuLZWsrmBJFUXDALQphPsN8cE5DCsmoSlL0QYb94BQxINiuS70Ar/8BNgA== + +"@ant-design/icons-svg@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz#480b025f4b20ef7fe8f47d4a4846e4fee84ea06c" + integrity sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ== + +"@ant-design/icons@^4.2.1", "@ant-design/icons@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.2.2.tgz#6533c5a02aec49238ec4748074845ad7d85a4f5e" + integrity sha512-DrVV+wcupnHS7PehJ6KiTcJtAR5c25UMgjGECCc6pUT9rsvw0AuYG+a4HDjfxEQuDqKTHwW+oX/nIvCymyLE8Q== + dependencies: + "@ant-design/colors" "^3.1.0" + "@ant-design/icons-svg" "^4.0.0" + "@babel/runtime" "^7.10.4" + classnames "^2.2.6" + insert-css "^2.0.0" + rc-util "^5.0.1" + +"@ant-design/react-slick@~0.27.0": + version "0.27.0" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.27.0.tgz#c5d4bfd879885b74024ffbce42cccb5f7bff41e9" + integrity sha512-dq/p/1oKgew99cNrhT6/BA4v7c7nAhPlS6IcVGVTMsp175bYxbHBT1GfY5vxZyz97YaTnzJ8s2Wql4AOnFQ+9g== + dependencies: + "@babel/runtime" "^7.10.4" + classnames "^2.2.5" + json2mq "^0.2.0" + lodash "^4.17.15" + resize-observer-polyfill "^1.5.0" + +"@babel/code-frame@7.8.3", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" + integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== + dependencies: + browserslist "^4.9.1" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" + integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== + dependencies: + "@babel/types" "^7.11.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.0.tgz#0f67adea4ec39dad6e63345f70eec33014d78c89" + integrity sha512-onl4Oy46oGCzymOXtKMQpI7VXtCbTSHK1kqBydZ6AmzuNcacEVqGk9tZtAS+48IA9IstZcDCgIg8hQKnb7suRw== + dependencies: + "@babel/types" "^7.9.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-builder-react-jsx-experimental@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43" + integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-module-imports" "^7.8.3" + "@babel/types" "^7.9.0" + +"@babel/helper-builder-react-jsx@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" + integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/types" "^7.9.0" + +"@babel/helper-call-delegate@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab" + integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.7" + +"@babel/helper-compilation-targets@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" + integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== + dependencies: + "@babel/compat-data" "^7.8.6" + browserslist "^4.9.1" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" + integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.5" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-class-features-plugin@^7.8.3": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" + integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + +"@babel/helper-plugin-utils@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helper-validator-identifier@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" + integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== + +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.0.tgz#ab2c1bc4821af766cab51d4868a5038874ea5a12" + integrity sha512-/9GvfYTCG1NWCNwDj9e+XlnSCmWW/r9T794Xi58vPF9WCcnZCAZ0kWLSn54oqP40SUvh1T2G6VwKmFO5AOlW3A== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.0.tgz#f821b32313f07ee570976d3f6238e8d2d66e0a8e" + integrity sha512-Iwyp00CZsypoNJcpXCbq3G4tcDgphtlMwMVrMhhZ//XBkqjXF7LW6V511yk0+pBX3ZwwGnPea+pTKNJiqA7pUg== + +"@babel/parser@^7.10.4", "@babel/parser@^7.11.0": + version "7.11.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9" + integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA== + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" + integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-proposal-decorators@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" + integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-decorators" "^7.8.3" + +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@7.8.3", "@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" + integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@7.9.0", "@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.8" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-decorators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" + integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-flow@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" + integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" + integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" + integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.0.tgz#ab89c175ecf5b4c8911194aa8657966615324ce9" + integrity sha512-xt/0CuBRBsBkqfk95ILxf0ge3gnXjEhOHrNxIiS8fdzSWgecuf9Vq2ogLUfaozJgt3LDO49ThMVWiyezGkei7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-destructuring@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" + integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-flow-strip-types@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" + integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-flow" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-modules-amd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.8.7": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.8.tgz#0381de466c85d5404565243660c4496459525daf" + integrity sha512-hC4Ld/Ulpf1psQciWWwdnUspQoQco2bMzSrwU6TmzRlvoYQe4rQFy9vnCZDTlVeCQj0JPfL+1RX0V8hCJvkgBA== + dependencies: + "@babel/helper-call-delegate" "^7.8.7" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-constant-elements@^7.0.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz#a75abc936a3819edec42d3386d9f1c93f28d9d9e" + integrity sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-display-name@7.8.3", "@babel/plugin-transform-react-display-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" + integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-jsx-development@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" + integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== + dependencies: + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx-self@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" + integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx-source@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" + integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx@^7.9.1": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.1.tgz#d03af29396a6dc51bfa24eefd8005a9fd381152a" + integrity sha512-+xIZ6fPoix7h57CNO/ZeYADchg1tFyX9NDsnmNFFua8e1JNPln156mzS+8AQe1On2X2GLlANHJWHIXbMCqWDkQ== + dependencies: + "@babel/helper-builder-react-jsx" "^7.9.0" + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-runtime@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" + integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typescript@^7.9.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb" + integrity sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/preset-env@7.9.0", "@babel/preset-env@^7.4.5": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" + integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== + dependencies: + "@babel/compat-data" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.0" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.8.7" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.0" + browserslist "^4.9.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@7.9.1", "@babel/preset-react@^7.0.0": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a" + integrity sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-react-display-name" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.9.1" + "@babel/plugin-transform-react-jsx-development" "^7.9.0" + "@babel/plugin-transform-react-jsx-self" "^7.9.0" + "@babel/plugin-transform-react-jsx-source" "^7.9.0" + +"@babel/preset-typescript@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" + integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.9.0" + +"@babel/runtime-corejs3@^7.10.2": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz#02c3029743150188edeb66541195f54600278419" + integrity sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime-corejs3@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.0.tgz#0d4119c44ad05bfa0ca16f2f4f91cde430056c08" + integrity sha512-Fe3z3yVZNCUTaOFBAofwkEtFiYi7a7Gg2F5S1QX+mqP403i2iKJtyHJYEp/PV2ijUheT0PiKWbmXcqtwLhmBzg== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.9.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" + integrity sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.5.1", "@babel/runtime@^7.7.6": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" + integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/traverse@^7.10.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" + integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.11.0" + "@babel/types" "^7.11.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7", "@babel/types@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" + integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@babel/types@^7.10.4", "@babel/types@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" + integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@csstools/normalize.css@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" + integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + +"@hapi/joi@^15.0.0": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.3.0", "@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.3.0", "@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@sheerun/mutationobserver-shim@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25" + integrity sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw== + +"@svgr/babel-plugin-add-jsx-attribute@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" + integrity sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig== + +"@svgr/babel-plugin-remove-jsx-attribute@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz#297550b9a8c0c7337bea12bdfc8a80bb66f85abc" + integrity sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz#c196302f3e68eab6a05e98af9ca8570bc13131c7" + integrity sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz#310ec0775de808a6a2e4fd4268c245fd734c1165" + integrity sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w== + +"@svgr/babel-plugin-svg-dynamic-title@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz#2cdedd747e5b1b29ed4c241e46256aac8110dd93" + integrity sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w== + +"@svgr/babel-plugin-svg-em-dimensions@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz#9a94791c9a288108d20a9d2cc64cac820f141391" + integrity sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w== + +"@svgr/babel-plugin-transform-react-native-svg@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz#151487322843359a1ca86b21a3815fd21a88b717" + integrity sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw== + +"@svgr/babel-plugin-transform-svg-component@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz#5f1e2f886b2c85c67e76da42f0f6be1b1767b697" + integrity sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw== + +"@svgr/babel-preset@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-4.3.3.tgz#a75d8c2f202ac0e5774e6bfc165d028b39a1316c" + integrity sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^4.2.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^4.2.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^4.2.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^4.2.0" + "@svgr/babel-plugin-svg-dynamic-title" "^4.3.3" + "@svgr/babel-plugin-svg-em-dimensions" "^4.2.0" + "@svgr/babel-plugin-transform-react-native-svg" "^4.2.0" + "@svgr/babel-plugin-transform-svg-component" "^4.2.0" + +"@svgr/core@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-4.3.3.tgz#b37b89d5b757dc66e8c74156d00c368338d24293" + integrity sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w== + dependencies: + "@svgr/plugin-jsx" "^4.3.3" + camelcase "^5.3.1" + cosmiconfig "^5.2.1" + +"@svgr/hast-util-to-babel-ast@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz#1d5a082f7b929ef8f1f578950238f630e14532b8" + integrity sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg== + dependencies: + "@babel/types" "^7.4.4" + +"@svgr/plugin-jsx@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz#e2ba913dbdfbe85252a34db101abc7ebd50992fa" + integrity sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w== + dependencies: + "@babel/core" "^7.4.5" + "@svgr/babel-preset" "^4.3.3" + "@svgr/hast-util-to-babel-ast" "^4.3.2" + svg-parser "^2.0.0" + +"@svgr/plugin-svgo@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz#daac0a3d872e3f55935c6588dd370336865e9e32" + integrity sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w== + dependencies: + cosmiconfig "^5.2.1" + merge-deep "^3.0.2" + svgo "^1.2.2" + +"@svgr/webpack@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.3.3.tgz#13cc2423bf3dff2d494f16b17eb7eacb86895017" + integrity sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg== + dependencies: + "@babel/core" "^7.4.5" + "@babel/plugin-transform-react-constant-elements" "^7.0.0" + "@babel/preset-env" "^7.4.5" + "@babel/preset-react" "^7.0.0" + "@svgr/core" "^4.3.3" + "@svgr/plugin-jsx" "^4.3.3" + "@svgr/plugin-svgo" "^4.3.1" + loader-utils "^1.2.3" + +"@testing-library/dom@*": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.22.1.tgz#b66861fb7751287bda63a55f5c72ca808c63043c" + integrity sha512-bEszhvj9LcspaRz56mqGV7uc+vJTAYKCKPJcGb5X6U1qBysgTAgCexQXvKZ3BBjWu5S/TANP2NniOVsMWqKXcw== + dependencies: + "@babel/runtime" "^7.10.3" + "@types/aria-query" "^4.2.0" + aria-query "^4.2.2" + dom-accessibility-api "^0.5.0" + pretty-format "^25.5.0" + +"@testing-library/dom@^6.15.0": + version "6.16.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.16.0.tgz#04ada27ed74ad4c0f0d984a1245bb29b1fd90ba9" + integrity sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA== + dependencies: + "@babel/runtime" "^7.8.4" + "@sheerun/mutationobserver-shim" "^0.3.2" + "@types/testing-library__dom" "^6.12.1" + aria-query "^4.0.2" + dom-accessibility-api "^0.3.0" + pretty-format "^25.1.0" + wait-for-expect "^3.0.2" + +"@testing-library/jest-dom@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz#00dfa0cbdd837d9a3c2a7f3f0a248ea6e7b89742" + integrity sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg== + dependencies: + "@babel/runtime" "^7.5.1" + chalk "^2.4.1" + css "^2.2.3" + css.escape "^1.5.1" + jest-diff "^24.0.0" + jest-matcher-utils "^24.0.0" + lodash "^4.17.11" + pretty-format "^24.0.0" + redent "^3.0.0" + +"@testing-library/react@^9.3.2": + version "9.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.5.0.tgz#71531655a7890b61e77a1b39452fbedf0472ca5e" + integrity sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg== + dependencies: + "@babel/runtime" "^7.8.4" + "@testing-library/dom" "^6.15.0" + "@types/testing-library__react" "^9.1.2" + +"@testing-library/user-event@^7.1.2": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-7.2.1.tgz#2ad4e844175a3738cb9e7064be5ea070b8863a1c" + integrity sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA== + +"@types/aria-query@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" + integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== + +"@types/babel__core@^7.1.0": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" + integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a" + integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/jest@^24.0.0": + version "24.9.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534" + integrity sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q== + dependencies: + jest-diff "^24.3.0" + +"@types/js-cookie@^2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" + integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== + +"@types/json-schema@^7.0.3": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" + integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== + +"@types/json-schema@^7.0.4": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" + integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "13.9.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349" + integrity sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg== + +"@types/node@^12.0.0": + version "12.12.54" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz#a4b58d8df3a4677b6c08bfbc94b7ad7a7a5f82d1" + integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@types/react-dom@*", "@types/react-dom@^16.9.0": + version "16.9.8" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" + integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^16.9.0": + version "16.9.46" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.46.tgz#f0326cd7adceda74148baa9bff6e918632f5069e" + integrity sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/testing-library__dom@*": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-7.5.0.tgz#e0a00dd766983b1d6e9d10d33e708005ce6ad13e" + integrity sha512-mj1aH4cj3XUpMEgVpognma5kHVtbm6U6cHZmEFzCRiXPvKkuHrFr3+yXdGLXvfFRBaQIVshPGHI+hGTOJlhS/g== + dependencies: + "@testing-library/dom" "*" + +"@types/testing-library__dom@^6.12.1": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz#1aede831cb4ed4a398448df5a2c54b54a365644e" + integrity sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA== + dependencies: + pretty-format "^24.3.0" + +"@types/testing-library__react@^9.1.2": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.3.tgz#35eca61cc6ea923543796f16034882a1603d7302" + integrity sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w== + dependencies: + "@types/react-dom" "*" + "@types/testing-library__dom" "*" + pretty-format "^25.1.0" + +"@types/uniqid@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@types/uniqid/-/uniqid-5.2.0.tgz#040674219cffe16ca035c820c2581012e6eb11e5" + integrity sha512-ZBIIQJj0y49rgMfWDEr3miyNhOxyfhvf5/1VVbLObJpfkdGl0Vj2J8qENWwfT2W9OBq5FhwtnJ3nTs2dnY3w2A== + +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + +"@types/yargs@^13.0.0": + version "13.0.8" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99" + integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^15.0.0": + version "15.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" + integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^2.10.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz#a86cf618c965a462cddf3601f594544b134d6d68" + integrity sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA== + dependencies: + "@typescript-eslint/experimental-utils" "2.24.0" + eslint-utils "^1.4.3" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.24.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz#a5cb2ed89fedf8b59638dc83484eb0c8c35e1143" + integrity sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.24.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/parser@^2.10.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.24.0.tgz#2cf0eae6e6dd44d162486ad949c126b887f11eb8" + integrity sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.24.0" + "@typescript-eslint/typescript-estree" "2.24.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.24.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz#38bbc8bb479790d2f324797ffbcdb346d897c62a" + integrity sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^6.3.0" + tsutils "^3.17.1" + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^4.1.0, acorn-globals@^4.3.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + +address@1.1.2, address@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +adjust-sourcemap-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4" + integrity sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA== + dependencies: + assert "1.4.1" + camelcase "5.0.0" + loader-utils "1.2.3" + object-path "0.11.4" + regex-parser "2.2.10" + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ahooks@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ahooks/-/ahooks-2.5.0.tgz#94f6936217f230870629b6f154093b340531e9ba" + integrity sha512-ixe/dmX/U741f4o0xFTCrghwzjHm4n9CF9d0U3e2YwM0ridIWVDigUQItMGrPlUpaWFTQwZlejpdFeIVzFCsMw== + dependencies: + "@ahooksjs/use-request" "^2.3.0" + "@types/js-cookie" "^2.2.6" + intersection-observer "^0.7.0" + js-cookie "^2.2.1" + lodash.debounce "^4.0.8" + lodash.isequal "^4.5.0" + lodash.throttle "^4.1.1" + resize-observer-polyfill "^1.5.1" + screenfull "^5.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.2: + version "6.12.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" + integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +antd@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/antd/-/antd-4.5.3.tgz#1ea0cf501e1e71626a4a57ca5e6d9544470afc09" + integrity sha512-/drsnAfUjrdDrIni7zmbRk4HwtuWszj+D6WBCWKh6JO3XLvCjNMJN0ayYMykS80FPw4RaOx0tl2yKhiQODvBgA== + dependencies: + "@ant-design/css-animation" "^1.7.2" + "@ant-design/icons" "^4.2.1" + "@ant-design/react-slick" "~0.27.0" + "@babel/runtime" "^7.10.4" + array-tree-filter "^2.1.0" + classnames "^2.2.6" + copy-to-clipboard "^3.2.0" + lodash "^4.17.13" + moment "^2.25.3" + omit.js "^2.0.2" + raf "^3.4.1" + rc-animate "~3.1.0" + rc-cascader "~1.3.0" + rc-checkbox "~2.3.0" + rc-collapse "~2.0.0" + rc-dialog "~8.1.0" + rc-drawer "~4.1.0" + rc-dropdown "~3.1.2" + rc-field-form "~1.8.0" + rc-input-number "~6.0.0" + rc-mentions "~1.4.0" + rc-menu "~8.5.2" + rc-motion "^1.0.0" + rc-notification "~4.4.0" + rc-pagination "~2.4.5" + rc-picker "~1.15.1" + rc-progress "~3.0.0" + rc-rate "~2.8.2" + rc-resize-observer "^0.2.3" + rc-select "~11.0.12" + rc-slider "~9.3.0" + rc-steps "~4.1.0" + rc-switch "~3.2.0" + rc-table "~7.8.0" + rc-tabs "~11.5.0" + rc-textarea "~0.3.0" + rc-tooltip "~4.2.0" + rc-tree "~3.8.5" + rc-tree-select "~4.1.1" + rc-trigger "~4.4.0" + rc-upload "~3.2.0" + rc-util "^5.0.1" + scroll-into-view-if-needed "^2.2.25" + warning "^4.0.3" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +aria-query@^4.0.2, aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.0.3, array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async-validator@^3.0.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.4.0.tgz#871b3e594124bf4c4eb7bcd1a9e78b44f3b09cae" + integrity sha512-VrFk4eYiJAWKskEz115iiuCf9O0ftnMMPXrOFMqyzGH2KxO7YwncKyn/FgOOP+0MDHMfXL7gLExagCutaZGigA== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.6.1: + version "9.7.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" + integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== + dependencies: + browserslist "^4.8.3" + caniuse-lite "^1.0.30001020" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.26" + postcss-value-parser "^4.0.2" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +axobject-query@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799" + integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ== + +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-eslint@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-extract-comments@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== + dependencies: + babylon "^6.18.0" + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +babel-plugin-named-asset-import@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz#c9750a1b38d85112c9e166bf3ef7c5dbc605f4be" + integrity sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA== + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + +babel-preset-react-app@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz#54775d976588a8a6d1a99201a702befecaf48030" + integrity sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA== + dependencies: + "@babel/core" "7.9.0" + "@babel/plugin-proposal-class-properties" "7.8.3" + "@babel/plugin-proposal-decorators" "7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.8.3" + "@babel/plugin-proposal-numeric-separator" "7.8.3" + "@babel/plugin-proposal-optional-chaining" "7.9.0" + "@babel/plugin-transform-flow-strip-types" "7.9.0" + "@babel/plugin-transform-react-display-name" "7.8.3" + "@babel/plugin-transform-runtime" "7.9.0" + "@babel/preset-env" "7.9.0" + "@babel/preset-react" "7.9.1" + "@babel/preset-typescript" "7.9.0" + "@babel/runtime" "7.9.0" + babel-plugin-macros "2.8.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.10.0, browserslist@^4.0.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9.1: + version "4.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== + dependencies: + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" + integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== + dependencies: + pascal-case "^3.1.1" + tslib "^1.10.0" + +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001035: + version "1.0.30001035" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" + integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^2.0.2, chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1, chownr@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-deep@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" + integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY= + dependencies: + for-own "^0.1.3" + is-plain-object "^2.0.1" + kind-of "^3.0.2" + lazy-cache "^1.0.3" + shallow-clone "^0.1.2" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-scroll-into-view@^1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz#80e3ebb25d6aa89f42e533956cb4b16a04cfe759" + integrity sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +confusing-browser-globals@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" + integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-to-clipboard@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + +core-js-compat@^3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" + integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + dependencies: + browserslist "^4.8.3" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a" + integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw== + +core-js@^2.4.0: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-js@^3.5.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" + integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" + integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.23" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.1" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.2" + schema-utils "^2.6.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css-what@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" + integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +css@^2.0.0, css@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" + integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + dependencies: + css-tree "1.0.0-alpha.37" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0, cssstyle@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +csstype@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" + integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== + +customize-cra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/customize-cra/-/customize-cra-1.0.0.tgz#73286563631aa08127ad4d30a2e3c89cf4e93c8d" + integrity sha512-DbtaLuy59224U+xCiukkxSq8clq++MOtJ1Et7LED1fLszWe88EoblEYFBJ895sB1mC6B4uu3xPT/IjClELhMbA== + dependencies: + lodash.flow "^3.5.0" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0, data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +date-fns@^2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.15.0.tgz#424de6b3778e4e69d3ff27046ec136af58ae5d5f" + integrity sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ== + +dayjs@^1.8.30: + version "1.8.33" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.33.tgz#18bc4a2b6c1c6f4d67b4c4f2536c0b97e5b766f7" + integrity sha512-881TDLZCdpJFKbraWRHcUG8zfMLLX400ENf9rFZDuWc5zYMss6xifo2PhlDX0ftOmR2NRmaIY47bAa4gKQfXqw== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz#511e5993dd673b97c87ea47dba0e3892f7e0c983" + integrity sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA== + +dom-accessibility-api@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.0.tgz#fddffd04e178796e241436c3f21be2f89c91afac" + integrity sha512-eCVf9n4Ni5UQAFc2+fqfMPHdtiX7DA0rLakXgNBZfXNJzEbNo3MQIYd+zdYpFBqAaGYVrkd8leNSLGPrG4ODmA== + +dom-align@^1.7.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.0.tgz#56fb7156df0b91099830364d2d48f88963f5a29c" + integrity sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA== + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" + integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.378: + version "1.3.379" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.379.tgz#81dc5e82a3e72bbb830d93e15bc35eda2bbc910e" + integrity sha512-NK9DBBYEBb5f9D7zXI0hiE941gq3wkBeQmXs1ingigA/jnTg5mhwY2Z5egwA+ZI8OLGKCx0h1Cl8/xeuIBuLlg== + +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1, emoji-regex@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: + version "1.17.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" + integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.11.0, escodegen@^1.9.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" + integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-react-app@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df" + integrity sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ== + dependencies: + confusing-browser-globals "^1.0.9" + +eslint-import-resolver-node@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" + integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-loader@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-3.0.3.tgz#e018e3d2722381d982b1201adb56819c73b480ca" + integrity sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw== + dependencies: + fs-extra "^8.1.0" + loader-fs-cache "^1.0.2" + loader-utils "^1.2.3" + object-hash "^2.0.1" + schema-utils "^2.6.1" + +eslint-module-utils@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" + integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-flowtype@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz#82b2bd6f21770e0e5deede0228e456cb35308451" + integrity sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ== + dependencies: + lodash "^4.17.15" + +eslint-plugin-import@2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" + integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.1" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.12.0" + +eslint-plugin-jsx-a11y@6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" + integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg== + dependencies: + "@babel/runtime" "^7.4.5" + aria-query "^3.0.0" + array-includes "^3.0.3" + ast-types-flow "^0.0.7" + axobject-query "^2.0.2" + damerau-levenshtein "^1.0.4" + emoji-regex "^7.0.2" + has "^1.0.3" + jsx-ast-utils "^2.2.1" + +eslint-plugin-react-hooks@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04" + integrity sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA== + +eslint-plugin-react@7.19.0: + version "7.19.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666" + integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ== + dependencies: + array-includes "^3.1.1" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.2.3" + object.entries "^1.1.1" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.15.1" + semver "^6.3.0" + string.prototype.matchall "^4.0.2" + xregexp "^4.3.0" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" + integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-glob@^2.0.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-loader@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" + integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@4.1.0, find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" + integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== + dependencies: + debug "^3.0.0" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-ts-checker-webpack-plugin@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^3.3.0" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@2.1.2, fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +fsevents@^1.2.7: + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gzip-size@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" + integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +harmony-reflect@^1.4.6: + version "1.6.1" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" + integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +history@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/history/-/history-5.0.0.tgz#0cabbb6c4bbf835addb874f8259f6d25101efd08" + integrity sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg== + dependencies: + "@babel/runtime" "^7.7.6" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== + +html-escaper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" + integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + +html-minifier-terser@^5.0.1: + version "5.0.4" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz#e8cc02748acb983bd7912ea9660bd31c0702ec32" + integrity sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-webpack-plugin@4.0.0-beta.11: + version "4.0.0-beta.11" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715" + integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg== + dependencies: + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^3.3.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +identity-obj-proxy@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + +immer@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" + integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +insert-css@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/insert-css/-/insert-css-2.0.0.tgz#eb5d1097b7542f4c79ea3060d3aee07d053880f4" + integrity sha1-610Ql7dUL0x56jBg067gfQU4gPQ= + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + +intersection-observer@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.7.0.tgz#ee16bee978db53516ead2f0a8154b09b400bbdc9" + integrity sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" + integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4, is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" + integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== + dependencies: + html-escaper "^2.0.0" + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.0.0, jest-diff@^24.3.0, jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom-fourteen@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz#4cd0042f58b4ab666950d96532ecb2fc188f96fb" + integrity sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q== + dependencies: + "@jest/environment" "^24.3.0" + "@jest/fake-timers" "^24.3.0" + "@jest/types" "^24.3.0" + jest-mock "^24.0.0" + jest-util "^24.0.0" + jsdom "^14.1.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.0.0, jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@24.9.0, jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.0.0, jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watch-typeahead@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a" + integrity sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.1" + jest-regex-util "^24.9.0" + jest-watcher "^24.3.0" + slash "^3.0.0" + string-length "^3.1.0" + strip-ansi "^5.0.0" + +jest-watcher@^24.3.0, jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" + integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsdom@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" + integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== + dependencies: + abab "^2.0.0" + acorn "^6.0.4" + acorn-globals "^4.3.0" + array-equal "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.0" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.1.3" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.5" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^2.5.0" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^6.1.2" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + integrity sha1-tje9O6nqvhIsg+lyBIOusQ0skEo= + dependencies: + string-convert "^0.2.0" + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" + integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" + integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== + dependencies: + array-includes "^3.0.3" + object.assign "^4.1.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +less-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-6.2.0.tgz#8b26f621c155b342eefc24f5bd6e9dc40c42a719" + integrity sha512-Cl5h95/Pz/PWub/tCBgT1oNMFeH1WTD33piG80jn5jr12T4XbxZcjThwNXDQ7AG649WEynuIzO4b0+2Tn9Qolg== + dependencies: + clone "^2.1.2" + less "^3.11.3" + loader-utils "^2.0.0" + schema-utils "^2.7.0" + +less@^3.11.3: + version "3.12.2" + resolved "https://registry.yarnpkg.com/less/-/less-3.12.2.tgz#157e6dd32a68869df8859314ad38e70211af3ab4" + integrity sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q== + dependencies: + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + native-request "^1.0.5" + source-map "~0.6.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-fs-cache@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086" + integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw== + dependencies: + find-cache-dir "^0.1.1" + mkdirp "0.5.1" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.flow@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.4.0, lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lodash@^4.17.19: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + +loglevel@^1.6.8: + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" + integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + dependencies: + tslib "^1.10.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" + integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + dependencies: + semver "^6.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-deep@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" + integrity sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA== + dependencies: + arr-union "^3.1.0" + clone-deep "^0.2.4" + kind-of "^3.0.2" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" + integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +mini-store@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/mini-store/-/mini-store-3.0.6.tgz#44b86be5b2877271224ce0689b3a35a2dffb1ca9" + integrity sha512-YzffKHbYsMQGUWQRKdsearR79QsMzzJcDDmZKlJBqt5JNkqpyJHYlK6gP61O36X+sLf76sO9G6mhKBe83gIZIQ== + dependencies: + hoist-non-react-statics "^3.3.2" + shallowequal "^1.0.2" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" + integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" + integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + dependencies: + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" + integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== + dependencies: + minimist "^1.2.5" + +mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +moment@^2.24.0, moment@^2.25.3: + version "2.27.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" + integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +native-request@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.0.7.tgz#ff742dc555b4c8f2f1c14b548639ba174e573856" + integrity sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" + integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== + dependencies: + lower-case "^2.0.1" + tslib "^1.10.0" + +node-forge@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-releases@^1.1.52: + version "1.1.52" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" + integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== + dependencies: + semver "^6.3.0" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +nth-check@^1.0.2, nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +nwsapi@^2.0.7, nwsapi@^2.1.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" + integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.1.0, object.entries@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" + integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.fromentries@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +omit.js@^2.0.0, omit.js@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/omit.js/-/omit.js-2.0.2.tgz#dd9b8436fab947a5f3ff214cb2538631e313ec2f" + integrity sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +open@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48" + integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1, optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" + integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== + dependencies: + dot-case "^3.0.3" + tslib "^1.10.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" + integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.7: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@3.1.0, pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-browser-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== + dependencies: + postcss "^7" + +postcss-calc@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-flexbugs-fixes@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20" + integrity sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA== + dependencies: + postcss "^7.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" + integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-scope@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" + integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== + dependencies: + "@csstools/normalize.css" "^10.1.0" + browserslist "^4.6.2" + postcss "^7.0.17" + postcss-browser-comments "^3.0.0" + sanitize.css "^10.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-safe-parser@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea" + integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ== + dependencies: + postcss "^7.0.0" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" + integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +pretty-bytes@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" + integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== + +pretty-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^25.1.0, pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.4" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +raf@^3.4.0, raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc-align@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.1.tgz#0566de141a82d9a1923b7672c70bdb19dcde6e23" + integrity sha512-RQ5Fhxl0LW+zsxbY8dxAcpXdaHkHH2jzRSSpvBTS7G9LMK3T+WRcn4ovjg/eqAESM6TdTx0hfqWF2S1pO75jxQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + dom-align "^1.7.0" + rc-util "^5.0.1" + resize-observer-polyfill "^1.5.1" + +rc-animate@3.x, rc-animate@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-3.1.0.tgz#051b689c2c7194e4c8ae016d32a0e5f9de6c8baa" + integrity sha512-8FsM+3B1H+0AyTyGggY6JyVldHTs1CyYT8CfTmG/nGHHXlecvSLeICJhcKgRLjUiQlctNnRtB1rwz79cvBVmrw== + dependencies: + "@ant-design/css-animation" "^1.7.2" + classnames "^2.2.6" + raf "^3.4.0" + rc-util "^5.0.1" + +rc-cascader@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-1.3.0.tgz#67925c7ac4b732fe06cabb3a9c91631c96d04ccf" + integrity sha512-wayuMo/dSZixvdpiRFZB4Q6A3omKRXQcJ3CxN02+PNiTEcRnK2KDqKUzrx7GwgMsyH5tz90lUZ91lLaEPNFv0A== + dependencies: + array-tree-filter "^2.1.0" + rc-trigger "^4.0.0" + rc-util "^5.0.1" + warning "^4.0.1" + +rc-checkbox@~2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-2.3.1.tgz#2a61bc43017c783bd2e9f1a67553bf8efe7aa4d3" + integrity sha512-i290/iTqmZ0WtI2UPIryqT9rW6O99+an4KeZIyZDH3r+Jbb6YdddaWNdzq7g5m9zaNhJvgjf//wJtC4fvve2Tg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + +rc-collapse@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-2.0.0.tgz#08c5942f82005b4342ced02d983581e4c41cd324" + integrity sha512-R5+Ge1uzwK9G1wZPRPhqQsed4FXTDmU0BKzsqfNBtZdk/wd+yey8ZutmJmSozYc5hQwjPkCvJHV7gOIRZKIlJg== + dependencies: + "@ant-design/css-animation" "^1.7.2" + classnames "2.x" + rc-animate "3.x" + react-is "^16.7.0" + shallowequal "^1.1.0" + +rc-dialog@~8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.1.0.tgz#393910963bb05ac19d6d136620bd09622f1d677a" + integrity sha512-vMVAtyxpnokh/okFcDQVLO6ymIXfoTKYKtqJ/hMtf+0WcvRn4VgVDBvGyEk5zd94k0RgwEze9o2kGw8SyjivZg== + dependencies: + rc-animate "3.x" + rc-util "^5.0.1" + +rc-drawer@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-4.1.0.tgz#d7bf0bc030300b62d282bc04e053b9acad6b08b4" + integrity sha512-kjeQFngPjdzAFahNIV0EvEBoIKMOnvUsAxpkSPELoD/1DuR4nLafom5ryma+TIxGwkFJ92W6yjsMi1U9aiOTeQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-util "^5.0.1" + +rc-dropdown@^3.1.0, rc-dropdown@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-3.1.2.tgz#5199bd532ac8519813a347d194ab4b0cee702333" + integrity sha512-s2W5jqvjTid5DxotGO5FlTBaQWeB+Bu7McQgjB8Ot3Wbl72AIKwLf11+lgbV4mA2vWC1H8DKyn6SW9TKLTi0xg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-trigger "^4.0.0" + +rc-field-form@~1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.8.1.tgz#ddb5b34cce498b11a3ad9dbfe2eb8e18539cb7e9" + integrity sha512-OAMFhS+92+4o7Y0WyTfQ6E5EdBk7z7vEXf4dL5CpoZU2OEHv/INZP1xts2AIKNVOBligG/WcfMTuk+GvbyVsnA== + dependencies: + "@babel/runtime" "^7.8.4" + async-validator "^3.0.3" + rc-util "^5.0.0" + +rc-input-number@~6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-6.0.0.tgz#0c0af57c8183f3ca6b87f7edf6fed3bd5a3ba16f" + integrity sha512-vbe+g7HvR/joknSnvLkBTi9N9I+LsV4kljfuog8WNiS7OAF3aEN0QcHSOQ4+xk6+Hx9P1tU63z2+TyEx8W/j2Q== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.0.1" + +rc-mentions@~1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.4.1.tgz#01fbfc6aa885ce26c480380c3a397a9901f456ab" + integrity sha512-MraFCsXlorfUj4/VUjRnITAnBzhM0gMH+2yj/3jmS5rIj0NjNJoTXyEUW3gTJxnw9DP22IMccMTdP3Fjz/2UgQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-menu "^8.0.1" + rc-textarea "^0.3.0" + rc-trigger "^4.3.0" + rc-util "^5.0.1" + +rc-menu@^8.0.1, rc-menu@^8.2.1, rc-menu@~8.5.2: + version "8.5.2" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-8.5.2.tgz#fa43bccabfcf422b9d3cdfcae5b71da08bab7e54" + integrity sha512-GPtr7qoCynVEkFgco/9cW0z/xU33GV89Q6r8FgEkrdhaQSJzuSC+v8pv+Bll5fVGQlJyJgOVqiKk7l2Knk1jYg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + mini-store "^3.0.1" + omit.js "^2.0.0" + rc-motion "^1.0.1" + rc-trigger "^4.4.0" + rc-util "^5.0.1" + resize-observer-polyfill "^1.5.0" + shallowequal "^1.1.0" + +rc-motion@^1.0.0, rc-motion@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-1.0.2.tgz#b8aec288642298d74ddc9ac1773e1b600aaa1c25" + integrity sha512-FDmC9ZdzsXerlTZ+YLu+l5erjkMU98s85SFHdQac+pMy6zQ10RuON6Ntv3ZwP0+qY/YlIsK+0uMXIWOJ9LaLIg== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + raf "^3.4.1" + rc-util "^5.0.6" + +rc-notification@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-4.4.0.tgz#192d082cd6e2995705f43c6929162631c71e3db1" + integrity sha512-IDeNAFGVeOsy1tv4zNVqMAXB9tianR80ewQbtObaAQfjwAjWfONdqdyjFkEU6nc6UQhSUYA5OcTGb7kwwbnh0g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-animate "3.x" + rc-util "^5.0.1" + +rc-pagination@~2.4.5: + version "2.4.6" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-2.4.6.tgz#cc030c9693c730b43592bdb6974fb32c1502a500" + integrity sha512-1ykd3Jti+JuOFdzEFXGfVpkuH+hKxLYz3FKV6BSwnnWXLr9Y8bbm7YiTSwBmdDcOg6tinH8b4IYaKzxBWRC6EA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + +rc-picker@~1.15.1: + version "1.15.3" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-1.15.3.tgz#e4379e6fed9a29f0c1705115d11d196625096b83" + integrity sha512-+VfzcsZui6oOOA0W44qQ7TRC28FUCLrZLjowwyouJKMjvU4HtKdDlSMTJHZNvBbfQoAfED4+mzUG2xtcdW7M+g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + date-fns "^2.15.0" + dayjs "^1.8.30" + moment "^2.24.0" + rc-trigger "^4.0.0" + rc-util "^5.0.1" + react "^16.0.0" + shallowequal "^1.1.0" + +rc-progress@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.0.0.tgz#cea324ce8fc31421cd815d94a4649a8a29f8f8db" + integrity sha512-dQv1KU3o6Vay604FMYMF4S0x4GNXAgXf1tbQ1QoxeIeQt4d5fUeB7Ri82YPu+G+aRvH/AtxYAlEcnxyVZ1/4Hw== + dependencies: + classnames "^2.2.6" + +rc-rate@~2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.8.2.tgz#d82d237d74fd4aef3e0581d2700b646cdd1cd8a2" + integrity sha512-f9T/D+ZwWQrWHkpidpQbnXpnVMGMC4eSRAkwuu88a8Qv1C/9LNc4AErazoh8tpnZBFqq19F3j0Glv+sDgkfEig== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.0.1" + +rc-resize-observer@^0.2.0, rc-resize-observer@^0.2.1, rc-resize-observer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-0.2.3.tgz#8268284d1766d163240b1682661ae7b59bc4523d" + integrity sha512-dEPCGX15eRRnu+TNBIGyEghpzE24fTDW8pHdJPJS/kCR3lafFqBLqKzBgZW6pMUuM70/ZDyFQ0Kynx9kWsXRNw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.0.0" + resize-observer-polyfill "^1.5.1" + +rc-select@^11.1.1: + version "11.1.3" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-11.1.3.tgz#acb6436e0ec389e1676903d9b514aa0d7565dbeb" + integrity sha512-Mf/EiYFmdWOoOget6RacSz1uAfn0hxf3wOa/YSOf7bw70EH6s80biDHQ4WPk8hNMxVRhzojlkktgmN4YxNQisQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^1.0.1" + rc-trigger "^4.3.0" + rc-util "^5.0.1" + rc-virtual-list "^1.1.2" + warning "^4.0.3" + +rc-select@~11.0.12: + version "11.0.13" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-11.0.13.tgz#fe5718af819d3e0bc12a55334bc1717257ef2dac" + integrity sha512-4/GDmBkGnDhYre3Dvq5UkIRXQJW8hbGdpdH8SjquSbCktAVitYV+opd/lKI28qMcBxCgjOHgYXwZ18TF+kP2VQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^1.0.1" + rc-trigger "^4.3.0" + rc-util "^5.0.1" + rc-virtual-list "^1.1.2" + warning "^4.0.3" + +rc-slider@~9.3.0: + version "9.3.1" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.3.1.tgz#444012f3b4847d592b167a9cee6a1a46779a6ef4" + integrity sha512-c52PWPyrfJWh28K6dixAm0906L3/4MUIxqrNQA4TLnC/Z+cBNycWJUZoJerpwSOE1HdM3XDwixCsmtFc/7aWlQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-tooltip "^4.0.0" + rc-util "^5.0.0" + shallowequal "^1.1.0" + +rc-steps@~4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-4.1.2.tgz#370f4c6b40d3888f03b271f1628953c66eb91c04" + integrity sha512-kTPiojPtJi12Y7whRqlydRgJXQ1u9JlvGchI6xDrmOMZVpCTLpfc/18iu+aHCtCZaSnM2ENU/9lfm/naWVFcRw== + dependencies: + "@babel/runtime" "^7.10.2" + classnames "^2.2.3" + rc-util "^5.0.1" + +rc-switch@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-3.2.0.tgz#aa36bb417409ff4cc7d542ec4381cb5d87cfedc1" + integrity sha512-WQZnRrWZ+KGh4Cd98FpP1ZgvMmebctoHzKAO2n1Xsry1FQBSGgIw4rQJRxET31VS/dR1LIKb5md/k0UzcXXc0g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.0.1" + +rc-table@~7.8.0: + version "7.8.6" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.8.6.tgz#897fb1671c62eb3a46033b53f0690fa0fd65dc61" + integrity sha512-rHRStVTO6FYlxs5Bk9S56Vo/Jn7pX3hOtHTHP+Vu++i9SF7DroOReMIi+OJ7RA9n3jVBxyT/9+NESXgTFvPbYA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + raf "^3.4.1" + rc-resize-observer "^0.2.0" + rc-util "^5.0.0" + shallowequal "^1.1.0" + +rc-tabs@~11.5.0: + version "11.5.6" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.5.6.tgz#bcff03f8c8dcc08b57ca97c0debe5d9fa3373957" + integrity sha512-Q2wqnt66SFksGXxNARLqGNMYIFH3KSm48+hMc4tq6qhgpsW104dedHcM86NUyqsQcvYWWiceUNu3TSnbe+XZnw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + raf "^3.4.1" + rc-dropdown "^3.1.0" + rc-menu "^8.2.1" + rc-resize-observer "^0.2.1" + rc-trigger "^4.2.1" + rc-util "^5.0.0" + +rc-textarea@^0.3.0, rc-textarea@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-0.3.0.tgz#9860ef797e00717d8227d1ef4ee7895dd9358ddf" + integrity sha512-vrTPkPT6wrO7EI8ouLFZZLXA1pFVrVRCnkmyyf0yRComFbcH1ogmFEGu85CjVT96rQqAiQFOe0QV3nKopZOJow== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + omit.js "^2.0.0" + rc-resize-observer "^0.2.3" + +rc-tooltip@^4.0.0, rc-tooltip@~4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-4.2.1.tgz#c1a2d5017ee03a771a9301c0dfdb46dfdf8fef94" + integrity sha512-oykuaGsHg7RFvPUaxUpxo7ScEqtH61C66x4JUmjlFlSS8gSx2L8JFtfwM1D68SLBxUqGqJObtxj4TED75gQTiA== + dependencies: + rc-trigger "^4.2.1" + +rc-tree-select@~4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.1.1.tgz#2d3c61f2449de72839eddf94ab876d3f6567692f" + integrity sha512-pawxt/W1chLpjtAEQe8mXI9C9DYNMGS/BR6eBmOY8cJDK6OWSa6M88S6F0jXc+A10D/CLfHAfF1ZIj7VGse+5Q== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-select "^11.1.1" + rc-tree "^3.8.0" + rc-util "^5.0.5" + +rc-tree@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.9.0.tgz#89de29a8ea5692447d01bbbda8931bd6b3e9b2e1" + integrity sha512-TYvIq2SKdVugS2mdOGC++CNWjj1VDBws4JZkFOAJVQfXFWg+BNW4rhuTzAs4ZY3KiE+1xG0u5cOVvIPr7qkxCA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^1.0.0" + rc-util "^5.0.0" + rc-virtual-list "^1.1.0" + +rc-tree@~3.8.5: + version "3.8.5" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.8.5.tgz#1f6d8c14a4f9263d5a426f7a24703a4c7be46ea3" + integrity sha512-audXUWwxyGB/4rLI4v+KuVucbc74y5t10XYQlR5WUe1J0sQuxP19+5GTb6DgrGXPxWOC6mxmkiw/xsKissE0GA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^1.0.0" + rc-util "^5.0.0" + rc-virtual-list "^1.1.0" + +rc-trigger@^4.0.0, rc-trigger@^4.2.1, rc-trigger@^4.3.0, rc-trigger@^4.4.0, rc-trigger@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-4.4.0.tgz#52be45c7b40327b297ebacff84d69ce9285606bc" + integrity sha512-09562wc5I1JUbCdWohcFYJeLTpjKjEqH+0lY7plDtyI9yFXRngrvmqsrSJyT6Nat+C35ymD7fhwCCPq3cfUI4g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + raf "^3.4.1" + rc-align "^4.0.0" + rc-motion "^1.0.0" + rc-util "^5.0.1" + +rc-upload@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-3.2.0.tgz#251fc3c9105902e808600a414f368f285d63bfba" + integrity sha512-/vyOGVxl5QVM3ZE7s+GqYPbCLC/Q/vJq0sjdwnvJw01KvAR5kVOC4jbHEaU56dMss7PFGDfNzc8zO5bWYLDzVQ== + dependencies: + classnames "^2.2.5" + +rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.5, rc-util@^5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.0.6.tgz#2b828bc87a818a66384b813f76a561ad4609e9b0" + integrity sha512-uLGxF9WjbpJSjd6iDnIjl8ZeMUglpcuh1DwO26aaXh++yAmlB6eIAJMUwwJCuqJvo4quCvsDPg1VkqHILc4U0A== + dependencies: + react-is "^16.12.0" + shallowequal "^1.1.0" + +rc-virtual-list@^1.1.0, rc-virtual-list@^1.1.2: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-1.1.6.tgz#b255baf9aacde149a8893324e6307214094f4c0a" + integrity sha512-u3+izqWL8p8bQy8nYH48qWpiGyxR/ye8D2k0zJlXmfYeL55/xh83YrzHqiDzO78uj0Ewag3nXDA0JTVrYO7ygQ== + dependencies: + classnames "^2.2.6" + raf "^3.4.1" + rc-util "^5.0.0" + +react-app-polyfill@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0" + integrity sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g== + dependencies: + core-js "^3.5.0" + object-assign "^4.1.1" + promise "^8.0.3" + raf "^3.4.1" + regenerator-runtime "^0.13.3" + whatwg-fetch "^3.0.0" + +react-app-rewired@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/react-app-rewired/-/react-app-rewired-2.1.6.tgz#33ee3076a7f34d6a7c94e649cac67e7c8c580de8" + integrity sha512-06flj0kK5tf/RN4naRv/sn6j3sQd7rsURoRLKLpffXDzJeNiAaTNic+0I8Basojy5WDwREkTqrMLewSAjcb13w== + dependencies: + semver "^5.6.0" + +react-dev-utils@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" + integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== + dependencies: + "@babel/code-frame" "7.8.3" + address "1.1.2" + browserslist "4.10.0" + chalk "2.4.2" + cross-spawn "7.0.1" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.0.1" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "3.1.1" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.1.1" + immer "1.10.0" + inquirer "7.0.4" + is-root "2.1.0" + loader-utils "1.2.3" + open "^7.0.2" + pkg-up "3.1.0" + react-error-overlay "^6.0.7" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + +react-dom@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" + integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-error-overlay@^6.0.7: + version "6.0.7" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" + integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== + +react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-router-dom@^6.0.0-beta.0: + version "6.0.0-beta.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.0.0-beta.0.tgz#9dcc8555365f22f7fbd09f26b6b82543f3eb97d6" + integrity sha512-36yNNGMT8RB9FRPL9nKJi6HKDkgOakU+o/2hHpSzR6e37gN70MpOU6QQlmif4oAWWBwjyGc3ZNOMFCsFuHUY5w== + dependencies: + prop-types "^15.7.2" + react-router "6.0.0-beta.0" + +react-router@6.0.0-beta.0: + version "6.0.0-beta.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.0.0-beta.0.tgz#3e11f39b6ded4412c2fed9e4f989dd4c8156724d" + integrity sha512-VgMdfpVcmFQki/LZuLh8E/MNACekDetz4xqft+a6fBZvvJnVqKbLqebF7hyoawGrV1HcO5tVaUang2Og4W2j1Q== + dependencies: + prop-types "^15.7.2" + +react-scripts@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.2.tgz#6418f396ade1932b408ff5636c080201b1453b37" + integrity sha512-dTeydv5tiCBM9BJgARQQ4cbHU2TlFmA4iIagDa5ZWnPUPqvk5UWaTXjeY+Sp0ySv9dA2qqDLQ4TytGJdsWhOuA== + dependencies: + "@babel/core" "7.9.0" + "@svgr/webpack" "4.3.3" + "@typescript-eslint/eslint-plugin" "^2.10.0" + "@typescript-eslint/parser" "^2.10.0" + babel-eslint "10.1.0" + babel-jest "^24.9.0" + babel-loader "8.1.0" + babel-plugin-named-asset-import "^0.3.6" + babel-preset-react-app "^9.1.2" + camelcase "^5.3.1" + case-sensitive-paths-webpack-plugin "2.3.0" + css-loader "3.4.2" + dotenv "8.2.0" + dotenv-expand "5.1.0" + eslint "^6.6.0" + eslint-config-react-app "^5.2.1" + eslint-loader "3.0.3" + eslint-plugin-flowtype "4.6.0" + eslint-plugin-import "2.20.1" + eslint-plugin-jsx-a11y "6.2.3" + eslint-plugin-react "7.19.0" + eslint-plugin-react-hooks "^1.6.1" + file-loader "4.3.0" + fs-extra "^8.1.0" + html-webpack-plugin "4.0.0-beta.11" + identity-obj-proxy "3.0.0" + jest "24.9.0" + jest-environment-jsdom-fourteen "1.0.1" + jest-resolve "24.9.0" + jest-watch-typeahead "0.4.2" + mini-css-extract-plugin "0.9.0" + optimize-css-assets-webpack-plugin "5.0.3" + pnp-webpack-plugin "1.6.4" + postcss-flexbugs-fixes "4.1.0" + postcss-loader "3.0.0" + postcss-normalize "8.0.1" + postcss-preset-env "6.7.0" + postcss-safe-parser "4.0.1" + react-app-polyfill "^1.0.6" + react-dev-utils "^10.2.1" + resolve "1.15.0" + resolve-url-loader "3.1.1" + sass-loader "8.0.2" + semver "6.3.0" + style-loader "0.23.1" + terser-webpack-plugin "2.3.5" + ts-pnp "1.1.6" + url-loader "2.3.0" + webpack "4.42.0" + webpack-dev-server "3.11.0" + webpack-manifest-plugin "2.2.0" + workbox-webpack-plugin "4.3.1" + optionalDependencies: + fsevents "2.1.2" + +react@^16.0.0, react@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@2.2.10: + version "2.2.10" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" + integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" + integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0, request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url-loader@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" + integrity sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ== + dependencies: + adjust-sourcemap-loader "2.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" + integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== + dependencies: + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize.css@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" + integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== + +sass-loader@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" + integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +schema-utils@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +screenfull@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.0.2.tgz#b9acdcf1ec676a948674df5cd0ff66b902b0bed7" + integrity sha512-cCF2b+L/mnEiORLN5xSAz6H3t18i2oHh9BA8+CQlAh5DRw2+NFAGQJOSYbcGw8B2k04g/lVvFcfZ83b3ysH5UQ== + +scroll-into-view-if-needed@^2.2.25: + version "2.2.25" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.25.tgz#117b7bc7c61bc7a2b7872a0984bc73a19bc6e961" + integrity sha512-C8RKJPq9lK7eubwGpLbUkw3lklcG3Ndjmea2PyauzrA0i4DPlzAmVMGxaZrBFqCrVLfvJmP80IyHnv4jxvg1OQ== + dependencies: + compute-scroll-into-view "^1.0.14" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + dependencies: + node-forge "0.9.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@6.3.0, semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.0.2, shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.4.0" + websocket-driver "0.6.5" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + integrity sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-length@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== + dependencies: + astral-regex "^1.0.0" + strip-ansi "^5.2.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-comments@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== + dependencies: + babel-extract-comments "^1.0.0" + babel-plugin-transform-object-rest-spread "^6.26.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +style-loader@0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +svg-parser@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.0.0, svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +terser-webpack-plugin@2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" + integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.2.0" + jest-worker "^25.1.0" + p-limit "^2.2.2" + schema-utils "^2.6.4" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.4.3" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: + version "4.6.7" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" + integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +text-table@0.2.0, text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tinycolor2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" + integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +ts-pnp@1.1.6, ts-pnp@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" + integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ== + +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@~3.7.2: + version "3.7.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" + integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqid@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-5.2.0.tgz#0d0589a7e9ce07116848126764fbff0b68e74329" + integrity sha512-LH8zsvwJ/GL6YtNfSOmMCrI9piraAUjBfw2MCvleNE6a4pVKJwXjG2+HWhkVeFcSg+nmaPKbMrMOoxwQluZ1Mg== + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" + integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog== + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.0" + +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +wait-for-expect@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463" + integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag== + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +warning@^4.0.1, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.20" + sockjs-client "1.4.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-manifest-plugin@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== + dependencies: + fs-extra "^7.0.0" + lodash ">=3.5 <5" + object.entries "^1.1.0" + tapable "^1.0.0" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.42.0: + version "4.42.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +websocket-driver@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + dependencies: + websocket-extensions ">=0.1.1" + +websocket-driver@>=0.5.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + dependencies: + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.0, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-background-sync@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" + integrity sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg== + dependencies: + workbox-core "^4.3.1" + +workbox-broadcast-update@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" + integrity sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA== + dependencies: + workbox-core "^4.3.1" + +workbox-build@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" + integrity sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw== + dependencies: + "@babel/runtime" "^7.3.4" + "@hapi/joi" "^15.0.0" + common-tags "^1.8.0" + fs-extra "^4.0.2" + glob "^7.1.3" + lodash.template "^4.4.0" + pretty-bytes "^5.1.0" + stringify-object "^3.3.0" + strip-comments "^1.0.2" + workbox-background-sync "^4.3.1" + workbox-broadcast-update "^4.3.1" + workbox-cacheable-response "^4.3.1" + workbox-core "^4.3.1" + workbox-expiration "^4.3.1" + workbox-google-analytics "^4.3.1" + workbox-navigation-preload "^4.3.1" + workbox-precaching "^4.3.1" + workbox-range-requests "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + workbox-streams "^4.3.1" + workbox-sw "^4.3.1" + workbox-window "^4.3.1" + +workbox-cacheable-response@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" + integrity sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw== + dependencies: + workbox-core "^4.3.1" + +workbox-core@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" + integrity sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg== + +workbox-expiration@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" + integrity sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw== + dependencies: + workbox-core "^4.3.1" + +workbox-google-analytics@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" + integrity sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg== + dependencies: + workbox-background-sync "^4.3.1" + workbox-core "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + +workbox-navigation-preload@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" + integrity sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw== + dependencies: + workbox-core "^4.3.1" + +workbox-precaching@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" + integrity sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ== + dependencies: + workbox-core "^4.3.1" + +workbox-range-requests@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" + integrity sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA== + dependencies: + workbox-core "^4.3.1" + +workbox-routing@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" + integrity sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g== + dependencies: + workbox-core "^4.3.1" + +workbox-strategies@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" + integrity sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw== + dependencies: + workbox-core "^4.3.1" + +workbox-streams@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" + integrity sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA== + dependencies: + workbox-core "^4.3.1" + +workbox-sw@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" + integrity sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w== + +workbox-webpack-plugin@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd" + integrity sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ== + dependencies: + "@babel/runtime" "^7.0.0" + json-stable-stringify "^1.0.1" + workbox-build "^4.3.1" + +workbox-window@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" + integrity sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg== + dependencies: + workbox-core "^4.3.1" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.1.2, ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xregexp@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" + integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== + dependencies: + "@babel/runtime-corejs3" "^7.8.3" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yaml@^1.7.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.2.tgz#a29c03f578faafd57dcb27055f9a5d569cb0c3d9" + integrity sha512-omakb0d7FjMo3R1D2EbTKVIk6dAVLRxFXdLZMEUToeAvuqgG/YuHMuQOZ5fgk+vQ8cx+cnGKwyg+8g8PNT0xQg== + dependencies: + "@babel/runtime" "^7.8.7" + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.0, yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" From 247f5326208c473f49174b2ded9602867250b8f2 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 12:15:09 +0800 Subject: [PATCH 010/126] list cluster frontend --- web-ui/src/App.tsx | 9 ++--- web-ui/src/components/Root.tsx | 8 +++++ web-ui/src/pages/Clusters/index.tsx | 32 +++++++++++++++++ web-ui/src/pages/Deployment/index.tsx | 5 +-- web-ui/src/pages/Machines/index.tsx | 5 +-- web-ui/src/utils/api.ts | 13 +++++++ web-ui/src/utils/request.ts | 49 +++++++++++++++++++++++++++ 7 files changed, 111 insertions(+), 10 deletions(-) create mode 100644 web-ui/src/components/Root.tsx create mode 100644 web-ui/src/pages/Clusters/index.tsx create mode 100644 web-ui/src/utils/api.ts create mode 100644 web-ui/src/utils/request.ts diff --git a/web-ui/src/App.tsx b/web-ui/src/App.tsx index 86cb49f6ae..3a45f3ee44 100644 --- a/web-ui/src/App.tsx +++ b/web-ui/src/App.tsx @@ -15,15 +15,12 @@ import { import MachinesPage from './pages/Machines' import DeploymentPage from './pages/Deployment' +import ClustersPage from './pages/Clusters' import './App.less' const { Sider, Content } = Layout -function Clusters() { - return
Clusters
-} - function SiderMenu() { return ( @@ -47,12 +44,12 @@ function App() { - + } /> } /> } /> - } /> + } /> diff --git a/web-ui/src/components/Root.tsx b/web-ui/src/components/Root.tsx new file mode 100644 index 0000000000..ec881ddab9 --- /dev/null +++ b/web-ui/src/components/Root.tsx @@ -0,0 +1,8 @@ +import React, { ReactNode } from 'react' + +export interface IRootProps { + children?: ReactNode +} +export function Root({ children }: IRootProps) { + return
{children}
+} diff --git a/web-ui/src/pages/Clusters/index.tsx b/web-ui/src/pages/Clusters/index.tsx new file mode 100644 index 0000000000..97dc38615f --- /dev/null +++ b/web-ui/src/pages/Clusters/index.tsx @@ -0,0 +1,32 @@ +import React, { useState, useEffect } from 'react' +import { Layout, Menu } from 'antd' +import { NavLink } from 'react-router-dom' +import { getClusterList } from '../../utils/api' +import { Root } from '../../components/Root' + +export default function ClustersPage() { + const [clustersList, setClustersList] = useState([]) + + useEffect(() => { + getClusterList().then((res) => { + setClustersList(res.data || []) + }) + }, []) + + return ( + + + + {clustersList.map((clsuter) => ( + + {clsuter} + + ))} + + + + + + + ) +} diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index dbd1c7ad2d..80d7b9ec52 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -25,6 +25,7 @@ import DeploymentTable, { } from './DeploymentTable' import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' +import { Root } from '../../components/Root' // TODO: fetch from API const TIDB_VERSIONS = [ @@ -170,7 +171,7 @@ export default function DeploymentPage() { } return ( -
+
-
+ ) } diff --git a/web-ui/src/pages/Machines/index.tsx b/web-ui/src/pages/Machines/index.tsx index 69eb5c4a93..e755906be5 100644 --- a/web-ui/src/pages/Machines/index.tsx +++ b/web-ui/src/pages/Machines/index.tsx @@ -5,6 +5,7 @@ import { useLocalStorageState } from 'ahooks' import MachineForm, { IMachine } from './MachineForm' import MachinesTable from './MachinesTable' import { IComponent } from '../Deployment/DeploymentTable' +import { Root } from '../../components/Root' export default function MachinesPage() { const [showForm, setShowForm] = useState(false) @@ -100,7 +101,7 @@ export default function MachinesPage() { ) return ( -
+
+ ) } diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts new file mode 100644 index 0000000000..ec4162dba2 --- /dev/null +++ b/web-ui/src/utils/api.ts @@ -0,0 +1,13 @@ +import request from './request' + +const API_URL = 'http://127.0.0.1:8080/api' + +function fullUrl(path: string): string { + return `${API_URL}/${path}` +} + +//////////////////// + +export function getClusterList() { + return request(fullUrl('clusters')) +} diff --git a/web-ui/src/utils/request.ts b/web-ui/src/utils/request.ts new file mode 100644 index 0000000000..4bed73e995 --- /dev/null +++ b/web-ui/src/utils/request.ts @@ -0,0 +1,49 @@ +import { message } from 'antd' + +export type ResError = Error & { + response?: any +} + +export default function request( + url: string, + method?: 'GET' | 'POST' | 'PUT' | 'DELETE', + body?: object, + options?: RequestInit +) { + const opts: RequestInit = { + ...options, + method: method || 'GET', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + } + if (body) { + opts.body = JSON.stringify(body) + } + return doFetch(url, opts) +} + +function doFetch(url: string, options: RequestInit) { + return fetch(url, options) + .then(parseResponse) + .then((data) => ({ data, err: undefined })) + .catch((err) => ({ data: undefined, err })) +} + +function parseResponse(response: Response) { + if (response.status === 204) { + return {} as any + } else if (response.status >= 200 && response.status < 300) { + return response.json() + } else { + return response.json().then((resData: any) => { + const errMsg = resData.msg || response.statusText + message.error(errMsg) + + const error: ResError = new Error(errMsg) + error.response = response + throw error + }) + } +} From 2448965f27927c72f885a8da119905978fa83b73 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 12:51:04 +0800 Subject: [PATCH 011/126] show cluster detail --- components/cluster/command/list.go | 3 +- components/dm/command/list.go | 3 +- components/web/main.go | 12 ++++++-- pkg/cluster/manager.go | 27 ++++++++++++++--- web-ui/src/App.tsx | 5 +++- web-ui/src/pages/Clusters/ClusterDetail.tsx | 28 +++++++++++++++++ web-ui/src/pages/Clusters/index.tsx | 33 ++++++++++++++++----- 7 files changed, 94 insertions(+), 17 deletions(-) create mode 100644 web-ui/src/pages/Clusters/ClusterDetail.tsx diff --git a/components/cluster/command/list.go b/components/cluster/command/list.go index 363badb33e..0c0fcdc533 100644 --- a/components/cluster/command/list.go +++ b/components/cluster/command/list.go @@ -22,7 +22,8 @@ func newListCmd() *cobra.Command { Use: "list", Short: "List all clusters", RunE: func(cmd *cobra.Command, args []string) error { - return manager.ListCluster() + _, err := manager.ListCluster() + return err }, } return cmd diff --git a/components/dm/command/list.go b/components/dm/command/list.go index 363badb33e..0c0fcdc533 100644 --- a/components/dm/command/list.go +++ b/components/dm/command/list.go @@ -22,7 +22,8 @@ func newListCmd() *cobra.Command { Use: "list", Short: "List all clusters", RunE: func(cmd *cobra.Command, args []string) error { - return manager.ListCluster() + _, err := manager.ListCluster() + return err }, } return cmd diff --git a/components/web/main.go b/components/web/main.go index e60499fe81..63205b1a5e 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -25,6 +25,7 @@ func main() { router.Use(cors.AllowAll()) api := router.Group("/api") { + api.GET("/clusters", clustersHandler) api.POST("/deploy", deployHandler) } _ = router.Run() @@ -38,8 +39,6 @@ type DeployReq struct { } func deployHandler(c *gin.Context) { - fmt.Println("start to deploy") - var req DeployReq if err := c.ShouldBindJSON(&req); err != nil { _ = c.Error(err) @@ -80,3 +79,12 @@ func deployHandler(c *gin.Context) { "message": "success", }) } + +func clustersHandler(c *gin.Context) { + clusters, err := manager.ListCluster() + if err != nil { + _ = c.Error(err) + return + } + c.JSON(http.StatusOK, clusters) +} diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index d46508bca3..f57803377d 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -172,13 +172,24 @@ func (m *Manager) RestartCluster(clusterName string, options operator.Options) e return nil } +// Cluster represents a clsuter (temp put here) +type Cluster struct { + Name string `json:"name"` + User string `json:"user"` + Version string `json:"version"` + Path string `json:"path"` + PrivateKey string `json:"private_key"` +} + // ListCluster list the clusters. -func (m *Manager) ListCluster() error { +func (m *Manager) ListCluster() ([]Cluster, error) { names, err := m.specManager.List() if err != nil { - return perrs.AddStack(err) + return nil, perrs.AddStack(err) } + var clusters []Cluster = []Cluster{} + clusterTable := [][]string{ // Header {"Name", "User", "Version", "Path", "PrivateKey"}, @@ -187,7 +198,7 @@ func (m *Manager) ListCluster() error { for _, name := range names { metadata, err := m.meta(name) if err != nil && !errors.Is(perrs.Cause(err), meta.ErrValidate) { - return perrs.Trace(err) + return clusters, perrs.Trace(err) } base := metadata.GetBaseMeta() @@ -199,10 +210,18 @@ func (m *Manager) ListCluster() error { m.specManager.Path(name), m.specManager.Path(name, "ssh", "id_rsa"), }) + + clusters = append(clusters, Cluster{ + Name: name, + User: base.User, + Version: base.Version, + Path: m.specManager.Path(name), + PrivateKey: m.specManager.Path(name, "ssh", "id_rsa"), + }) } cliutil.PrintTable(clusterTable, true) - return nil + return clusters, nil } // CleanCluster clean the cluster without destroying it diff --git a/web-ui/src/App.tsx b/web-ui/src/App.tsx index 3a45f3ee44..8349c1106f 100644 --- a/web-ui/src/App.tsx +++ b/web-ui/src/App.tsx @@ -18,6 +18,7 @@ import DeploymentPage from './pages/Deployment' import ClustersPage from './pages/Clusters' import './App.less' +import ClusterDetailPage from './pages/Clusters/ClusterDetail' const { Sider, Content } = Layout @@ -49,7 +50,9 @@ function App() { } /> } /> } /> - } /> + }> + } /> + diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx new file mode 100644 index 0000000000..0b8da78515 --- /dev/null +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -0,0 +1,28 @@ +import React, { useMemo } from 'react' +import { Root } from '../../components/Root' +import { useSessionStorageState } from 'ahooks' +import { ICluster } from '.' +import { useParams } from 'react-router-dom' + +export default function ClusterDetailPage() { + const [clustersList] = useSessionStorageState('clusters', []) + const { clusterName } = useParams() + const cluster = useMemo( + () => clustersList.find((el) => el.name === clusterName), + [clustersList, clusterName] + ) + + return ( + + {cluster && ( + <> +

Name: {cluster.name}

+

User: {cluster.user}

+

Version: {cluster.version}

+

Path: {cluster.path}

+

PrivateKey: {cluster.private_key}

+ + )} +
+ ) +} diff --git a/web-ui/src/pages/Clusters/index.tsx b/web-ui/src/pages/Clusters/index.tsx index 97dc38615f..da9bc5b76f 100644 --- a/web-ui/src/pages/Clusters/index.tsx +++ b/web-ui/src/pages/Clusters/index.tsx @@ -1,16 +1,33 @@ -import React, { useState, useEffect } from 'react' +import React, { useEffect } from 'react' import { Layout, Menu } from 'antd' -import { NavLink } from 'react-router-dom' +import { NavLink, Outlet, useNavigate } from 'react-router-dom' +import { useSessionStorageState } from 'ahooks' import { getClusterList } from '../../utils/api' -import { Root } from '../../components/Root' + +export interface ICluster { + name: string + user: string + version: string + path: string + private_key: string +} export default function ClustersPage() { - const [clustersList, setClustersList] = useState([]) + const [clustersList, setClustersList] = useSessionStorageState( + 'clusters', + [] + ) + const navigate = useNavigate() useEffect(() => { getClusterList().then((res) => { - setClustersList(res.data || []) + const clusters = res.data || [] + setClustersList(clusters) + if (clusters.length > 0) { + navigate(`/clusters/${clusters[0].name}`) + } }) + // eslint-disable-next-line }, []) return ( @@ -18,14 +35,14 @@ export default function ClustersPage() { {clustersList.map((clsuter) => ( - - {clsuter} + + {clsuter.name} ))} - + ) From 79dd9839cd11328e3365650786e7da1da8e72344 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 14:32:22 +0800 Subject: [PATCH 012/126] destroy cluster --- components/web/main.go | 23 ++++++- pkg/cluster/manager.go | 1 - web-ui/src/pages/Clusters/ClusterDetail.tsx | 66 +++++++++++++++++---- web-ui/src/utils/api.ts | 4 ++ web-ui/src/utils/request.ts | 3 +- 5 files changed, 81 insertions(+), 16 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index 63205b1a5e..f4ba74ebd6 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -7,6 +7,7 @@ import ( "github.com/gin-gonic/gin" "github.com/pingcap/tiup/pkg/cluster" + operator "github.com/pingcap/tiup/pkg/cluster/operation" "github.com/pingcap/tiup/pkg/cluster/spec" cors "github.com/rs/cors/wrapper/gin" ) @@ -26,6 +27,7 @@ func main() { api := router.Group("/api") { api.GET("/clusters", clustersHandler) + api.DELETE("/clusters/:clusterName", destroyClusterHandler) api.POST("/deploy", deployHandler) } _ = router.Run() @@ -75,8 +77,9 @@ func deployHandler(c *gin.Context) { false, ) }() + c.JSON(http.StatusOK, gin.H{ - "message": "success", + "message": "ok", }) } @@ -88,3 +91,21 @@ func clustersHandler(c *gin.Context) { } c.JSON(http.StatusOK, clusters) } + +func destroyClusterHandler(c *gin.Context) { + clusterName := c.Param("clusterName") + err := manager.DestroyCluster(clusterName, operator.Options{ + SSHTimeout: 5, + OptTimeout: 120, + APITimeout: 300, + }, operator.Options{}, true) + + if err != nil { + _ = c.Error(err) + return + } + + c.JSON(http.StatusOK, gin.H{ + "message": "ok", + }) +} diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index f57803377d..041713ff52 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -330,7 +330,6 @@ func (m *Manager) DestroyCluster(clusterName string, gOpt operator.Options, dest log.Infof("Destroyed cluster `%s` successfully", clusterName) return nil - } // ExecOptions for exec shell commanm. diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 0b8da78515..775e7e9a9c 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -1,28 +1,70 @@ -import React, { useMemo } from 'react' -import { Root } from '../../components/Root' +import React, { useMemo, useState } from 'react' +import { useParams, useNavigate } from 'react-router-dom' +import { Space, Button, Modal, message } from 'antd' +import { ExclamationCircleOutlined } from '@ant-design/icons' import { useSessionStorageState } from 'ahooks' + +import { deleteCluster } from '../../utils/api' +import { Root } from '../../components/Root' import { ICluster } from '.' -import { useParams } from 'react-router-dom' export default function ClusterDetailPage() { + const navigate = useNavigate() const [clustersList] = useSessionStorageState('clusters', []) const { clusterName } = useParams() const cluster = useMemo( () => clustersList.find((el) => el.name === clusterName), [clustersList, clusterName] ) + const [destroyingCluster, setDestroyingCluster] = useState(false) + + function destroyCluster() { + setDestroyingCluster(true) + deleteCluster(clusterName).then(({ data, err }) => { + setDestroyingCluster(false) + if (data) { + message.success('销毁成功!') + navigate('/') + } else { + message.error(err.message) + } + }) + } + + function handleDestroyCluster() { + Modal.confirm({ + title: `销毁 ${cluster?.name} 集群`, + icon: , + content: '你确定要销毁这个集群吗?所有数据都会清除,操作不可回滚!', + okText: '销毁', + cancelText: '取消', + okButtonProps: { danger: true }, + onOk: () => destroyCluster(), + }) + } + + if (cluster === undefined) { + return + } return ( - {cluster && ( - <> -

Name: {cluster.name}

-

User: {cluster.user}

-

Version: {cluster.version}

-

Path: {cluster.path}

-

PrivateKey: {cluster.private_key}

- - )} + + + +
+

Name: {cluster.name}

+

User: {cluster.user}

+

Version: {cluster.version}

+

Path: {cluster.path}

+

PrivateKey: {cluster.private_key}

+
) } diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts index ec4162dba2..b781c0f833 100644 --- a/web-ui/src/utils/api.ts +++ b/web-ui/src/utils/api.ts @@ -11,3 +11,7 @@ function fullUrl(path: string): string { export function getClusterList() { return request(fullUrl('clusters')) } + +export function deleteCluster(clusterName: string) { + return request(fullUrl(`clusters/${clusterName}`), 'DELETE') +} diff --git a/web-ui/src/utils/request.ts b/web-ui/src/utils/request.ts index 4bed73e995..80c0e20131 100644 --- a/web-ui/src/utils/request.ts +++ b/web-ui/src/utils/request.ts @@ -39,8 +39,7 @@ function parseResponse(response: Response) { } else { return response.json().then((resData: any) => { const errMsg = resData.msg || response.statusText - message.error(errMsg) - + // message.error(errMsg) const error: ResError = new Error(errMsg) error.response = response throw error From 48325fa8e84fba436acfa6e8610ec114682a4ee0 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 16:10:51 +0800 Subject: [PATCH 013/126] deploy status --- components/web/main.go | 7 ++ pkg/cluster/manager.go | 82 ++++++++++++++++--- .../src/pages/Deployment/DeploymentStatus.tsx | 51 ++++++++++++ web-ui/src/pages/Deployment/index.tsx | 38 ++++++++- web-ui/src/utils/api.ts | 4 + 5 files changed, 169 insertions(+), 13 deletions(-) create mode 100644 web-ui/src/pages/Deployment/DeploymentStatus.tsx diff --git a/components/web/main.go b/components/web/main.go index f4ba74ebd6..49a38c2d19 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -28,7 +28,9 @@ func main() { { api.GET("/clusters", clustersHandler) api.DELETE("/clusters/:clusterName", destroyClusterHandler) + api.POST("/deploy", deployHandler) + api.GET("/deploy_status", deployStatusHandler) } _ = router.Run() } @@ -83,6 +85,11 @@ func deployHandler(c *gin.Context) { }) } +func deployStatusHandler(c *gin.Context) { + status := manager.GetDeployStatus() + c.JSON(http.StatusOK, status) +} + func clustersHandler(c *gin.Context) { clusters, err := manager.ListCluster() if err != nil { diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 041713ff52..acbdac5505 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -51,8 +51,20 @@ var ( errNSRename = errorx.NewNamespace("rename") errorRenameNameNotExist = errNSRename.NewType("name_not_exist", errutil.ErrTraitPreCheck) errorRenameNameDuplicate = errNSRename.NewType("name_dup", errutil.ErrTraitPreCheck) + + // TODO: use map to save map[string]DeployingInfo, the key is clusterName + deployingInfo DeployingInfo = DeployingInfo{} ) +// DeployingInfo records current deploying task and related info +type DeployingInfo struct { + // save last deploying task + deploying bool + clusterName string + curTask *task.Serial + err error +} + // Manager to deploy a cluster. type Manager struct { sysName string @@ -918,20 +930,28 @@ func (m *Manager) Deploy( sshTimeout int64, nativeSSH bool, ) error { + // reset + deployingInfo = DeployingInfo{clusterName: clusterName} + if err := clusterutil.ValidateClusterNameOrError(clusterName); err != nil { + deployingInfo.err = err return err } exist, err := m.specManager.Exist(clusterName) if err != nil { - return perrs.AddStack(err) + err = perrs.AddStack(err) + deployingInfo.err = err + return err } if exist { // FIXME: When change to use args, the suggestion text need to be updatem. - return errDeployNameDuplicate. + err = errDeployNameDuplicate. New("Cluster name '%s' is duplicated", clusterName). WithProperty(cliutil.SuggestionFromFormat("Please specify another cluster name")) + deployingInfo.err = err + return err } metadata := m.specManager.NewMetadata() @@ -942,6 +962,7 @@ func (m *Manager) Deploy( // the whole topology back to normal state. if err := clusterutil.ParseTopologyYaml(topoFile, topo); err != nil && !errors.Is(perrs.Cause(err), spec.ErrNoTiSparkMaster) { + deployingInfo.err = err return err } @@ -949,30 +970,37 @@ func (m *Manager) Deploy( clusterList, err := m.specManager.GetAllClusters() if err != nil { + deployingInfo.err = err return err } if err := spec.CheckClusterPortConflict(clusterList, clusterName, topo); err != nil { + deployingInfo.err = err return err } if err := spec.CheckClusterDirConflict(clusterList, clusterName, topo); err != nil { + deployingInfo.err = err return err } if !skipConfirm { if err := m.confirmTopology(clusterName, clusterVersion, topo, set.NewStringSet()); err != nil { + deployingInfo.err = err return err } } sshConnProps, err := cliutil.ReadIdentityFileOrPassword(opt.IdentityFile, opt.UsePassword) if err != nil { + deployingInfo.err = err return err } if err := os.MkdirAll(m.specManager.Path(clusterName), 0755); err != nil { - return errorx.InitializationFailed. + err = errorx.InitializationFailed. Wrap(err, "Failed to create cluster metadata directory '%s'", m.specManager.Path(clusterName)). WithProperty(cliutil.SuggestionFromString("Please check file system permissions and try again.")) + deployingInfo.err = err + return err } var ( @@ -1032,6 +1060,7 @@ func (m *Manager) Deploy( }) if iterErr != nil { + deployingInfo.err = err return iterErr } @@ -1135,34 +1164,65 @@ func (m *Manager) Deploy( // 除了第一个大步骤 Generate SSH keys 是 Serial 外,其它三个是 Parallel Task,是说它内部的子 task 是并行执行的 t := builder.Build() + deployingInfo.deploying = true + deployingInfo.curTask = t.(*task.Serial) + if err := t.Execute(task.NewContext()); err != nil { + deployingInfo.deploying = false + if errorx.Cast(err) != nil { // FIXME: Map possible task errors and give suggestions. + deployingInfo.err = err return err } - return perrs.AddStack(err) + err = perrs.AddStack(err) + return err } + deployingInfo.deploying = false metadata.SetUser(globalOptions.User) metadata.SetVersion(clusterVersion) err = m.specManager.SaveMeta(clusterName, metadata) if err != nil { - return perrs.AddStack(err) + err = perrs.AddStack(err) + deployingInfo.err = err + return err } hint := color.New(color.Bold).Sprintf("%s start %s", cliutil.OsArgs0(), clusterName) log.Infof("Deployed cluster `%s` successfully, you can start the cluster via `%s`", clusterName, hint) - // test - s := t.(*task.Serial) - status, progress := s.ComputeProgress() - fmt.Println("======== status ===========", status) - fmt.Println("======== progress ===========", progress) - return nil } +// DeployStatus represents the current deployment status +type DeployStatus struct { + ClusterName string `json:"cluster_name"` + Deploying bool `json:"is_deploying"` + TotalProgress int `json:"total_progress"` + Steps []string `json:"steps"` + ErrMsg string `json:"err_msg"` +} + +// GetDeployStatus returns the current deployment progress +func (m *Manager) GetDeployStatus() DeployStatus { + deployStaus := DeployStatus{ + ClusterName: deployingInfo.clusterName, + Deploying: deployingInfo.deploying, + Steps: []string{}, + } + if deployingInfo.curTask != nil { + steps, progress := deployingInfo.curTask.ComputeProgress() + deployStaus.TotalProgress = progress + deployStaus.Steps = steps + } + if deployingInfo.err != nil { + deployStaus.ErrMsg = deployingInfo.err.Error() + } + return deployStaus +} + // ScaleIn the cluster. func (m *Manager) ScaleIn( clusterName string, diff --git a/web-ui/src/pages/Deployment/DeploymentStatus.tsx b/web-ui/src/pages/Deployment/DeploymentStatus.tsx new file mode 100644 index 0000000000..72e808a8bb --- /dev/null +++ b/web-ui/src/pages/Deployment/DeploymentStatus.tsx @@ -0,0 +1,51 @@ +import React from 'react' +import { Progress } from 'antd' + +export interface IDeploymentStatus { + cluster_name: string + is_deploying: boolean + total_progress: number + steps: string[] + err_msg: string +} + +export interface IDeploymentStatusProps { + deployStatus: IDeploymentStatus +} + +export default function DeploymentStatus({ + deployStatus, +}: IDeploymentStatusProps) { + const { cluster_name, total_progress, steps, err_msg } = deployStatus + + function result() { + if (err_msg) { + return '失败' + } else if (total_progress === 100) { + return '成功' + } else { + return '进行中' + } + } + + if (cluster_name === '') { + return

当前没有正在进行的部署任务

+ } + + return ( +
+

当前在正进行的部署集群名字:{cluster_name}

+

部署结果: {result()}

+

进度:

+ + {err_msg &&

错误日志:{err_msg}

} +

部署步骤:

+ {steps.map((step, idx) => ( +

{step}

+ ))} +
+ ) +} diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 80d7b9ec52..16b8ad6c5e 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -1,5 +1,5 @@ -import React, { useCallback, useState } from 'react' -import { useLocalStorageState } from 'ahooks' +import React, { useCallback, useState, useEffect } from 'react' +import { useLocalStorageState, useSetState } from 'ahooks' import { Drawer, Space, Button, Modal, Form, Input, Select } from 'antd' import uniqid from 'uniqid' import yaml from 'yaml' @@ -26,6 +26,8 @@ import DeploymentTable, { import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' import { Root } from '../../components/Root' +import DeploymentStatus, { IDeploymentStatus } from './DeploymentStatus' +import { getClusterList, getDeploymentStatus } from '../../utils/api' // TODO: fetch from API const TIDB_VERSIONS = [ @@ -50,6 +52,26 @@ export default function DeploymentPage() { const [previewYaml, setPreviewYaml] = useState(false) + const [viewDeployStatus, setViewDeployStatus] = useState(false) + + const [deployStatus, setDeployStatus] = useState< + IDeploymentStatus | undefined + >(undefined) + + useEffect(() => { + const id = setInterval(() => { + getDeploymentStatus().then(({ data, err }) => { + if (data !== undefined) { + setDeployStatus(data) + if ((data as IDeploymentStatus).total_progress === 100) { + clearInterval(id) + } + } + }) + }, 2000) + return () => clearInterval(id) + }, []) + const handleAddComponent = useCallback( (machine: IMachine, componentType: string) => { let comp: IComponent = { @@ -199,6 +221,9 @@ export default function DeploymentPage() { + @@ -233,6 +258,15 @@ export default function DeploymentPage() { > + + setViewDeployStatus(false)} + onCancel={() => setViewDeployStatus(false)} + > + {deployStatus && } + ) } diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts index b781c0f833..ab839280be 100644 --- a/web-ui/src/utils/api.ts +++ b/web-ui/src/utils/api.ts @@ -15,3 +15,7 @@ export function getClusterList() { export function deleteCluster(clusterName: string) { return request(fullUrl(`clusters/${clusterName}`), 'DELETE') } + +export function getDeploymentStatus() { + return request(fullUrl('deploy_status')) +} From ad54704586121274d301976fcdc081c25728c67a Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 16:52:17 +0800 Subject: [PATCH 014/126] refine --- web-ui/src/pages/Deployment/index.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 16b8ad6c5e..0412c891dd 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -58,19 +58,21 @@ export default function DeploymentPage() { IDeploymentStatus | undefined >(undefined) + const [reloadTimes, setReloadTimes] = useState(0) + useEffect(() => { const id = setInterval(() => { getDeploymentStatus().then(({ data, err }) => { if (data !== undefined) { setDeployStatus(data) - if ((data as IDeploymentStatus).total_progress === 100) { + if (data.total_progress === 100 || data.err_msg) { clearInterval(id) } } }) }, 2000) return () => clearInterval(id) - }, []) + }, [reloadTimes]) const handleAddComponent = useCallback( (machine: IMachine, componentType: string) => { @@ -190,6 +192,7 @@ export default function DeploymentPage() { .then((res) => res.json()) .then((data) => console.log(data)) .catch((err) => console.log(err)) + setReloadTimes((pre) => pre + 1) } return ( From 99dd5072ed50a04bd93e90e05a397001f9129634 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 16:53:41 +0800 Subject: [PATCH 015/126] revert --- pkg/cluster/task/ssh_keygen.go | 8 ++++---- pkg/cluster/task/step.go | 8 ++++---- pkg/cluster/task/task.go | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pkg/cluster/task/ssh_keygen.go b/pkg/cluster/task/ssh_keygen.go index f37b5ab856..577fb88a99 100644 --- a/pkg/cluster/task/ssh_keygen.go +++ b/pkg/cluster/task/ssh_keygen.go @@ -35,7 +35,7 @@ type SSHKeyGen struct { // Execute implements the Task interface func (s *SSHKeyGen) Execute(ctx *Context) error { - ctx.Ev.PublishTaskProgress(s, "Generate SSH keys") + ctx.ev.PublishTaskProgress(s, "Generate SSH keys") savePrivateFileTo := s.keypath savePublicFileTo := s.keypath + ".pub" @@ -49,13 +49,13 @@ func (s *SSHKeyGen) Execute(ctx *Context) error { bitSize := 4096 - ctx.Ev.PublishTaskProgress(s, "Generate private key") + ctx.ev.PublishTaskProgress(s, "Generate private key") privateKey, err := s.generatePrivateKey(bitSize) if err != nil { return errors.Trace(err) } - ctx.Ev.PublishTaskProgress(s, "Generate public key") + ctx.ev.PublishTaskProgress(s, "Generate public key") publicKeyBytes, err := s.generatePublicKey(&privateKey.PublicKey) if err != nil { return errors.Trace(err) @@ -63,7 +63,7 @@ func (s *SSHKeyGen) Execute(ctx *Context) error { privateKeyBytes := s.encodePrivateKeyToPEM(privateKey) - ctx.Ev.PublishTaskProgress(s, "Persist keys") + ctx.ev.PublishTaskProgress(s, "Persist keys") err = s.writeKeyToFile(privateKeyBytes, savePrivateFileTo) if err != nil { return errors.Trace(err) diff --git a/pkg/cluster/task/step.go b/pkg/cluster/task/step.go index c888dda36b..e71ae70e28 100644 --- a/pkg/cluster/task/step.go +++ b/pkg/cluster/task/step.go @@ -83,11 +83,11 @@ func (s *StepDisplay) Execute(ctx *Context) error { if singleBar, ok := s.progressBar.(*progress.SingleBar); ok { singleBar.StartRenderLoop() } - ctx.Ev.Subscribe(EventTaskBegin, s.handleTaskBegin) - ctx.Ev.Subscribe(EventTaskProgress, s.handleTaskProgress) + ctx.ev.Subscribe(EventTaskBegin, s.handleTaskBegin) + ctx.ev.Subscribe(EventTaskProgress, s.handleTaskProgress) err := s.inner.Execute(ctx) - ctx.Ev.Unsubscribe(EventTaskProgress, s.handleTaskProgress) - ctx.Ev.Unsubscribe(EventTaskBegin, s.handleTaskBegin) + ctx.ev.Unsubscribe(EventTaskProgress, s.handleTaskProgress) + ctx.ev.Unsubscribe(EventTaskBegin, s.handleTaskBegin) if err != nil { s.progressBar.UpdateDisplay(&progress.DisplayProps{ diff --git a/pkg/cluster/task/task.go b/pkg/cluster/task/task.go index 36866638cb..ba5f661297 100644 --- a/pkg/cluster/task/task.go +++ b/pkg/cluster/task/task.go @@ -46,7 +46,7 @@ type ( // We should use mutex to prevent concurrent R/W for some fields // because of the same context can be shared in parallel tasks. Context struct { - Ev EventBus + ev EventBus exec struct { sync.RWMutex @@ -77,7 +77,7 @@ type ( // NewContext create a context instance. func NewContext() *Context { return &Context{ - Ev: NewEventBus(), + ev: NewEventBus(), exec: struct { sync.RWMutex executors map[string]executor.Executor @@ -185,9 +185,9 @@ func (s *Serial) Execute(ctx *Context) error { log.Infof("+ [ Serial ] - %s", t.String()) } } - ctx.Ev.PublishTaskBegin(t) + ctx.ev.PublishTaskBegin(t) err := t.Execute(ctx) - ctx.Ev.PublishTaskFinish(t, err) + ctx.ev.PublishTaskFinish(t, err) if err != nil { return err } @@ -269,9 +269,9 @@ func (pt *Parallel) Execute(ctx *Context) error { log.Infof("+ [Parallel] - %s", t.String()) } } - ctx.Ev.PublishTaskBegin(t) + ctx.ev.PublishTaskBegin(t) err := t.Execute(ctx) - ctx.Ev.PublishTaskFinish(t, err) + ctx.ev.PublishTaskFinish(t, err) if err != nil { mu.Lock() if firstError == nil { From f6bd841e6bf66761d0273ee0ec8aba420b7f2000 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 17:23:51 +0800 Subject: [PATCH 016/126] refine api --- web-ui/src/pages/Deployment/index.tsx | 26 ++++++++++++-------------- web-ui/src/utils/api.ts | 12 ++++++++---- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 0412c891dd..51398df58b 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -27,7 +27,11 @@ import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' import { Root } from '../../components/Root' import DeploymentStatus, { IDeploymentStatus } from './DeploymentStatus' -import { getClusterList, getDeploymentStatus } from '../../utils/api' +import { + getClusterList, + getDeploymentStatus, + deployCluster, +} from '../../utils/api' // TODO: fetch from API const TIDB_VERSIONS = [ @@ -178,21 +182,15 @@ export default function DeploymentPage() { function handleFinish(values: any) { const topoYaml = yaml.stringify(genTopo({ machines, components })) - fetch('http://localhost:8080/api/deploy', { - method: 'post', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - ...values, - topo_yaml: topoYaml, - }), + deployCluster({ + ...values, + topo_yaml: topoYaml, }) - .then((res) => res.json()) - .then((data) => console.log(data)) - .catch((err) => console.log(err)) setReloadTimes((pre) => pre + 1) + Modal.info({ + title: '部署任务已开始', + content: '请点击 "查看部署进度" 随时查看部署进度', + }) } return ( diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts index ab839280be..e5c6c09990 100644 --- a/web-ui/src/utils/api.ts +++ b/web-ui/src/utils/api.ts @@ -8,6 +8,14 @@ function fullUrl(path: string): string { //////////////////// +export function deployCluster(deployment: any) { + return request(fullUrl('deploy'), 'POST', deployment) +} + +export function getDeploymentStatus() { + return request(fullUrl('deploy_status')) +} + export function getClusterList() { return request(fullUrl('clusters')) } @@ -15,7 +23,3 @@ export function getClusterList() { export function deleteCluster(clusterName: string) { return request(fullUrl(`clusters/${clusterName}`), 'DELETE') } - -export function getDeploymentStatus() { - return request(fullUrl('deploy_status')) -} From daf6b1061323c593e087074ec2980b8a320d06f2 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 17:32:56 +0800 Subject: [PATCH 017/126] refine --- web-ui/src/pages/Deployment/index.tsx | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 51398df58b..438701cdb9 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useState, useEffect } from 'react' -import { useLocalStorageState, useSetState } from 'ahooks' +import { useLocalStorageState } from 'ahooks' import { Drawer, Space, Button, Modal, Form, Input, Select } from 'antd' import uniqid from 'uniqid' import yaml from 'yaml' @@ -27,11 +27,7 @@ import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' import { Root } from '../../components/Root' import DeploymentStatus, { IDeploymentStatus } from './DeploymentStatus' -import { - getClusterList, - getDeploymentStatus, - deployCluster, -} from '../../utils/api' +import { getDeploymentStatus, deployCluster } from '../../utils/api' // TODO: fetch from API const TIDB_VERSIONS = [ @@ -181,16 +177,24 @@ export default function DeploymentPage() { ) function handleFinish(values: any) { + if (deployStatus !== undefined) { + const { cluster_name, total_progress, err_msg } = deployStatus + if (cluster_name !== '' && err_msg === '' && total_progress < 100) { + Modal.error({ + title: '部署暂时无法进行', + content: '当前有正在进行中的部署任务,请点击 "查看部署进度" 进行查看', + }) + return + } + } + const topoYaml = yaml.stringify(genTopo({ machines, components })) deployCluster({ ...values, topo_yaml: topoYaml, }) setReloadTimes((pre) => pre + 1) - Modal.info({ - title: '部署任务已开始', - content: '请点击 "查看部署进度" 随时查看部署进度', - }) + setViewDeployStatus(true) } return ( From 94f4c19f9e0044dd8a12ed9dcffb2c23233caa87 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 18:01:58 +0800 Subject: [PATCH 018/126] refine --- pkg/cluster/manager.go | 6 --- .../src/pages/Deployment/DeploymentStatus.tsx | 46 +++++++++++++++---- web-ui/src/pages/Deployment/index.tsx | 15 ++++-- 3 files changed, 48 insertions(+), 19 deletions(-) diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 8bcd07e524..21b712db96 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -59,7 +59,6 @@ var ( // DeployingInfo records current deploying task and related info type DeployingInfo struct { // save last deploying task - deploying bool clusterName string curTask *task.Serial err error @@ -1168,11 +1167,9 @@ func (m *Manager) Deploy( // 除了第一个大步骤 Generate SSH keys 是 Serial 外,其它三个是 Parallel Task,是说它内部的子 task 是并行执行的 t := builder.Build() - deployingInfo.deploying = true deployingInfo.curTask = t.(*task.Serial) if err := t.Execute(task.NewContext()); err != nil { - deployingInfo.deploying = false if errorx.Cast(err) != nil { // FIXME: Map possible task errors and give suggestions. @@ -1182,7 +1179,6 @@ func (m *Manager) Deploy( err = perrs.AddStack(err) return err } - deployingInfo.deploying = false metadata.SetUser(globalOptions.User) metadata.SetVersion(clusterVersion) @@ -1203,7 +1199,6 @@ func (m *Manager) Deploy( // DeployStatus represents the current deployment status type DeployStatus struct { ClusterName string `json:"cluster_name"` - Deploying bool `json:"is_deploying"` TotalProgress int `json:"total_progress"` Steps []string `json:"steps"` ErrMsg string `json:"err_msg"` @@ -1213,7 +1208,6 @@ type DeployStatus struct { func (m *Manager) GetDeployStatus() DeployStatus { deployStaus := DeployStatus{ ClusterName: deployingInfo.clusterName, - Deploying: deployingInfo.deploying, Steps: []string{}, } if deployingInfo.curTask != nil { diff --git a/web-ui/src/pages/Deployment/DeploymentStatus.tsx b/web-ui/src/pages/Deployment/DeploymentStatus.tsx index 72e808a8bb..8f3685748f 100644 --- a/web-ui/src/pages/Deployment/DeploymentStatus.tsx +++ b/web-ui/src/pages/Deployment/DeploymentStatus.tsx @@ -1,9 +1,8 @@ -import React from 'react' +import React, { useRef, useEffect } from 'react' import { Progress } from 'antd' export interface IDeploymentStatus { cluster_name: string - is_deploying: boolean total_progress: number steps: string[] err_msg: string @@ -17,6 +16,13 @@ export default function DeploymentStatus({ deployStatus, }: IDeploymentStatusProps) { const { cluster_name, total_progress, steps, err_msg } = deployStatus + const detailInfoRef = useRef(null) + + useEffect(() => { + if (detailInfoRef.current) { + detailInfoRef.current.scrollTo(0, 36 * deployStatus.steps.length) + } + }, [deployStatus]) function result() { if (err_msg) { @@ -34,18 +40,38 @@ export default function DeploymentStatus({ return (
-

当前在正进行的部署集群名字:{cluster_name}

-

部署结果: {result()}

-

进度:

- {err_msg &&

错误日志:{err_msg}

} -

部署步骤:

- {steps.map((step, idx) => ( -

{step}

- ))} +
+

集群:{cluster_name}

+

部署结果: {result()}

+ {err_msg && ( + <> +

错误信息:

+

{err_msg}

+ + )} + {steps.length > 0 && ( + <> +

详细信息:

+
+ {steps.map((step, idx) => ( +

{step}

+ ))} +
+ + )} +
) } diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 438701cdb9..191a8062c6 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -62,10 +62,14 @@ export default function DeploymentPage() { useEffect(() => { const id = setInterval(() => { - getDeploymentStatus().then(({ data, err }) => { + getDeploymentStatus().then(({ data }) => { if (data !== undefined) { setDeployStatus(data) - if (data.total_progress === 100 || data.err_msg) { + if ( + data.total_progress === 100 || + data.err_msg || + data.cluster_name === '' + ) { clearInterval(id) } } @@ -193,6 +197,7 @@ export default function DeploymentPage() { ...values, topo_yaml: topoYaml, }) + setDeployStatus(undefined) setReloadTimes((pre) => pre + 1) setViewDeployStatus(true) } @@ -270,7 +275,11 @@ export default function DeploymentPage() { onOk={() => setViewDeployStatus(false)} onCancel={() => setViewDeployStatus(false)} > - {deployStatus && } + {deployStatus ? ( + + ) : ( +
Loading...
+ )} ) From 1988e58c778efa24d9a90ef6da2ab9f74c4583dc Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 18:23:11 +0800 Subject: [PATCH 019/126] save cluster name and tidb version --- components/web/main.go | 4 ++-- web-ui/src/pages/Deployment/index.tsx | 15 ++++++++++++++- web-ui/src/utils/request.ts | 2 -- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index 49a38c2d19..3631f1bf92 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -65,8 +65,8 @@ func deployHandler(c *gin.Context) { identifyFile := "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/_shared/vagrant_key" go func() { _ = manager.Deploy( - "multiHost", - "v4.0.4", + req.ClusterName, + req.TiDBVersion, topoFilePath, cluster.DeployOptions{ User: "vagrant", diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 191a8062c6..7db99ed6c0 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -41,6 +41,12 @@ const TIDB_VERSIONS = [ 'v3.1.0', ] +export interface IDeployReq { + cluster_name: string + tidb_version: string + // topo_yaml:string +} + export default function DeploymentPage() { const [machines] = useLocalStorageState<{ [key: string]: IMachine @@ -60,6 +66,11 @@ export default function DeploymentPage() { const [reloadTimes, setReloadTimes] = useState(0) + const [deployReq, setDeployReq] = useLocalStorageState( + 'deploy_req', + { cluster_name: '', tidb_version: '' } + ) + useEffect(() => { const id = setInterval(() => { getDeploymentStatus().then(({ data }) => { @@ -181,6 +192,8 @@ export default function DeploymentPage() { ) function handleFinish(values: any) { + setDeployReq(values) + if (deployStatus !== undefined) { const { cluster_name, total_progress, err_msg } = deployStatus if (cluster_name !== '' && err_msg === '' && total_progress < 100) { @@ -204,7 +217,7 @@ export default function DeploymentPage() { return ( -
+ Date: Sat, 22 Aug 2020 18:57:19 +0800 Subject: [PATCH 020/126] get cluster topo --- components/cluster/command/display.go | 2 +- components/dm/command/display.go | 2 +- components/web/main.go | 15 +++++++ pkg/cluster/manager.go | 45 ++++++++++++++++++--- web-ui/src/pages/Clusters/ClusterDetail.tsx | 27 ++++++++++++- web-ui/src/utils/api.ts | 4 ++ 6 files changed, 86 insertions(+), 9 deletions(-) diff --git a/components/cluster/command/display.go b/components/cluster/command/display.go index fa0aacd6f3..9cb4ec0651 100644 --- a/components/cluster/command/display.go +++ b/components/cluster/command/display.go @@ -58,7 +58,7 @@ func newDisplayCmd() *cobra.Command { return displayDashboardInfo(clusterName) } - err = manager.Display(clusterName, gOpt) + _, err = manager.Display(clusterName, gOpt) if err != nil { return perrs.AddStack(err) } diff --git a/components/dm/command/display.go b/components/dm/command/display.go index faeebf97b8..e1a120020c 100644 --- a/components/dm/command/display.go +++ b/components/dm/command/display.go @@ -40,7 +40,7 @@ func newDisplayCmd() *cobra.Command { clusterName = args[0] - err := manager.Display(clusterName, gOpt) + _, err := manager.Display(clusterName, gOpt) if err != nil { return perrs.AddStack(err) } diff --git a/components/web/main.go b/components/web/main.go index 3631f1bf92..3becabc908 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -27,6 +27,7 @@ func main() { api := router.Group("/api") { api.GET("/clusters", clustersHandler) + api.GET("/clusters/:clusterName", clusterHandler) api.DELETE("/clusters/:clusterName", destroyClusterHandler) api.POST("/deploy", deployHandler) @@ -99,6 +100,20 @@ func clustersHandler(c *gin.Context) { c.JSON(http.StatusOK, clusters) } +func clusterHandler(c *gin.Context) { + clusterName := c.Param("clusterName") + instInfos, err := manager.Display(clusterName, operator.Options{ + SSHTimeout: 5, + OptTimeout: 120, + APITimeout: 300, + }) + if err != nil { + _ = c.Error(err) + return + } + c.JSON(http.StatusOK, instInfos) +} + func destroyClusterHandler(c *gin.Context) { clusterName := c.Param("clusterName") err := manager.DestroyCluster(clusterName, operator.Options{ diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 21b712db96..f5226ff769 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -422,12 +422,24 @@ func (m *Manager) Exec(clusterName string, opt ExecOptions, gOpt operator.Option return nil } +// InstInfo represents an instance info +type InstInfo struct { + ID string `json:"id"` + Role string `json:"role"` + Host string `json:"host"` + Ports string `json:"ports"` + OsArch string `json:"os_arch"` + Status string `json:"status"` + DataDir string `json:"data_dir"` + DeployDir string `json:"deploy_dir"` +} + // Display cluster meta and topology. -func (m *Manager) Display(clusterName string, opt operator.Options) error { +func (m *Manager) Display(clusterName string, opt operator.Options) ([]InstInfo, error) { metadata, err := m.meta(clusterName) if err != nil && !errors.Is(perrs.Cause(err), meta.ErrValidate) && !errors.Is(perrs.Cause(err), spec.ErrNoTiSparkMaster) { - return perrs.AddStack(err) + return nil, perrs.AddStack(err) } topo := metadata.GetTopology() @@ -448,14 +460,16 @@ func (m *Manager) Display(clusterName string, opt operator.Options) error { err = ctx.SetSSHKeySet(m.specManager.Path(clusterName, "ssh", "id_rsa"), m.specManager.Path(clusterName, "ssh", "id_rsa.pub")) if err != nil { - return perrs.AddStack(err) + return nil, perrs.AddStack(err) } err = ctx.SetClusterSSH(topo, base.User, opt.SSHTimeout, opt.NativeSSH) if err != nil { - return perrs.AddStack(err) + return nil, perrs.AddStack(err) } + clusterInstInfos := []InstInfo{} + filterRoles := set.NewStringSet(opt.Roles...) filterNodes := set.NewStringSet(opt.Nodes...) pdList := topo.BaseTopo().MasterList @@ -503,6 +517,16 @@ func (m *Manager) Display(clusterName string, opt operator.Options) error { deployDir, }) + clusterInstInfos = append(clusterInstInfos, InstInfo{ + ID: ins.ID(), + Role: ins.Role(), + Host: ins.GetHost(), + Ports: utils.JoinInt(ins.UsedPorts(), "/"), + OsArch: cliutil.OsArch(ins.OS(), ins.Arch()), + Status: status, + DataDir: dataDir, + DeployDir: deployDir, + }) } } @@ -518,9 +542,20 @@ func (m *Manager) Display(clusterName string, opt operator.Options) error { return lhs[3] < rhs[3] }) + sort.Slice(clusterInstInfos, func(i, j int) bool { + lhs, rhs := clusterInstInfos[i], clusterInstInfos[j] + if lhs.Role != rhs.Role { + return lhs.Role < rhs.Role + } + if lhs.Host != rhs.Host { + return lhs.Host < rhs.Host + } + return lhs.Ports < rhs.Ports + }) + cliutil.PrintTable(clusterTable, true) - return nil + return clusterInstInfos, nil } // EditConfig let the user edit the config. diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 775e7e9a9c..f89238c00e 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -1,13 +1,24 @@ -import React, { useMemo, useState } from 'react' +import React, { useMemo, useState, useEffect } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { Space, Button, Modal, message } from 'antd' import { ExclamationCircleOutlined } from '@ant-design/icons' import { useSessionStorageState } from 'ahooks' -import { deleteCluster } from '../../utils/api' +import { deleteCluster, getClusterTopo } from '../../utils/api' import { Root } from '../../components/Root' import { ICluster } from '.' +export interface IClusterInstInfo { + id: string + role: string + host: string + ports: string + os_arch: string + status: string + data_dri: string + deploy_dir: string +} + export default function ClusterDetailPage() { const navigate = useNavigate() const [clustersList] = useSessionStorageState('clusters', []) @@ -18,6 +29,18 @@ export default function ClusterDetailPage() { ) const [destroyingCluster, setDestroyingCluster] = useState(false) + const [clusterInstInfos, setClusterInstInfos] = useState( + [] + ) + + useEffect(() => { + getClusterTopo(clusterName).then(({ data, err }) => { + if (data !== undefined) { + setClusterInstInfos(data) + } + }) + }, []) + function destroyCluster() { setDestroyingCluster(true) deleteCluster(clusterName).then(({ data, err }) => { diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts index e5c6c09990..8a26349a39 100644 --- a/web-ui/src/utils/api.ts +++ b/web-ui/src/utils/api.ts @@ -23,3 +23,7 @@ export function getClusterList() { export function deleteCluster(clusterName: string) { return request(fullUrl(`clusters/${clusterName}`), 'DELETE') } + +export function getClusterTopo(clusterName: string) { + return request(fullUrl(`clusters/${clusterName}`)) +} From 1742586abdfbab3f55d47d24bbc1e8a7b6fefd94 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 19:12:25 +0800 Subject: [PATCH 021/126] show cluster topo --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 40 ++++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index f89238c00e..1e5be9e81a 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -1,6 +1,6 @@ import React, { useMemo, useState, useEffect } from 'react' import { useParams, useNavigate } from 'react-router-dom' -import { Space, Button, Modal, message } from 'antd' +import { Space, Button, Modal, message, Table } from 'antd' import { ExclamationCircleOutlined } from '@ant-design/icons' import { useSessionStorageState } from 'ahooks' @@ -15,7 +15,7 @@ export interface IClusterInstInfo { ports: string os_arch: string status: string - data_dri: string + data_dir: string deploy_dir: string } @@ -29,12 +29,33 @@ export default function ClusterDetailPage() { ) const [destroyingCluster, setDestroyingCluster] = useState(false) - const [clusterInstInfos, setClusterInstInfos] = useState( - [] - ) + const [clusterInstInfos, setClusterInstInfos] = useSessionStorageState< + IClusterInstInfo[] + >(`${clusterName}_cluster_topo`, []) + + const [loadingTopo, setLoadingTopo] = useState(false) + + const columns = useMemo(() => { + return [ + 'ID', + 'Role', + 'Host', + 'Ports', + 'OS_Arch', + 'Status', + 'Data_Dir', + 'Deploy_Dir', + ].map((title) => ({ + title, + key: title.toLowerCase(), + dataIndex: title.toLowerCase(), + })) + }, []) useEffect(() => { + setLoadingTopo(true) getClusterTopo(clusterName).then(({ data, err }) => { + setLoadingTopo(false) if (data !== undefined) { setClusterInstInfos(data) } @@ -80,6 +101,7 @@ export default function ClusterDetailPage() { > 销毁群集 +

Name: {cluster.name}

@@ -88,6 +110,14 @@ export default function ClusterDetailPage() {

Path: {cluster.path}

PrivateKey: {cluster.private_key}

+ +
) } From bdf27efd6453c18b80b5056f03ea65f6710e9d27 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 19:22:51 +0800 Subject: [PATCH 022/126] refine --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 40 ++++++++++++--------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 1e5be9e81a..e927afa366 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -52,16 +52,6 @@ export default function ClusterDetailPage() { })) }, []) - useEffect(() => { - setLoadingTopo(true) - getClusterTopo(clusterName).then(({ data, err }) => { - setLoadingTopo(false) - if (data !== undefined) { - setClusterInstInfos(data) - } - }) - }, []) - function destroyCluster() { setDestroyingCluster(true) deleteCluster(clusterName).then(({ data, err }) => { @@ -87,6 +77,16 @@ export default function ClusterDetailPage() { }) } + function handleShowTopo() { + setLoadingTopo(true) + getClusterTopo(clusterName).then(({ data, err }) => { + setLoadingTopo(false) + if (data !== undefined) { + setClusterInstInfos(data) + } + }) + } + if (cluster === undefined) { return } @@ -111,13 +111,19 @@ export default function ClusterDetailPage() {

PrivateKey: {cluster.private_key}

-
+ + + +
+ ) } From 00d770fad077c3c0bdecf9747f3f82b4dfc815a1 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 19:41:28 +0800 Subject: [PATCH 023/126] update generate topo --- components/web/main.go | 2 +- web-ui/src/pages/Deployment/TopoPreview.tsx | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/components/web/main.go b/components/web/main.go index 3becabc908..64cd84a454 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -62,7 +62,7 @@ func deployHandler(c *gin.Context) { fmt.Println("topo file path:", topoFilePath) // parse request parameters - topoFilePath = "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/multiHost/topology.yaml" + // topoFilePath = "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/multiHost/topology.yaml" identifyFile := "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/_shared/vagrant_key" go func() { _ = manager.Deploy( diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index 512e25b85b..f869bbce6b 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -13,6 +13,19 @@ export function genTopo({ machines, components }: ITopoPreviewProps) { const componentsArr = Object.values(components) let topo = {} as any + topo = { + global: { + user: 'tidb', + deploy_dir: 'tidb-deploy', + data_dir: 'tidb-data', + }, + server_configs: { + pd: { + 'replication.enable-placement-rules': true, + }, + }, + } + for (const compType of COMPONENT_TYPES) { const comps = componentsArr.filter( (comp) => comp.type === compType From 5e011c119115433770f8f94327824482042ef432 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 22 Aug 2020 20:23:40 +0800 Subject: [PATCH 024/126] fix missed error --- pkg/cluster/manager.go | 2 +- web-ui/src/pages/Deployment/DeploymentStatus.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index f5226ff769..847abe3e64 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -1205,13 +1205,13 @@ func (m *Manager) Deploy( deployingInfo.curTask = t.(*task.Serial) if err := t.Execute(task.NewContext()); err != nil { - if errorx.Cast(err) != nil { // FIXME: Map possible task errors and give suggestions. deployingInfo.err = err return err } err = perrs.AddStack(err) + deployingInfo.err = err return err } diff --git a/web-ui/src/pages/Deployment/DeploymentStatus.tsx b/web-ui/src/pages/Deployment/DeploymentStatus.tsx index 8f3685748f..17305be87a 100644 --- a/web-ui/src/pages/Deployment/DeploymentStatus.tsx +++ b/web-ui/src/pages/Deployment/DeploymentStatus.tsx @@ -20,7 +20,7 @@ export default function DeploymentStatus({ useEffect(() => { if (detailInfoRef.current) { - detailInfoRef.current.scrollTo(0, 36 * deployStatus.steps.length) + // detailInfoRef.current.scrollTo(0, 36 * deployStatus.steps.length) } }, [deployStatus]) From 5b86dd7bce244d2fe9d0afb9b1eed6329bdf1446 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Mon, 24 Aug 2020 12:01:27 +0800 Subject: [PATCH 025/126] set global login options --- components/web/main.go | 37 ++++++++--- .../src/pages/Deployment/DeploymentTable.tsx | 18 ++++-- web-ui/src/pages/Deployment/index.tsx | 7 +++ .../pages/Machines/GlobalLoginOptionsForm.tsx | 58 ++++++++++++++++++ web-ui/src/pages/Machines/MachineForm.tsx | 61 +++++++------------ web-ui/src/pages/Machines/MachinesTable.tsx | 6 +- web-ui/src/pages/Machines/index.tsx | 17 ++++++ 7 files changed, 150 insertions(+), 54 deletions(-) create mode 100644 web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx diff --git a/components/web/main.go b/components/web/main.go index 64cd84a454..59b99bdd54 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -1,9 +1,9 @@ package main import ( - "fmt" "io/ioutil" "net/http" + "strings" "github.com/gin-gonic/gin" "github.com/pingcap/tiup/pkg/cluster" @@ -36,11 +36,20 @@ func main() { _ = router.Run() } +// DeployGlobalLoginOptions represents the global options for deploy +type DeployGlobalLoginOptions struct { + Username string `json:"username"` + Password string `json:"password"` + PrivateKey string `json:"privateKey"` // TODO: refine naming style + PrivateKeyPassword string `json:"privateKeyPassword"` // TODO: refine naming style +} + // DeployReq represents for the request of deploy API type DeployReq struct { - ClusterName string `json:"cluster_name"` - TiDBVersion string `json:"tidb_version"` - TopoYaml string `json:"topo_yaml"` + ClusterName string `json:"cluster_name"` + TiDBVersion string `json:"tidb_version"` + TopoYaml string `json:"topo_yaml"` + GlobalLoginOptions DeployGlobalLoginOptions `json:"global_login_options"` } func deployHandler(c *gin.Context) { @@ -56,21 +65,31 @@ func deployHandler(c *gin.Context) { _ = c.Error(err) return } - defer tmpfile.Close() - _, _ = tmpfile.WriteString(req.TopoYaml) + _, _ = tmpfile.WriteString(strings.TrimSpace(req.TopoYaml)) topoFilePath := tmpfile.Name() - fmt.Println("topo file path:", topoFilePath) + tmpfile.Close() + // fmt.Println("topo file path:", topoFilePath) + + // create private key file + tmpfile, err = ioutil.TempFile("", "private_key") + if err != nil { + _ = c.Error(err) + return + } + _, _ = tmpfile.WriteString(strings.TrimSpace(req.GlobalLoginOptions.PrivateKey)) + identifyFile := tmpfile.Name() + tmpfile.Close() // parse request parameters // topoFilePath = "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/multiHost/topology.yaml" - identifyFile := "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/_shared/vagrant_key" + // identifyFile := "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/_shared/vagrant_key" go func() { _ = manager.Deploy( req.ClusterName, req.TiDBVersion, topoFilePath, cluster.DeployOptions{ - User: "vagrant", + User: req.GlobalLoginOptions.Username, IdentityFile: identifyFile, }, nil, diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index fee79cabd7..b02cf46ebc 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -3,6 +3,11 @@ import { Tag, Table, Menu, Dropdown, Space, Divider, Popconfirm } from 'antd' import { DownOutlined } from '@ant-design/icons' import { IMachine, DEF_SSH_PORT } from '../Machines/MachineForm' +import { useLocalStorageState } from 'ahooks' +import { + IGlobalLoginOptions, + DEF_UESRNAME, +} from '../Machines/GlobalLoginOptionsForm' export const COMPONENT_TYPES = [ 'TiDB', @@ -106,6 +111,11 @@ export default function DeploymentTable({ onDeleteComponent, onDeleteComponents, }: IDeploymentTableProps) { + const [globalLoginOptions] = useLocalStorageState( + 'global_login_options', + {} + ) + const dataSource = useMemo(() => { let machinesAndComps: (IMachine | IComponent)[] = [] const sortedMachines = Object.values(machines).sort((a, b) => @@ -139,7 +149,7 @@ export default function DeploymentTable({ title: '目标机器 / 组件', key: 'target_machine_component', render: (text: any, rec: any) => { - if (rec.username) { + if (rec.host) { return `${rec.name} (${rec.host})` } return ( @@ -153,9 +163,9 @@ export default function DeploymentTable({ title: '信息', key: 'information', render: (text: any, rec: any) => { - if (rec.username) { + if (rec.host) { return `SSH Port=${rec.ssh_port || DEF_SSH_PORT}, User=${ - rec.username + rec.username || globalLoginOptions.username || DEF_UESRNAME }, DC=${rec.dc}, Rack=${rec.rack}` } switch (rec.type) { @@ -207,7 +217,7 @@ export default function DeploymentTable({ title: '操作', key: 'action', render: (text: any, rec: any) => { - if (rec.username) { + if (rec.host) { return ( ( + 'global_login_options', + {} + ) + useEffect(() => { const id = setInterval(() => { getDeploymentStatus().then(({ data }) => { @@ -209,6 +215,7 @@ export default function DeploymentPage() { deployCluster({ ...values, topo_yaml: topoYaml, + global_login_options: globalLoginOptions, }) setDeployStatus(undefined) setReloadTimes((pre) => pre + 1) diff --git a/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx b/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx new file mode 100644 index 0000000000..91a6abbd6f --- /dev/null +++ b/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx @@ -0,0 +1,58 @@ +import React, { useState } from 'react' +import { Form, Input, Button, message } from 'antd' +import { useLocalStorageState } from 'ahooks' + +export interface IGlobalLoginOptions { + username?: string + password?: string + privateKey?: string + privateKeyPassword?: string +} + +export const DEF_UESRNAME = 'tidb' + +export interface IGlobalLoginOptionsFormProps { + globalLoginOptions: IGlobalLoginOptions + onUpdateGlobalLoginOptions: (options: IGlobalLoginOptions) => void +} + +export default function GlobalLoginOptionsForm({ + globalLoginOptions, + onUpdateGlobalLoginOptions, +}: IGlobalLoginOptionsFormProps) { + const [btnEnable, setBtnEnable] = useState(false) + + function handleFinish(values: any) { + onUpdateGlobalLoginOptions(values) + setBtnEnable(false) + message.success('全局默认登录选项已修改') + } + + return ( + setBtnEnable(true)} + onFinish={handleFinish} + layout="inline" + title="全局默认登录选项" + initialValues={globalLoginOptions} + > + + + + + + + + + + + + + + + + + ) +} diff --git a/web-ui/src/pages/Machines/MachineForm.tsx b/web-ui/src/pages/Machines/MachineForm.tsx index 5e906e932a..ec1c65522b 100644 --- a/web-ui/src/pages/Machines/MachineForm.tsx +++ b/web-ui/src/pages/Machines/MachineForm.tsx @@ -10,6 +10,7 @@ import { Typography, } from 'antd' import uniqid from 'uniqid' +import { IGlobalLoginOptions, DEF_UESRNAME } from './GlobalLoginOptionsForm' export interface IMachine { id: string @@ -35,7 +36,7 @@ const defMachine: IMachine = { host: '', ssh_port: undefined, - isPubKeyAuth: false, + isPubKeyAuth: true, privateKey: '', privateKeyPassword: '', @@ -46,7 +47,10 @@ const defMachine: IMachine = { rack: '', } -function correctFormValues(values: any) { +function correctFormValues( + values: any, + globalLoginOptions: IGlobalLoginOptions +) { for (const key of Object.keys(values)) { if (key !== 'ssh_port' && key !== 'isPubKeyAuth') { values[key] = values[key].trim() @@ -59,13 +63,14 @@ function correctFormValues(values: any) { } } if (values.name === '') { - values.name = `${values.username}@${values.host}:${ - values.ssh_port || DEF_SSH_PORT - }` + values.name = `${ + values.username || globalLoginOptions.username || DEF_UESRNAME + }@${values.host}:${values.ssh_port || DEF_SSH_PORT}` } } interface IMachineFormProps { + globalLoginOptions: IGlobalLoginOptions machine?: IMachine machines: { [key: string]: IMachine } onAdd?: (machine: IMachine, close: boolean) => boolean @@ -73,6 +78,7 @@ interface IMachineFormProps { } export default function MachineForm({ + globalLoginOptions, machine, machines, onAdd, @@ -90,7 +96,7 @@ export default function MachineForm({ form .validateFields() .then((values) => { - correctFormValues(values) + correctFormValues(values, globalLoginOptions) const ok = onAdd && onAdd( @@ -109,7 +115,7 @@ export default function MachineForm({ } function handleFinish(values: any) { - correctFormValues(values) + correctFormValues(values, globalLoginOptions) if (addNew) { onAdd && onAdd( @@ -210,17 +216,8 @@ export default function MachineForm({ - - + + 使用私钥登录 @@ -234,34 +231,18 @@ export default function MachineForm({ {({ getFieldValue }) => { return getFieldValue('isPubKeyAuth') ? ( <> - - + + ) : ( - - + + ) }} diff --git a/web-ui/src/pages/Machines/MachinesTable.tsx b/web-ui/src/pages/Machines/MachinesTable.tsx index 75aade4c7e..cdb63e2fca 100644 --- a/web-ui/src/pages/Machines/MachinesTable.tsx +++ b/web-ui/src/pages/Machines/MachinesTable.tsx @@ -2,14 +2,17 @@ import React, { useMemo } from 'react' import { Table, Space, Divider, Popconfirm } from 'antd' import { IMachine, DEF_SSH_PORT } from './MachineForm' +import { IGlobalLoginOptions, DEF_UESRNAME } from './GlobalLoginOptionsForm' interface IMachinesTableProps { + globalLoginOptions: IGlobalLoginOptions machines: { [key: string]: IMachine } onEdit?: (m: IMachine) => void onDelete?: (m: IMachine) => void } export default function MachinesTable({ + globalLoginOptions, machines, onEdit, onDelete, @@ -33,8 +36,9 @@ export default function MachinesTable({ }, { title: '登录用户', - dataIndex: 'username', key: 'username', + render: (text: any, rec: any) => + `${rec.username || globalLoginOptions.username || DEF_UESRNAME}`, }, { title: '使用公钥登录', diff --git a/web-ui/src/pages/Machines/index.tsx b/web-ui/src/pages/Machines/index.tsx index e755906be5..c16be0be48 100644 --- a/web-ui/src/pages/Machines/index.tsx +++ b/web-ui/src/pages/Machines/index.tsx @@ -6,6 +6,9 @@ import MachineForm, { IMachine } from './MachineForm' import MachinesTable from './MachinesTable' import { IComponent } from '../Deployment/DeploymentTable' import { Root } from '../../components/Root' +import GlobalLoginOptionsForm, { + IGlobalLoginOptions, +} from './GlobalLoginOptionsForm' export default function MachinesPage() { const [showForm, setShowForm] = useState(false) @@ -18,6 +21,10 @@ export default function MachinesPage() { [key: string]: IComponent }>('components', {}) + const [globalLoginOptions, setGlobalLoginOptions] = useLocalStorageState< + IGlobalLoginOptions + >('global_login_options', {}) + function handleAddMachine(machine: IMachine, close: boolean) { let dup = Object.values(machines).find((m) => m.host === machine.host) if (dup !== undefined) { @@ -102,6 +109,14 @@ export default function MachinesPage() { return ( +
+

全局默认登录选项:

+ +
+ - - + + + + + + + +

Name: {cluster.name}

@@ -112,7 +187,11 @@ export default function ClusterDetailPage() {
- diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts index 8a26349a39..01420e582b 100644 --- a/web-ui/src/utils/api.ts +++ b/web-ui/src/utils/api.ts @@ -27,3 +27,11 @@ export function deleteCluster(clusterName: string) { export function getClusterTopo(clusterName: string) { return request(fullUrl(`clusters/${clusterName}`)) } + +export function startCluster(clusterName: string) { + return request(fullUrl(`clusters/${clusterName}/start`), 'POST') +} + +export function stopCluster(clusterName: string) { + return request(fullUrl(`clusters/${clusterName}/stop`), 'POST') +} From 89d74e11b9073dafce3d98cbd7d9a5c9c0b448d3 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Mon, 24 Aug 2020 17:33:49 +0800 Subject: [PATCH 028/126] scale in cluster --- components/web/main.go | 48 ++++++++++++++ web-ui/src/pages/Clusters/ClusterDetail.tsx | 72 +++++++++++++++++---- web-ui/src/utils/api.ts | 7 ++ 3 files changed, 114 insertions(+), 13 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index 85cc22a9d5..50107f1491 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -32,6 +32,7 @@ func main() { api.DELETE("/clusters/:clusterName", destroyClusterHandler) api.POST("/clusters/:clusterName/start", startClusterHandler) api.POST("/clusters/:clusterName/stop", stopClusterHandler) + api.POST("/clusters/:clusterName/scale_in", scaleInClusterHandler) api.POST("/deploy", deployHandler) api.GET("/deploy_status", deployStatusHandler) @@ -192,3 +193,50 @@ func stopClusterHandler(c *gin.Context) { "message": "ok", }) } + +// ScaleInReq represents the request for scale in cluster +type ScaleInReq struct { + NodeID string `json:"node_id"` + Force bool `json:"force"` +} + +func scaleInClusterHandler(c *gin.Context) { + clusterName := c.Param("clusterName") + + var req ScaleInReq + if err := c.ShouldBindJSON(&req); err != nil { + _ = c.Error(err) + return + } + + gOpt := operator.Options{ + SSHTimeout: 5, + OptTimeout: 120, + APITimeout: 300, + NativeSSH: false, + Force: req.Force, + Nodes: []string{req.NodeID}} + scale := func(b *task.Builder, imetadata spec.Metadata) { + metadata := imetadata.(*spec.ClusterMeta) + if !gOpt.Force { + b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt). + UpdateMeta(clusterName, metadata, operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false)). + UpdateTopology(clusterName, metadata, operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false)) + } else { + b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt). + UpdateMeta(clusterName, metadata, gOpt.Nodes). + UpdateTopology(clusterName, metadata, gOpt.Nodes) + } + } + + err := manager.ScaleIn(clusterName, true, gOpt.SSHTimeout, gOpt.NativeSSH, gOpt.Force, gOpt.Nodes, scale) + + if err != nil { + _ = c.Error(err) + return + } + + c.JSON(http.StatusOK, gin.H{ + "message": "ok", + }) +} diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 46e8268a89..40d9f43403 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -9,6 +9,7 @@ import { getClusterTopo, startCluster, stopCluster, + scaleInCluster, } from '../../utils/api' import { Root } from '../../components/Root' import { ICluster } from '.' @@ -35,6 +36,7 @@ export default function ClusterDetailPage() { const [destroying, setDestroying] = useState(false) const [starting, setStarting] = useState(false) const [stoping, setStoping] = useState(false) + const [scaleIning, setScaleIning] = useState(false) const [clusterInstInfos, setClusterInstInfos] = useSessionStorageState< IClusterInstInfo[] @@ -43,7 +45,7 @@ export default function ClusterDetailPage() { const [loadingTopo, setLoadingTopo] = useState(false) const columns = useMemo(() => { - return [ + const _columns = [ 'ID', 'Role', 'Host', @@ -57,6 +59,26 @@ export default function ClusterDetailPage() { key: title.toLowerCase(), dataIndex: title.toLowerCase(), })) + _columns.push({ + title: '操作', + key: 'action', + render: (text: any, rec: IClusterInstInfo) => { + if (rec.status.toLowerCase().indexOf('offline') !== -1) { + return null + } + return ( + handleScaleInCluster(rec)} + okText="下线" + cancelText="取消" + > + 缩容 + + ) + }, + } as any) + return _columns }, []) function destroyCluster() { @@ -126,9 +148,30 @@ export default function ClusterDetailPage() { }) } - // function handleScaleInCluster() { - // // TODO - // } + function handleScaleInCluster(node: IClusterInstInfo) { + const lowerStatus = node.status.toLowerCase() + const force = + lowerStatus.indexOf('down') !== -1 || + lowerStatus.indexOf('inactive') !== -1 + message.info(`${clusterName} 集群正在缩容中!请尽量不要进行其它操作!`) + setScaleIning(true) + + scaleInCluster(clusterName, { + node_id: node.id, + force, + }).then(({ data, err }) => { + setScaleIning(false) + if (data !== undefined) { + message.success(`${clusterName} 集群缩容成功!`) + handleShowTopo() + } else if (err !== undefined) { + Modal.confirm({ + title: `${clusterName} 集群缩容失败`, + content: err.message, + }) + } + }) + } // function handleScaleOutCluster() { // // TODO @@ -145,7 +188,7 @@ export default function ClusterDetailPage() { danger onClick={handleDestroyCluster} loading={destroying} - disabled={starting || stoping} + disabled={starting || stoping || scaleIning} > 销毁群集 @@ -154,12 +197,12 @@ export default function ClusterDetailPage() { onConfirm={handleStartCluster} okText="启动" cancelText="取消" - disabled={destroying || stoping} + disabled={destroying || stoping || scaleIning} > @@ -169,14 +212,15 @@ export default function ClusterDetailPage() { onConfirm={handleStopCluster} okText="停止" cancelText="取消" - disabled={destroying || starting} + disabled={destroying || starting || scaleIning} > - - -

Name: {cluster.name}

@@ -190,7 +234,7 @@ export default function ClusterDetailPage() { @@ -200,7 +244,9 @@ export default function ClusterDetailPage() { columns={columns} pagination={false} rowKey={'id'} - loading={loadingTopo} + loading={ + loadingTopo || scaleIning || destroying || starting || stoping + } /> diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts index 01420e582b..9909bcd6ac 100644 --- a/web-ui/src/utils/api.ts +++ b/web-ui/src/utils/api.ts @@ -35,3 +35,10 @@ export function startCluster(clusterName: string) { export function stopCluster(clusterName: string) { return request(fullUrl(`clusters/${clusterName}/stop`), 'POST') } + +export function scaleInCluster( + clusterName: string, + data: { node_id: string; force: boolean } +) { + return request(fullUrl(`clusters/${clusterName}/scale_in`), 'POST', data) +} From 263e30c4ac8ce84c02ee37f6a15d76b91e1bd102 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Mon, 24 Aug 2020 17:46:45 +0800 Subject: [PATCH 029/126] refine --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 40d9f43403..270324a79b 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -120,9 +120,9 @@ export default function ClusterDetailPage() { setStarting(true) startCluster(clusterName).then(({ data, err }) => { setStarting(false) + handleShowTopo() if (data !== undefined) { message.success(`${clusterName} 集群已启动!`) - handleShowTopo() } else if (err !== undefined) { Modal.confirm({ title: `${clusterName} 集群启动失败`, @@ -136,9 +136,9 @@ export default function ClusterDetailPage() { setStoping(true) stopCluster(clusterName).then(({ data, err }) => { setStoping(false) + handleShowTopo() if (data !== undefined) { message.success(`${clusterName} 集群已停止!`) - handleShowTopo() } else if (err !== undefined) { Modal.confirm({ title: `${clusterName} 集群停止失败`, @@ -161,9 +161,9 @@ export default function ClusterDetailPage() { force, }).then(({ data, err }) => { setScaleIning(false) + handleShowTopo() if (data !== undefined) { message.success(`${clusterName} 集群缩容成功!`) - handleShowTopo() } else if (err !== undefined) { Modal.confirm({ title: `${clusterName} 集群缩容失败`, From 6e981e7d0bd9df2863ecd892a75a109976528458 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 25 Aug 2020 10:21:12 +0800 Subject: [PATCH 030/126] revert vagrantfile --- examples/manualTestEnv/multiHost/Vagrantfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/manualTestEnv/multiHost/Vagrantfile b/examples/manualTestEnv/multiHost/Vagrantfile index b23fbb55bd..10db798e87 100644 --- a/examples/manualTestEnv/multiHost/Vagrantfile +++ b/examples/manualTestEnv/multiHost/Vagrantfile @@ -6,7 +6,7 @@ Vagrant.configure("2") do |config| v.cpus = 1 end - (1..3).each do |i| + (1..4).each do |i| config.vm.define "node#{i}" do |node| node.vm.network "private_network", ip: "10.0.1.#{i+10}" end From ce5e69747c5c32258e32abb43deedc49a458c5bc Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 25 Aug 2020 11:54:23 +0800 Subject: [PATCH 031/126] prepare scale out --- .../src/pages/Deployment/DeploymentTable.tsx | 42 +++++++++++++--- web-ui/src/pages/Deployment/EditCompForm.tsx | 7 ++- web-ui/src/pages/Deployment/TopoPreview.tsx | 40 +++++++++------ web-ui/src/pages/Deployment/index.tsx | 49 +++++++++++++------ 4 files changed, 102 insertions(+), 36 deletions(-) diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index b02cf46ebc..9cb13edc32 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -33,6 +33,7 @@ export interface IComponent { id: string machineID: string type: string + for_scale_out: boolean priority: number deploy_dir_prefix?: string // "/tidb-deploy" @@ -97,7 +98,11 @@ export const DEF_ALERT_CLUSTER_PORT = 9094 interface IDeploymentTableProps { machines: { [key: string]: IMachine } components: { [key: string]: IComponent } - onAddComponent?: (machine: IMachine, componentType: string) => void + onAddComponent?: ( + machine: IMachine, + componentType: string, + forScaleOut: boolean + ) => void onEditComponent?: (comp: IComponent) => void onDeleteComponent?: (comp: IComponent) => void onDeleteComponents?: (machine: IMachine) => void @@ -153,9 +158,13 @@ export default function DeploymentTable({ return `${rec.name} (${rec.host})` } return ( - - {rec.type} - +
+ -  + + {rec.type} + {rec.for_scale_out ? ' (Scale)' : ''} + +
) }, }, @@ -224,7 +233,8 @@ export default function DeploymentTable({ overlay={ - onAddComponent && onAddComponent(rec, e.key as string) + onAddComponent && + onAddComponent(rec, e.key as string, false) } > {COMPONENT_TYPES.map((t) => ( @@ -239,6 +249,26 @@ export default function DeploymentTable({ + + onAddComponent && + onAddComponent(rec, e.key as string, true) + } + > + {COMPONENT_TYPES.map((t) => ( + {t} + ))} + + } + trigger={['click']} + > + e.preventDefault()}> + 扩容组件 + + + @@ -278,7 +308,7 @@ export default function DeploymentTable({ return (
+ + 扩容组件? + diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index f869bbce6b..a70a61f07e 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -5,31 +5,41 @@ import { IMachine } from '../Machines/MachineForm' import { IComponent, COMPONENT_TYPES } from './DeploymentTable' interface ITopoPreviewProps { + forScaleOut: boolean machines: { [key: string]: IMachine } components: { [key: string]: IComponent } } -export function genTopo({ machines, components }: ITopoPreviewProps) { +// TODO: split into 2 methods: genDeployTopo, genScaleOutTopo +export function genTopo({ + machines, + components, + forScaleOut, +}: ITopoPreviewProps) { const componentsArr = Object.values(components) let topo = {} as any - topo = { - global: { - user: 'tidb', - deploy_dir: 'tidb-deploy', - data_dir: 'tidb-data', - }, - server_configs: { - pd: { - 'replication.enable-placement-rules': true, + + if (!forScaleOut) { + topo = { + global: { + user: 'tidb', + deploy_dir: 'tidb-deploy', + data_dir: 'tidb-data', }, - }, + server_configs: { + pd: { + 'replication.enable-placement-rules': true, + }, + }, + } } for (const compType of COMPONENT_TYPES) { const comps = componentsArr.filter( - (comp) => comp.type === compType + (comp) => comp.type === compType && comp.for_scale_out === forScaleOut ) as any[] + if (comps.length === 0) { continue } @@ -50,7 +60,7 @@ export function genTopo({ machines, components }: ITopoPreviewProps) { m.ssh_port = targetMachine.ssh_port } // TODO: - // username / password / privateKey ... + // username / password / privateKey / deploy_dir / data_dir for (const key of Object.keys(comp)) { if (key.indexOf('port') !== -1 && comp[key] !== undefined) { @@ -67,12 +77,14 @@ export function genTopo({ machines, components }: ITopoPreviewProps) { } export default function TopoPreview({ + forScaleOut, machines, components, }: ITopoPreviewProps) { - const topo = useMemo(() => genTopo({ machines, components }), [ + const topo = useMemo(() => genTopo({ machines, components, forScaleOut }), [ machines, components, + forScaleOut, ]) return ( diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 60e0f6c238..6dc0dc9b69 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -57,7 +57,10 @@ export default function DeploymentPage() { }>('components', {}) const [curComp, setCurComp] = useState(undefined) - const [previewYaml, setPreviewYaml] = useState(false) + const [previewYaml, setPreviewYaml] = useState({ + preview: false, + forScaleOut: false, + }) const [viewDeployStatus, setViewDeployStatus] = useState(false) @@ -77,6 +80,8 @@ export default function DeploymentPage() { {} ) + const [form] = Form.useForm() + useEffect(() => { const id = setInterval(() => { getDeploymentStatus().then(({ data }) => { @@ -96,11 +101,12 @@ export default function DeploymentPage() { }, [reloadTimes]) const handleAddComponent = useCallback( - (machine: IMachine, componentType: string) => { + (machine: IMachine, componentType: string, forScaleOut: boolean) => { let comp: IComponent = { id: uniqid(), machineID: machine.id, type: componentType, + for_scale_out: forScaleOut, priority: COMPONENT_TYPES.indexOf(componentType), } const existedSameComps = Object.values(components).filter( @@ -219,7 +225,9 @@ export default function DeploymentPage() { } } - const topoYaml = yaml.stringify(genTopo({ machines, components })) + const topoYaml = yaml.stringify( + genTopo({ machines, components, forScaleOut: previewYaml.forScaleOut }) + ) deployCluster({ ...values, topo_yaml: topoYaml, @@ -232,7 +240,7 @@ export default function DeploymentPage() { return ( -
+ - + @@ -294,15 +310,20 @@ export default function DeploymentPage() { setPreviewYaml(false)} - onCancel={() => setPreviewYaml(false)} + visible={previewYaml.preview} + okText={previewYaml.forScaleOut ? '开始扩容' : '开始部署'} + onOk={() => setPreviewYaml({ preview: false, forScaleOut: false })} + onCancel={() => setPreviewYaml({ preview: false, forScaleOut: false })} > - + setViewDeployStatus(false)} onCancel={() => setViewDeployStatus(false)} From d95335fddc1f0b3134e8920cffbf8790fe76c5c6 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 25 Aug 2020 14:49:44 +0800 Subject: [PATCH 032/126] refine --- components/cluster/command/deploy.go | 5 +- components/cluster/command/scale_out.go | 10 +- components/web/main.go | 93 ++++++++++++++----- pkg/cluster/manager.go | 87 ++++++++--------- pkg/cluster/task/step.go | 8 +- pkg/cluster/task/task.go | 2 + ...ploymentStatus.tsx => OperationStatus.tsx} | 25 ++--- web-ui/src/pages/Deployment/index.tsx | 10 +- web-ui/src/utils/api.ts | 20 +++- 9 files changed, 152 insertions(+), 108 deletions(-) rename web-ui/src/pages/Deployment/{DeploymentStatus.tsx => OperationStatus.tsx} (71%) diff --git a/components/cluster/command/deploy.go b/components/cluster/command/deploy.go index bca25f31cc..0cde2c8922 100644 --- a/components/cluster/command/deploy.go +++ b/components/cluster/command/deploy.go @@ -76,7 +76,7 @@ func newDeploy() *cobra.Command { version, topoFile, opt, - postDeployHook, + PostDeployHook, skipConfirm, gOpt.OptTimeout, gOpt.SSHTimeout, @@ -94,7 +94,8 @@ func newDeploy() *cobra.Command { return cmd } -func postDeployHook(builder *task.Builder, topo spec.Topology) { +// PostDeployHook do things after deploy +func PostDeployHook(builder *task.Builder, topo spec.Topology) { nodeInfoTask := task.NewBuilder().Func("Check status", func(ctx *task.Context) error { var err error teleNodeInfos, err = operator.GetNodeInfo(context.Background(), ctx, topo) diff --git a/components/cluster/command/scale_out.go b/components/cluster/command/scale_out.go index 5f5d0dc065..6183ffca46 100644 --- a/components/cluster/command/scale_out.go +++ b/components/cluster/command/scale_out.go @@ -51,8 +51,8 @@ func newScaleOutCmd() *cobra.Command { return manager.ScaleOut( clusterName, topoFile, - postScaleOutHook, - final, + PostScaleOutHook, + Final, opt, skipConfirm, gOpt.OptTimeout, @@ -79,11 +79,13 @@ func convertStepDisplaysToTasks(t []*task.StepDisplay) []task.Task { return tasks } -func final(builder *task.Builder, name string, meta spec.Metadata) { +// Final do things after scale out +func Final(builder *task.Builder, name string, meta spec.Metadata) { builder.UpdateTopology(name, meta.(*spec.ClusterMeta), nil) } -func postScaleOutHook(builder *task.Builder, newPart spec.Topology) { +// PostScaleOutHook do things after scale out +func PostScaleOutHook(builder *task.Builder, newPart spec.Topology) { nodeInfoTask := task.NewBuilder().Func("Check status", func(ctx *task.Context) error { var err error teleNodeInfos, err = operator.GetNodeInfo(context.Background(), ctx, newPart) diff --git a/components/web/main.go b/components/web/main.go index 50107f1491..b6c9a64cf2 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/gin-gonic/gin" + "github.com/pingcap/tiup/components/cluster/command" "github.com/pingcap/tiup/pkg/cluster" operator "github.com/pingcap/tiup/pkg/cluster/operation" "github.com/pingcap/tiup/pkg/cluster/spec" @@ -27,15 +28,16 @@ func main() { router.Use(cors.AllowAll()) api := router.Group("/api") { + api.POST("/deploy", deployHandler) + api.GET("/status", statusHandler) + api.GET("/clusters", clustersHandler) api.GET("/clusters/:clusterName", clusterHandler) api.DELETE("/clusters/:clusterName", destroyClusterHandler) api.POST("/clusters/:clusterName/start", startClusterHandler) api.POST("/clusters/:clusterName/stop", stopClusterHandler) api.POST("/clusters/:clusterName/scale_in", scaleInClusterHandler) - - api.POST("/deploy", deployHandler) - api.GET("/deploy_status", deployStatusHandler) + api.POST("/clusters/:clusterName/scale_out", scaleOutClusterHandler) } _ = router.Run() } @@ -72,7 +74,6 @@ func deployHandler(c *gin.Context) { _, _ = tmpfile.WriteString(strings.TrimSpace(req.TopoYaml)) topoFilePath := tmpfile.Name() tmpfile.Close() - // fmt.Println("topo file path:", topoFilePath) // create private key file tmpfile, err = ioutil.TempFile("", "private_key") @@ -84,9 +85,6 @@ func deployHandler(c *gin.Context) { identifyFile := tmpfile.Name() tmpfile.Close() - // parse request parameters - // topoFilePath = "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/multiHost/topology.yaml" - // identifyFile := "/Users/baurine/Codes/Work/tiup/examples/manualTestEnv/_shared/vagrant_key" go func() { _ = manager.Deploy( req.ClusterName, @@ -96,7 +94,7 @@ func deployHandler(c *gin.Context) { User: req.GlobalLoginOptions.Username, IdentityFile: identifyFile, }, - nil, + command.PostDeployHook, true, 120, 5, @@ -104,13 +102,11 @@ func deployHandler(c *gin.Context) { ) }() - c.JSON(http.StatusOK, gin.H{ - "message": "ok", - }) + c.Status(http.StatusNoContent) } -func deployStatusHandler(c *gin.Context) { - status := manager.GetDeployStatus() +func statusHandler(c *gin.Context) { + status := manager.GetOperationStatus() c.JSON(http.StatusOK, status) } @@ -150,9 +146,7 @@ func destroyClusterHandler(c *gin.Context) { return } - c.JSON(http.StatusOK, gin.H{ - "message": "ok", - }) + c.Status(http.StatusNoContent) } func startClusterHandler(c *gin.Context) { @@ -171,9 +165,7 @@ func startClusterHandler(c *gin.Context) { return } - c.JSON(http.StatusOK, gin.H{ - "message": "ok", - }) + c.Status(http.StatusNoContent) } func stopClusterHandler(c *gin.Context) { @@ -189,9 +181,7 @@ func stopClusterHandler(c *gin.Context) { return } - c.JSON(http.StatusOK, gin.H{ - "message": "ok", - }) + c.Status(http.StatusNoContent) } // ScaleInReq represents the request for scale in cluster @@ -236,7 +226,60 @@ func scaleInClusterHandler(c *gin.Context) { return } - c.JSON(http.StatusOK, gin.H{ - "message": "ok", - }) + c.Status(http.StatusNoContent) +} + +// ScaleOutReq represents the request for scale out +type ScaleOutReq struct { + TopoYaml string `json:"topo_yaml"` + GlobalLoginOptions DeployGlobalLoginOptions `json:"global_login_options"` +} + +func scaleOutClusterHandler(c *gin.Context) { + clusterName := c.Param("clusterName") + + var req ScaleOutReq + if err := c.ShouldBindJSON(&req); err != nil { + _ = c.Error(err) + return + } + + // create temp topo yaml file + tmpfile, err := ioutil.TempFile("", "topo") + if err != nil { + _ = c.Error(err) + return + } + _, _ = tmpfile.WriteString(strings.TrimSpace(req.TopoYaml)) + topoFilePath := tmpfile.Name() + tmpfile.Close() + + // create private key file + tmpfile, err = ioutil.TempFile("", "private_key") + if err != nil { + _ = c.Error(err) + return + } + _, _ = tmpfile.WriteString(strings.TrimSpace(req.GlobalLoginOptions.PrivateKey)) + identifyFile := tmpfile.Name() + tmpfile.Close() + + go func() { + _ = manager.ScaleOut( + clusterName, + topoFilePath, + command.PostScaleOutHook, + command.Final, + cluster.ScaleOutOptions{ + User: req.GlobalLoginOptions.Username, + IdentityFile: identifyFile, + }, + true, + 120, + 5, + false, + ) + }() + + c.Status(http.StatusNoContent) } diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 847abe3e64..6406dc0bc6 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -52,16 +52,16 @@ var ( errorRenameNameNotExist = errNSRename.NewType("name_not_exist", errutil.ErrTraitPreCheck) errorRenameNameDuplicate = errNSRename.NewType("name_dup", errutil.ErrTraitPreCheck) - // TODO: use map to save map[string]DeployingInfo, the key is clusterName - deployingInfo DeployingInfo = DeployingInfo{} + // TODO: use map to save map[string]OperationInfo, the key is clusterName + operationInfo OperationInfo = OperationInfo{} ) -// DeployingInfo records current deploying task and related info -type DeployingInfo struct { - // save last deploying task - clusterName string - curTask *task.Serial - err error +// OperationInfo records latest operation task and related info +type OperationInfo struct { + operationType string // "deploy" | "scaleOut" + clusterName string + curTask *task.Serial + err error } // Manager to deploy a cluster. @@ -969,17 +969,17 @@ func (m *Manager) Deploy( nativeSSH bool, ) error { // reset - deployingInfo = DeployingInfo{clusterName: clusterName} + operationInfo = OperationInfo{operationType: "deploy", clusterName: clusterName} if err := clusterutil.ValidateClusterNameOrError(clusterName); err != nil { - deployingInfo.err = err + operationInfo.err = err return err } exist, err := m.specManager.Exist(clusterName) if err != nil { err = perrs.AddStack(err) - deployingInfo.err = err + operationInfo.err = err return err } @@ -988,7 +988,7 @@ func (m *Manager) Deploy( err = errDeployNameDuplicate. New("Cluster name '%s' is duplicated", clusterName). WithProperty(cliutil.SuggestionFromFormat("Please specify another cluster name")) - deployingInfo.err = err + operationInfo.err = err return err } @@ -1000,7 +1000,7 @@ func (m *Manager) Deploy( // the whole topology back to normal state. if err := clusterutil.ParseTopologyYaml(topoFile, topo); err != nil && !errors.Is(perrs.Cause(err), spec.ErrNoTiSparkMaster) { - deployingInfo.err = err + operationInfo.err = err return err } @@ -1008,28 +1008,28 @@ func (m *Manager) Deploy( clusterList, err := m.specManager.GetAllClusters() if err != nil { - deployingInfo.err = err + operationInfo.err = err return err } if err := spec.CheckClusterPortConflict(clusterList, clusterName, topo); err != nil { - deployingInfo.err = err + operationInfo.err = err return err } if err := spec.CheckClusterDirConflict(clusterList, clusterName, topo); err != nil { - deployingInfo.err = err + operationInfo.err = err return err } if !skipConfirm { if err := m.confirmTopology(clusterName, clusterVersion, topo, set.NewStringSet()); err != nil { - deployingInfo.err = err + operationInfo.err = err return err } } sshConnProps, err := cliutil.ReadIdentityFileOrPassword(opt.IdentityFile, opt.UsePassword) if err != nil { - deployingInfo.err = err + operationInfo.err = err return err } @@ -1037,7 +1037,7 @@ func (m *Manager) Deploy( err = errorx.InitializationFailed. Wrap(err, "Failed to create cluster metadata directory '%s'", m.specManager.Path(clusterName)). WithProperty(cliutil.SuggestionFromString("Please check file system permissions and try again.")) - deployingInfo.err = err + operationInfo.err = err return err } @@ -1098,7 +1098,7 @@ func (m *Manager) Deploy( }) if iterErr != nil { - deployingInfo.err = err + operationInfo.err = err return iterErr } @@ -1186,32 +1186,23 @@ func (m *Manager) Deploy( ParallelStep("+ Download TiDB components", downloadCompTasks...). ParallelStep("+ Initialize target host environments", envInitTasks...). ParallelStep("+ Copy files", deployCompTasks...) - // 并行任务里的小任务每一个都是 StepDisplay if afterDeploy != nil { afterDeploy(builder, topo) } - // 最终得到的是一个串行执行的大 Serial task - // 里面有 4 个大步骤: - // - Generate SSH keys - // - Download TiDB components - // - Initialize target host environments - // - Copy files - // 这 4 个步骤串行执行 - // 除了第一个大步骤 Generate SSH keys 是 Serial 外,其它三个是 Parallel Task,是说它内部的子 task 是并行执行的 t := builder.Build() - deployingInfo.curTask = t.(*task.Serial) + operationInfo.curTask = t.(*task.Serial) if err := t.Execute(task.NewContext()); err != nil { if errorx.Cast(err) != nil { // FIXME: Map possible task errors and give suggestions. - deployingInfo.err = err + operationInfo.err = err return err } err = perrs.AddStack(err) - deployingInfo.err = err + operationInfo.err = err return err } @@ -1221,7 +1212,7 @@ func (m *Manager) Deploy( if err != nil { err = perrs.AddStack(err) - deployingInfo.err = err + operationInfo.err = err return err } @@ -1231,29 +1222,31 @@ func (m *Manager) Deploy( return nil } -// DeployStatus represents the current deployment status -type DeployStatus struct { +// OperationStatus represents the current deployment status +type OperationStatus struct { + OperationType string `json:"operation_type"` ClusterName string `json:"cluster_name"` TotalProgress int `json:"total_progress"` Steps []string `json:"steps"` ErrMsg string `json:"err_msg"` } -// GetDeployStatus returns the current deployment progress -func (m *Manager) GetDeployStatus() DeployStatus { - deployStaus := DeployStatus{ - ClusterName: deployingInfo.clusterName, - Steps: []string{}, +// GetOperationStatus returns the current operations status, including progress, steps, err message +func (m *Manager) GetOperationStatus() OperationStatus { + operationStatus := OperationStatus{ + OperationType: operationInfo.operationType, + ClusterName: operationInfo.clusterName, + Steps: []string{}, } - if deployingInfo.curTask != nil { - steps, progress := deployingInfo.curTask.ComputeProgress() - deployStaus.TotalProgress = progress - deployStaus.Steps = steps + if operationInfo.curTask != nil { + steps, progress := operationInfo.curTask.ComputeProgress() + operationStatus.TotalProgress = progress + operationStatus.Steps = steps } - if deployingInfo.err != nil { - deployStaus.ErrMsg = deployingInfo.err.Error() + if operationInfo.err != nil { + operationStatus.ErrMsg = operationInfo.err.Error() } - return deployStaus + return operationStatus } // ScaleIn the cluster. diff --git a/pkg/cluster/task/step.go b/pkg/cluster/task/step.go index e71ae70e28..8641459e82 100644 --- a/pkg/cluster/task/step.go +++ b/pkg/cluster/task/step.go @@ -118,14 +118,12 @@ func (s *StepDisplay) String() string { } func (s *StepDisplay) handleTaskBegin(task Task) { - // 可能同时会收到其它 StepDisplay 发生的事件 - // 要判断这个 task 是否属于这个 StepDisplay if _, ok := s.children[task]; !ok { return } - // fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@ begin:", task, "@@@@") - s.progress = s.startedTask * 100 / len(s.children) + oneTaskPercentHalf := (100 / len(s.children)) / 2 + s.progress = s.startedTask*100/len(s.children) + oneTaskPercentHalf s.startedTask++ s.progressBar.UpdateDisplay(&progress.DisplayProps{ @@ -139,8 +137,6 @@ func (s *StepDisplay) handleTaskProgress(task Task, p string) { return } - // fmt.Println("internal @@@@@@@@@@@@@@@@@@@@@@@@@@@ progress:", task, "@@@@", p, "@@@@") - s.progressBar.UpdateDisplay(&progress.DisplayProps{ Prefix: s.prefix, Suffix: strings.Split(p, "\n")[0], diff --git a/pkg/cluster/task/task.go b/pkg/cluster/task/task.go index ba5f661297..c12acc84c5 100644 --- a/pkg/cluster/task/task.go +++ b/pkg/cluster/task/task.go @@ -227,6 +227,7 @@ func (s *Serial) ComputeProgress() ([]string, int) { if sd.progress == 100 { finishedSteps++ } + // TODO: refine, not append progress 0 steps? stepsStatus = append(stepsStatus, fmt.Sprintf("%s ... %d%%", sd.prefix, sd.progress)) } @@ -235,6 +236,7 @@ func (s *Serial) ComputeProgress() ([]string, int) { handleStepDisplay(sd) } if psd, ok := step.(*ParallelStepDisplay); ok { + // TODO: refine, not append it if all sub steps progress are 0? stepsStatus = append(stepsStatus, psd.prefix) for _, s := range psd.inner.inner { if sd, ok := s.(*StepDisplay); ok { diff --git a/web-ui/src/pages/Deployment/DeploymentStatus.tsx b/web-ui/src/pages/Deployment/OperationStatus.tsx similarity index 71% rename from web-ui/src/pages/Deployment/DeploymentStatus.tsx rename to web-ui/src/pages/Deployment/OperationStatus.tsx index 516c44c9bd..2ffe78a9ca 100644 --- a/web-ui/src/pages/Deployment/DeploymentStatus.tsx +++ b/web-ui/src/pages/Deployment/OperationStatus.tsx @@ -1,34 +1,29 @@ -import React, { useRef, useEffect } from 'react' +import React, { useRef } from 'react' import { Progress } from 'antd' -export interface IDeploymentStatus { +export interface IOperationStatus { + operation_type: string // 'deploy', 'scaleOut' cluster_name: string total_progress: number steps: string[] err_msg: string } -export interface IDeploymentStatusProps { - deployStatus: IDeploymentStatus +export interface IOperationStatusProps { + operationStatus: IOperationStatus } -export default function DeploymentStatus({ - deployStatus, -}: IDeploymentStatusProps) { - const { cluster_name, total_progress, steps, err_msg } = deployStatus +export default function OperationStatus({ + operationStatus, +}: IOperationStatusProps) { + const { cluster_name, total_progress, steps, err_msg } = operationStatus const detailInfoRef = useRef(null) - useEffect(() => { - if (detailInfoRef.current) { - // detailInfoRef.current.scrollTo(0, 36 * deployStatus.steps.length) - } - }, [deployStatus]) - function result() { if (err_msg) { return '失败' } else if (total_progress === 100) { - return '成功 (请进入 "集群管理" 界面对该集群进行启动,停止,扩容,缩容,销毁等操作)' + return '成功 (请进入 "集群管理" 界面对该集群进行启动,停止,缩容,销毁等操作)' } else { return '进行中' } diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 6dc0dc9b69..2d519ab627 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -26,8 +26,8 @@ import DeploymentTable, { import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' import { Root } from '../../components/Root' -import DeploymentStatus, { IDeploymentStatus } from './DeploymentStatus' -import { getDeploymentStatus, deployCluster } from '../../utils/api' +import OperationStatus, { IOperationStatus } from './OperationStatus' +import { getStatus, deployCluster } from '../../utils/api' import { IGlobalLoginOptions } from '../Machines/GlobalLoginOptionsForm' // TODO: fetch from API @@ -65,7 +65,7 @@ export default function DeploymentPage() { const [viewDeployStatus, setViewDeployStatus] = useState(false) const [deployStatus, setDeployStatus] = useState< - IDeploymentStatus | undefined + IOperationStatus | undefined >(undefined) const [reloadTimes, setReloadTimes] = useState(0) @@ -84,7 +84,7 @@ export default function DeploymentPage() { useEffect(() => { const id = setInterval(() => { - getDeploymentStatus().then(({ data }) => { + getStatus().then(({ data }) => { if (data !== undefined) { setDeployStatus(data) if ( @@ -329,7 +329,7 @@ export default function DeploymentPage() { onCancel={() => setViewDeployStatus(false)} > {deployStatus ? ( - + ) : (
Loading...
)} diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts index 9909bcd6ac..cccba44ba6 100644 --- a/web-ui/src/utils/api.ts +++ b/web-ui/src/utils/api.ts @@ -12,8 +12,8 @@ export function deployCluster(deployment: any) { return request(fullUrl('deploy'), 'POST', deployment) } -export function getDeploymentStatus() { - return request(fullUrl('deploy_status')) +export function getStatus() { + return request(fullUrl('status')) } export function getClusterList() { @@ -38,7 +38,19 @@ export function stopCluster(clusterName: string) { export function scaleInCluster( clusterName: string, - data: { node_id: string; force: boolean } + scaleInOpts: { node_id: string; force: boolean } ) { - return request(fullUrl(`clusters/${clusterName}/scale_in`), 'POST', data) + return request( + fullUrl(`clusters/${clusterName}/scale_in`), + 'POST', + scaleInOpts + ) +} + +export function scaleOutCluster(clusterName: string, scaleOutOpts: any) { + return request( + fullUrl(`clusters/${clusterName}/scale_in`), + 'POST', + scaleOutOpts + ) } From 457f48706c0149dacd164ed4d8ea894730dd0af2 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 25 Aug 2020 15:02:59 +0800 Subject: [PATCH 033/126] record scale out status --- pkg/cluster/manager.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 6406dc0bc6..85d7518e79 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -1383,9 +1383,14 @@ func (m *Manager) ScaleOut( sshTimeout int64, nativeSSH bool, ) error { + // reset + operationInfo = OperationInfo{operationType: "scaleOut", clusterName: clusterName} + metadata, err := m.meta(clusterName) if err != nil { // not allowing validation errors - return perrs.AddStack(err) + err = perrs.AddStack(err) + operationInfo.err = err + return err } topo := metadata.GetTopology() @@ -1393,6 +1398,7 @@ func (m *Manager) ScaleOut( // not allowing validation errors if err := topo.Validate(); err != nil { + operationInfo.err = err return err } @@ -1405,27 +1411,33 @@ func (m *Manager) ScaleOut( // the whole topology back to normal state. if err := clusterutil.ParseTopologyYaml(topoFile, newPart); err != nil && !errors.Is(perrs.Cause(err), spec.ErrNoTiSparkMaster) { + operationInfo.err = err return err } if err := validateNewTopo(newPart); err != nil { + operationInfo.err = err return err } // Abort scale out operation if the merged topology is invalid mergedTopo := topo.MergeTopo(newPart) if err := mergedTopo.Validate(); err != nil { + operationInfo.err = err return err } clusterList, err := m.specManager.GetAllClusters() if err != nil { + operationInfo.err = err return err } if err := spec.CheckClusterPortConflict(clusterList, clusterName, mergedTopo); err != nil { + operationInfo.err = err return err } if err := spec.CheckClusterDirConflict(clusterList, clusterName, mergedTopo); err != nil { + operationInfo.err = err return err } @@ -1439,27 +1451,35 @@ func (m *Manager) ScaleOut( if !skipConfirm { // patchedComponents are components that have been patched and overwrited if err := m.confirmTopology(clusterName, base.Version, newPart, patchedComponents); err != nil { + operationInfo.err = err return err } } sshConnProps, err := cliutil.ReadIdentityFileOrPassword(opt.IdentityFile, opt.UsePassword) if err != nil { + operationInfo.err = err return err } // Build the scale out tasks t, err := buildScaleOutTask(m, clusterName, metadata, mergedTopo, opt, sshConnProps, newPart, patchedComponents, optTimeout, sshTimeout, nativeSSH, afterDeploy, final) if err != nil { + operationInfo.err = err return err } + operationInfo.curTask = t.(*task.Serial) + if err := t.Execute(task.NewContext()); err != nil { if errorx.Cast(err) != nil { // FIXME: Map possible task errors and give suggestions. + operationInfo.err = err return err } - return perrs.Trace(err) + err = perrs.Trace(err) + operationInfo.err = err + return err } log.Infof("Scaled cluster `%s` out successfully", clusterName) From 43cb6b5410c289f613e669662ffb7ec24bb2ea3c Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 25 Aug 2020 15:42:57 +0800 Subject: [PATCH 034/126] scale out frontend --- pkg/cluster/task/task.go | 7 +- .../src/pages/Deployment/OperationStatus.tsx | 13 ++- web-ui/src/pages/Deployment/index.tsx | 96 ++++++++++++------- web-ui/src/utils/api.ts | 2 +- 4 files changed, 78 insertions(+), 40 deletions(-) diff --git a/pkg/cluster/task/task.go b/pkg/cluster/task/task.go index c12acc84c5..96b46d7d96 100644 --- a/pkg/cluster/task/task.go +++ b/pkg/cluster/task/task.go @@ -246,7 +246,12 @@ func (s *Serial) ComputeProgress() ([]string, int) { } } - return stepsStatus, finishedSteps * 100 / allStepsCount + progress := 0 + if allStepsCount > 0 { + progress = finishedSteps * 100 / allStepsCount + } + + return stepsStatus, progress } // NewParallel create a Parallel task. diff --git a/web-ui/src/pages/Deployment/OperationStatus.tsx b/web-ui/src/pages/Deployment/OperationStatus.tsx index 2ffe78a9ca..f304bba222 100644 --- a/web-ui/src/pages/Deployment/OperationStatus.tsx +++ b/web-ui/src/pages/Deployment/OperationStatus.tsx @@ -16,7 +16,13 @@ export interface IOperationStatusProps { export default function OperationStatus({ operationStatus, }: IOperationStatusProps) { - const { cluster_name, total_progress, steps, err_msg } = operationStatus + const { + operation_type, + cluster_name, + total_progress, + steps, + err_msg, + } = operationStatus const detailInfoRef = useRef(null) function result() { @@ -30,7 +36,7 @@ export default function OperationStatus({ } if (cluster_name === '') { - return

当前没有正在进行的部署任务

+ return

当前没有正在进行的部署或扩容任务

} return ( @@ -40,8 +46,9 @@ export default function OperationStatus({ status={total_progress < 100 ? 'active' : 'success'} />
+

正在执行的操作:{operation_type === 'deploy' ? '部署' : '扩容'}

集群:{cluster_name}

-

部署结果: {result()}

+

执行结果: {result()}

{err_msg && ( <>

错误信息:

diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 2d519ab627..c674690289 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -1,6 +1,15 @@ import React, { useCallback, useState, useEffect } from 'react' import { useLocalStorageState } from 'ahooks' -import { Drawer, Space, Button, Modal, Form, Input, Select } from 'antd' +import { + Drawer, + Space, + Button, + Modal, + Form, + Input, + Select, + message, +} from 'antd' import uniqid from 'uniqid' import yaml from 'yaml' @@ -27,8 +36,9 @@ import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' import { Root } from '../../components/Root' import OperationStatus, { IOperationStatus } from './OperationStatus' -import { getStatus, deployCluster } from '../../utils/api' +import { getStatus, deployCluster, scaleOutCluster } from '../../utils/api' import { IGlobalLoginOptions } from '../Machines/GlobalLoginOptionsForm' +import { ExclamationCircleOutlined } from '@ant-design/icons' // TODO: fetch from API const TIDB_VERSIONS = [ @@ -64,7 +74,7 @@ export default function DeploymentPage() { const [viewDeployStatus, setViewDeployStatus] = useState(false) - const [deployStatus, setDeployStatus] = useState< + const [operationStatus, setOperationStatus] = useState< IOperationStatus | undefined >(undefined) @@ -86,7 +96,7 @@ export default function DeploymentPage() { const id = setInterval(() => { getStatus().then(({ data }) => { if (data !== undefined) { - setDeployStatus(data) + setOperationStatus(data) if ( data.total_progress === 100 || data.err_msg || @@ -204,22 +214,13 @@ export default function DeploymentPage() { ) function handleFinish(values: any) { - setDeployReq(values) - - if (deployStatus !== undefined) { - const { cluster_name, total_progress, err_msg } = deployStatus - if (cluster_name === values.cluster_name) { - Modal.error({ - title: '部署暂时无法进行', - content: '该集群正在或已经部署,请点击 "查看部署进度" 查看详情', - }) - return - } - + if (operationStatus !== undefined) { + const { cluster_name, total_progress, err_msg } = operationStatus if (cluster_name !== '' && err_msg === '' && total_progress < 100) { Modal.error({ - title: '部署暂时无法进行', - content: '当前有正在进行中的部署任务,请点击 "查看部署进度" 进行查看', + title: '操作暂时无法进行', + content: + '当前有正在进行中的部署或扩容任务,请点击 "查看进度" 进行查看', }) return } @@ -228,16 +229,43 @@ export default function DeploymentPage() { const topoYaml = yaml.stringify( genTopo({ machines, components, forScaleOut: previewYaml.forScaleOut }) ) - deployCluster({ - ...values, - topo_yaml: topoYaml, - global_login_options: globalLoginOptions, - }) - setDeployStatus(undefined) + if (previewYaml.forScaleOut) { + scaleOutCluster(values.cluster_name, { + topo_yaml: topoYaml, + global_login_options: globalLoginOptions, + }) + } else { + deployCluster({ + ...values, + topo_yaml: topoYaml, + global_login_options: globalLoginOptions, + }) + } + setOperationStatus(undefined) setReloadTimes((pre) => pre + 1) setViewDeployStatus(true) } + function startOperate() { + setPreviewYaml((prev) => ({ ...prev, preview: false })) + form.validateFields().then((values) => { + setDeployReq(values as any) + if (previewYaml.forScaleOut) { + Modal.confirm({ + title: `开始扩容`, + icon: , + content: + '即将开始扩容,请确保在扩容之前已经启动集群,否则扩容将失败!', + okText: '扩容', + cancelText: '取消', + onOk: () => handleFinish(values), + }) + } else { + handleFinish(values) + } + }) + } + return ( @@ -267,7 +295,7 @@ export default function DeploymentPage() { onClick={() => setPreviewYaml({ preview: true, forScaleOut: false }) } - disabled={deployStatus === undefined} + disabled={operationStatus === undefined} > 预览部署 YAML @@ -275,13 +303,11 @@ export default function DeploymentPage() { onClick={() => setPreviewYaml({ preview: true, forScaleOut: true }) } - disabled={deployStatus === undefined} + disabled={operationStatus === undefined} > 预览扩容 YAML - + @@ -309,11 +335,11 @@ export default function DeploymentPage() { setPreviewYaml({ preview: false, forScaleOut: false })} - onCancel={() => setPreviewYaml({ preview: false, forScaleOut: false })} + onOk={startOperate} + onCancel={() => setPreviewYaml((prev) => ({ ...prev, preview: false }))} > setViewDeployStatus(false)} onCancel={() => setViewDeployStatus(false)} > - {deployStatus ? ( - + {operationStatus ? ( + ) : (
Loading...
)} diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts index cccba44ba6..75ca72628c 100644 --- a/web-ui/src/utils/api.ts +++ b/web-ui/src/utils/api.ts @@ -49,7 +49,7 @@ export function scaleInCluster( export function scaleOutCluster(clusterName: string, scaleOutOpts: any) { return request( - fullUrl(`clusters/${clusterName}/scale_in`), + fullUrl(`clusters/${clusterName}/scale_out`), 'POST', scaleOutOpts ) From 6c6bd5a1045890e1800944b3b2c67d137180d478 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 25 Aug 2020 15:53:08 +0800 Subject: [PATCH 035/126] refine --- web-ui/src/pages/Deployment/DeploymentTable.tsx | 2 +- web-ui/src/pages/Deployment/OperationStatus.tsx | 15 +++++++++++---- web-ui/src/pages/Deployment/TopoPreview.tsx | 9 ++++++++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index 9cb13edc32..b1e6a18dd0 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -159,7 +159,7 @@ export default function DeploymentTable({ } return (
- -  + --  {rec.type} {rec.for_scale_out ? ' (Scale)' : ''} diff --git a/web-ui/src/pages/Deployment/OperationStatus.tsx b/web-ui/src/pages/Deployment/OperationStatus.tsx index f304bba222..b0daa0a6d5 100644 --- a/web-ui/src/pages/Deployment/OperationStatus.tsx +++ b/web-ui/src/pages/Deployment/OperationStatus.tsx @@ -35,16 +35,23 @@ export default function OperationStatus({ } } + function progressBarStatus() { + if (err_msg) { + return 'exception' + } else if (total_progress < 100) { + return 'active' + } else { + return 'success' + } + } + if (cluster_name === '') { return

当前没有正在进行的部署或扩容任务

} return (
- +

正在执行的操作:{operation_type === 'deploy' ? '部署' : '扩容'}

集群:{cluster_name}

diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index a70a61f07e..e8616f831d 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -88,7 +88,14 @@ export default function TopoPreview({ ]) return ( -
+
{/* TODO: syntax highlight */}
{yaml.stringify(topo)}
From 70420394c14ac63b752d99bb4cf5978de0aca228 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 25 Aug 2020 16:33:53 +0800 Subject: [PATCH 036/126] refine --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 64 +++++++++++---------- web-ui/src/pages/Deployment/index.tsx | 4 +- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 270324a79b..9a88c5b2d1 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -183,7 +183,38 @@ export default function ClusterDetailPage() { return ( - +
+ + + + + + + + - - - - - - - +

Name: {cluster.name}

User: {cluster.user}

diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index c674690289..a31172f069 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -297,7 +297,7 @@ export default function DeploymentPage() { } disabled={operationStatus === undefined} > - 预览部署 YAML + 预览部署拓扑 From 75a6f185483c7ea8616f42d55924475ff12d9444 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 25 Aug 2020 22:38:56 +0800 Subject: [PATCH 037/126] refine, only show started steps --- pkg/cluster/task/step.go | 3 +++ pkg/cluster/task/task.go | 31 ++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/pkg/cluster/task/step.go b/pkg/cluster/task/step.go index 8641459e82..8f43b040e0 100644 --- a/pkg/cluster/task/step.go +++ b/pkg/cluster/task/step.go @@ -123,6 +123,9 @@ func (s *StepDisplay) handleTaskBegin(task Task) { } oneTaskPercentHalf := (100 / len(s.children)) / 2 + if oneTaskPercentHalf == 0 { + oneTaskPercentHalf = 1 + } s.progress = s.startedTask*100/len(s.children) + oneTaskPercentHalf s.startedTask++ diff --git a/pkg/cluster/task/task.go b/pkg/cluster/task/task.go index 96b46d7d96..8fe1b3a4f1 100644 --- a/pkg/cluster/task/task.go +++ b/pkg/cluster/task/task.go @@ -222,28 +222,41 @@ func (s *Serial) ComputeProgress() ([]string, int) { allStepsCount := 0 finishedSteps := 0 - handleStepDisplay := func(sd *StepDisplay) { + handleStepDisplay := func(sd *StepDisplay) string { allStepsCount++ if sd.progress == 100 { finishedSteps++ } - // TODO: refine, not append progress 0 steps? - stepsStatus = append(stepsStatus, fmt.Sprintf("%s ... %d%%", sd.prefix, sd.progress)) + if sd.progress > 0 { + return fmt.Sprintf("%s ... %d%%", sd.prefix, sd.progress) + } + return "" } for _, step := range s.inner { + // for deploy if sd, ok := step.(*StepDisplay); ok { - handleStepDisplay(sd) + s := handleStepDisplay(sd) + if s != "" { + stepsStatus = append(stepsStatus, s) + } } if psd, ok := step.(*ParallelStepDisplay); ok { - // TODO: refine, not append it if all sub steps progress are 0? - stepsStatus = append(stepsStatus, psd.prefix) - for _, s := range psd.inner.inner { - if sd, ok := s.(*StepDisplay); ok { - handleStepDisplay(sd) + steps := []string{} + for _, t := range psd.inner.inner { + if sd, ok := t.(*StepDisplay); ok { + s := handleStepDisplay(sd) + if s != "" { + steps = append(steps, s) + } } } + if len(steps) > 0 { + stepsStatus = append(stepsStatus, psd.prefix) + stepsStatus = append(stepsStatus, steps...) + } } + // for scale out } progress := 0 From aed394d080783141f7c7cfbe3b09ef2d3ac714da Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 25 Aug 2020 23:13:23 +0800 Subject: [PATCH 038/126] fix --- pkg/cluster/task/task.go | 49 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/pkg/cluster/task/task.go b/pkg/cluster/task/task.go index 8fe1b3a4f1..e7715a32d8 100644 --- a/pkg/cluster/task/task.go +++ b/pkg/cluster/task/task.go @@ -65,6 +65,10 @@ type ( Serial struct { hideDetailDisplay bool inner []Task + + startedTask int + progress int // 0~100 + curTaskDesc string } // Parallel will execute a bundle of task in parallelism way @@ -185,6 +189,16 @@ func (s *Serial) Execute(ctx *Context) error { log.Infof("+ [ Serial ] - %s", t.String()) } } + + // save progress internal + oneTaskPercentHalf := (100 / len(s.inner)) / 2 + if oneTaskPercentHalf == 0 { + oneTaskPercentHalf = 1 + } + s.progress = s.startedTask*100/len(s.inner) + oneTaskPercentHalf + s.curTaskDesc = t.String() + s.startedTask++ + ctx.ev.PublishTaskBegin(t) err := t.Execute(ctx) ctx.ev.PublishTaskFinish(t, err) @@ -192,6 +206,7 @@ func (s *Serial) Execute(ctx *Context) error { return err } } + s.progress = 100 return nil } @@ -233,6 +248,17 @@ func (s *Serial) ComputeProgress() ([]string, int) { return "" } + handleSerial := func(st *Serial) string { + allStepsCount++ + if st.progress == 100 { + finishedSteps++ + } + if st.progress > 0 { + return fmt.Sprintf("- %s ... %d%%", st.curTaskDesc, st.progress) + } + return "" + } + for _, step := range s.inner { // for deploy if sd, ok := step.(*StepDisplay); ok { @@ -256,15 +282,32 @@ func (s *Serial) ComputeProgress() ([]string, int) { stepsStatus = append(stepsStatus, steps...) } } + // for scale out + if st, ok := step.(*Serial); ok { + s := handleSerial(st) + if s != "" { + stepsStatus = append(stepsStatus, s) + } + } + if pt, ok := step.(*Parallel); ok { + for _, t := range pt.inner { + if st, ok := t.(*Serial); ok { + s := handleSerial(st) + if s != "" { + stepsStatus = append(stepsStatus, s) + } + } + } + } } - progress := 0 + totalProgress := 0 if allStepsCount > 0 { - progress = finishedSteps * 100 / allStepsCount + totalProgress = finishedSteps * 100 / allStepsCount } - return stepsStatus, progress + return stepsStatus, totalProgress } // NewParallel create a Parallel task. From 9a9213259077a55282f1c86662af6c30342747c7 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Wed, 26 Aug 2020 12:01:53 +0800 Subject: [PATCH 039/126] refine save progress and status for scale out --- pkg/cluster/manager.go | 13 ++++-- pkg/cluster/task/task.go | 62 +++++++++++---------------- web-ui/src/pages/Deployment/index.tsx | 2 +- 3 files changed, 36 insertions(+), 41 deletions(-) diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 85d7518e79..884d5c2378 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -1239,9 +1239,16 @@ func (m *Manager) GetOperationStatus() OperationStatus { Steps: []string{}, } if operationInfo.curTask != nil { - steps, progress := operationInfo.curTask.ComputeProgress() - operationStatus.TotalProgress = progress - operationStatus.Steps = steps + if operationInfo.operationType == "deploy" { + steps, progress := operationInfo.curTask.ComputeProgress() + operationStatus.TotalProgress = progress + operationStatus.Steps = steps + } else if operationInfo.operationType == "scaleOut" { + operationStatus.TotalProgress = operationInfo.curTask.Progress + operationStatus.Steps = []string{} + operationStatus.Steps = append(operationStatus.Steps, operationInfo.curTask.Steps...) + operationStatus.Steps = append(operationStatus.Steps, operationInfo.curTask.CurTaskSteps...) + } } if operationInfo.err != nil { operationStatus.ErrMsg = operationInfo.err.Error() diff --git a/pkg/cluster/task/task.go b/pkg/cluster/task/task.go index e7715a32d8..29e1b7fdc7 100644 --- a/pkg/cluster/task/task.go +++ b/pkg/cluster/task/task.go @@ -66,9 +66,10 @@ type ( hideDetailDisplay bool inner []Task - startedTask int - progress int // 0~100 - curTaskDesc string + startedTasks int + Progress int // 0~100 + CurTaskSteps []string + Steps []string } // Parallel will execute a bundle of task in parallelism way @@ -195,21 +196,38 @@ func (s *Serial) Execute(ctx *Context) error { if oneTaskPercentHalf == 0 { oneTaskPercentHalf = 1 } - s.progress = s.startedTask*100/len(s.inner) + oneTaskPercentHalf - s.curTaskDesc = t.String() - s.startedTask++ + s.Progress = s.startedTasks*100/len(s.inner) + oneTaskPercentHalf + s.startedTasks++ + s.saveSteps(t, "Starting") ctx.ev.PublishTaskBegin(t) err := t.Execute(ctx) ctx.ev.PublishTaskFinish(t, err) if err != nil { + s.saveSteps(t, "Error") return err } + s.saveSteps(t, "Done") } - s.progress = 100 + s.Progress = 100 return nil } +// stepStatus: Starting, Error, Done +func (s *Serial) saveSteps(curTask Task, stepStatus string) { + curTaskSteps := strings.Split(curTask.String(), "\n") + s.CurTaskSteps = []string{} + for _, l := range curTaskSteps { + if strings.TrimSpace(l) != "" { + s.CurTaskSteps = append(s.CurTaskSteps, fmt.Sprintf("- %s ... %s", l, stepStatus)) + } + } + if stepStatus == "Done" { + s.Steps = append(s.Steps, s.CurTaskSteps...) + s.CurTaskSteps = []string{} + } +} + // Rollback implements the Task interface func (s *Serial) Rollback(ctx *Context) error { // Rollback in reverse order @@ -248,19 +266,7 @@ func (s *Serial) ComputeProgress() ([]string, int) { return "" } - handleSerial := func(st *Serial) string { - allStepsCount++ - if st.progress == 100 { - finishedSteps++ - } - if st.progress > 0 { - return fmt.Sprintf("- %s ... %d%%", st.curTaskDesc, st.progress) - } - return "" - } - for _, step := range s.inner { - // for deploy if sd, ok := step.(*StepDisplay); ok { s := handleStepDisplay(sd) if s != "" { @@ -282,24 +288,6 @@ func (s *Serial) ComputeProgress() ([]string, int) { stepsStatus = append(stepsStatus, steps...) } } - - // for scale out - if st, ok := step.(*Serial); ok { - s := handleSerial(st) - if s != "" { - stepsStatus = append(stepsStatus, s) - } - } - if pt, ok := step.(*Parallel); ok { - for _, t := range pt.inner { - if st, ok := t.(*Serial); ok { - s := handleSerial(st) - if s != "" { - stepsStatus = append(stepsStatus, s) - } - } - } - } } totalProgress := 0 diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index a31172f069..c7d884c409 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -255,7 +255,7 @@ export default function DeploymentPage() { title: `开始扩容`, icon: , content: - '即将开始扩容,请确保在扩容之前已经启动集群,否则扩容将失败!', + '即将开始扩容,请确保在扩容之前已经集群已部署成功,否则扩容将失败!', okText: '扩容', cancelText: '取消', onOk: () => handleFinish(values), From 7896fdca30d9e0b2eead0ec22f60c2ebe6f4d9b7 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 10:55:18 +0800 Subject: [PATCH 040/126] refine --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3406b19d37..df2230a74c 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ include ./tests/Makefile # Build TiUP and all components build: tiup components -components: playground client cluster dm bench web server +components: playground client cluster dm bench web server tiup: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup From 023518e5ac32ad3496cbd3ec509cad7e6baaea44 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 11:29:39 +0800 Subject: [PATCH 041/126] update save deploy and scale out status logic --- components/web/main.go | 4 +- pkg/cluster/manager.go | 114 ++++++++++++++++++++++++++--------------- 2 files changed, 75 insertions(+), 43 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index b6c9a64cf2..3dfa850c5b 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -86,7 +86,7 @@ func deployHandler(c *gin.Context) { tmpfile.Close() go func() { - _ = manager.Deploy( + manager.DoDeploy( req.ClusterName, req.TiDBVersion, topoFilePath, @@ -265,7 +265,7 @@ func scaleOutClusterHandler(c *gin.Context) { tmpfile.Close() go func() { - _ = manager.ScaleOut( + manager.DoScaleOut( clusterName, topoFilePath, command.PostScaleOutHook, diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 884d5c2378..e1e5ed1baa 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -56,9 +56,21 @@ var ( operationInfo OperationInfo = OperationInfo{} ) +// OperationType represents the operation type +type OperationType string + +const ( + operationDeploy OperationType = "deploy" + // operationStart OperationType = "start" + // operationStop OperationType = "stop" + // operationScaleIn OperationType = "scaleIn" + operationScaleOut OperationType = "scaleOut" + // operationDestroy OperationType = "destroy" +) + // OperationInfo records latest operation task and related info type OperationInfo struct { - operationType string // "deploy" | "scaleOut" + operationType OperationType clusterName string curTask *task.Serial err error @@ -956,6 +968,33 @@ type DeployerInstance interface { Deploy(b *task.Builder, srcPath string, deployDir string, version string, clusterName string, clusterVersion string) } +// DoDeploy do things about deploy +// TODO: change a method name +func (m *Manager) DoDeploy( + clusterName string, + clusterVersion string, + topoFile string, + opt DeployOptions, + afterDeploy func(b *task.Builder, newPart spec.Topology), + skipConfirm bool, + optTimeout int64, + sshTimeout int64, + nativeSSH bool, +) { + operationInfo = OperationInfo{operationType: operationDeploy, clusterName: clusterName} + operationInfo.err = m.Deploy( + clusterName, + clusterVersion, + topoFile, + opt, + afterDeploy, + skipConfirm, + optTimeout, + sshTimeout, + nativeSSH, + ) +} + // Deploy a cluster. func (m *Manager) Deploy( clusterName string, @@ -968,18 +1007,13 @@ func (m *Manager) Deploy( sshTimeout int64, nativeSSH bool, ) error { - // reset - operationInfo = OperationInfo{operationType: "deploy", clusterName: clusterName} - if err := clusterutil.ValidateClusterNameOrError(clusterName); err != nil { - operationInfo.err = err return err } exist, err := m.specManager.Exist(clusterName) if err != nil { err = perrs.AddStack(err) - operationInfo.err = err return err } @@ -988,7 +1022,6 @@ func (m *Manager) Deploy( err = errDeployNameDuplicate. New("Cluster name '%s' is duplicated", clusterName). WithProperty(cliutil.SuggestionFromFormat("Please specify another cluster name")) - operationInfo.err = err return err } @@ -1000,7 +1033,6 @@ func (m *Manager) Deploy( // the whole topology back to normal state. if err := clusterutil.ParseTopologyYaml(topoFile, topo); err != nil && !errors.Is(perrs.Cause(err), spec.ErrNoTiSparkMaster) { - operationInfo.err = err return err } @@ -1008,28 +1040,23 @@ func (m *Manager) Deploy( clusterList, err := m.specManager.GetAllClusters() if err != nil { - operationInfo.err = err return err } if err := spec.CheckClusterPortConflict(clusterList, clusterName, topo); err != nil { - operationInfo.err = err return err } if err := spec.CheckClusterDirConflict(clusterList, clusterName, topo); err != nil { - operationInfo.err = err return err } if !skipConfirm { if err := m.confirmTopology(clusterName, clusterVersion, topo, set.NewStringSet()); err != nil { - operationInfo.err = err return err } } sshConnProps, err := cliutil.ReadIdentityFileOrPassword(opt.IdentityFile, opt.UsePassword) if err != nil { - operationInfo.err = err return err } @@ -1037,7 +1064,6 @@ func (m *Manager) Deploy( err = errorx.InitializationFailed. Wrap(err, "Failed to create cluster metadata directory '%s'", m.specManager.Path(clusterName)). WithProperty(cliutil.SuggestionFromString("Please check file system permissions and try again.")) - operationInfo.err = err return err } @@ -1098,7 +1124,6 @@ func (m *Manager) Deploy( }) if iterErr != nil { - operationInfo.err = err return iterErr } @@ -1198,11 +1223,9 @@ func (m *Manager) Deploy( if err := t.Execute(task.NewContext()); err != nil { if errorx.Cast(err) != nil { // FIXME: Map possible task errors and give suggestions. - operationInfo.err = err return err } err = perrs.AddStack(err) - operationInfo.err = err return err } @@ -1212,7 +1235,6 @@ func (m *Manager) Deploy( if err != nil { err = perrs.AddStack(err) - operationInfo.err = err return err } @@ -1224,11 +1246,11 @@ func (m *Manager) Deploy( // OperationStatus represents the current deployment status type OperationStatus struct { - OperationType string `json:"operation_type"` - ClusterName string `json:"cluster_name"` - TotalProgress int `json:"total_progress"` - Steps []string `json:"steps"` - ErrMsg string `json:"err_msg"` + OperationType OperationType `json:"operation_type"` + ClusterName string `json:"cluster_name"` + TotalProgress int `json:"total_progress"` + Steps []string `json:"steps"` + ErrMsg string `json:"err_msg"` } // GetOperationStatus returns the current operations status, including progress, steps, err message @@ -1239,11 +1261,11 @@ func (m *Manager) GetOperationStatus() OperationStatus { Steps: []string{}, } if operationInfo.curTask != nil { - if operationInfo.operationType == "deploy" { + if operationInfo.operationType == operationDeploy { steps, progress := operationInfo.curTask.ComputeProgress() operationStatus.TotalProgress = progress operationStatus.Steps = steps - } else if operationInfo.operationType == "scaleOut" { + } else if operationInfo.operationType == operationScaleOut { operationStatus.TotalProgress = operationInfo.curTask.Progress operationStatus.Steps = []string{} operationStatus.Steps = append(operationStatus.Steps, operationInfo.curTask.Steps...) @@ -1378,6 +1400,32 @@ func (m *Manager) ScaleIn( return nil } +// DoScaleOut scale out the cluster. +func (m *Manager) DoScaleOut( + clusterName string, + topoFile string, + afterDeploy func(b *task.Builder, newPart spec.Topology), + final func(b *task.Builder, name string, meta spec.Metadata), + opt ScaleOutOptions, + skipConfirm bool, + optTimeout int64, + sshTimeout int64, + nativeSSH bool, +) { + operationInfo = OperationInfo{operationType: operationScaleOut, clusterName: clusterName} + operationInfo.err = m.ScaleOut( + clusterName, + topoFile, + afterDeploy, + final, + opt, + skipConfirm, + optTimeout, + sshTimeout, + nativeSSH, + ) +} + // ScaleOut scale out the cluster. func (m *Manager) ScaleOut( clusterName string, @@ -1390,13 +1438,9 @@ func (m *Manager) ScaleOut( sshTimeout int64, nativeSSH bool, ) error { - // reset - operationInfo = OperationInfo{operationType: "scaleOut", clusterName: clusterName} - metadata, err := m.meta(clusterName) if err != nil { // not allowing validation errors err = perrs.AddStack(err) - operationInfo.err = err return err } @@ -1405,7 +1449,6 @@ func (m *Manager) ScaleOut( // not allowing validation errors if err := topo.Validate(); err != nil { - operationInfo.err = err return err } @@ -1418,33 +1461,27 @@ func (m *Manager) ScaleOut( // the whole topology back to normal state. if err := clusterutil.ParseTopologyYaml(topoFile, newPart); err != nil && !errors.Is(perrs.Cause(err), spec.ErrNoTiSparkMaster) { - operationInfo.err = err return err } if err := validateNewTopo(newPart); err != nil { - operationInfo.err = err return err } // Abort scale out operation if the merged topology is invalid mergedTopo := topo.MergeTopo(newPart) if err := mergedTopo.Validate(); err != nil { - operationInfo.err = err return err } clusterList, err := m.specManager.GetAllClusters() if err != nil { - operationInfo.err = err return err } if err := spec.CheckClusterPortConflict(clusterList, clusterName, mergedTopo); err != nil { - operationInfo.err = err return err } if err := spec.CheckClusterDirConflict(clusterList, clusterName, mergedTopo); err != nil { - operationInfo.err = err return err } @@ -1458,21 +1495,18 @@ func (m *Manager) ScaleOut( if !skipConfirm { // patchedComponents are components that have been patched and overwrited if err := m.confirmTopology(clusterName, base.Version, newPart, patchedComponents); err != nil { - operationInfo.err = err return err } } sshConnProps, err := cliutil.ReadIdentityFileOrPassword(opt.IdentityFile, opt.UsePassword) if err != nil { - operationInfo.err = err return err } // Build the scale out tasks t, err := buildScaleOutTask(m, clusterName, metadata, mergedTopo, opt, sshConnProps, newPart, patchedComponents, optTimeout, sshTimeout, nativeSSH, afterDeploy, final) if err != nil { - operationInfo.err = err return err } @@ -1481,11 +1515,9 @@ func (m *Manager) ScaleOut( if err := t.Execute(task.NewContext()); err != nil { if errorx.Cast(err) != nil { // FIXME: Map possible task errors and give suggestions. - operationInfo.err = err return err } err = perrs.Trace(err) - operationInfo.err = err return err } From d59294864ad50fbb49add6efa12bf9f240cb9be2 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 11:38:29 +0800 Subject: [PATCH 042/126] update start cluster, record status as well --- components/web/main.go | 22 ++++++++++------------ pkg/cluster/manager.go | 12 +++++++++--- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index 3dfa850c5b..c952ca9e0c 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -151,19 +151,17 @@ func destroyClusterHandler(c *gin.Context) { func startClusterHandler(c *gin.Context) { clusterName := c.Param("clusterName") - err := manager.StartCluster(clusterName, operator.Options{ - SSHTimeout: 5, - OptTimeout: 120, - APITimeout: 300, - }, func(b *task.Builder, metadata spec.Metadata) { - tidbMeta := metadata.(*spec.ClusterMeta) - b.UpdateTopology(clusterName, tidbMeta, nil) - }) - if err != nil { - _ = c.Error(err) - return - } + go func() { + manager.DoStartCluster(clusterName, operator.Options{ + SSHTimeout: 5, + OptTimeout: 120, + APITimeout: 300, + }, func(b *task.Builder, metadata spec.Metadata) { + tidbMeta := metadata.(*spec.ClusterMeta) + b.UpdateTopology(clusterName, tidbMeta, nil) + }) + }() c.Status(http.StatusNoContent) } diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index e1e5ed1baa..d3bfc2e586 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -61,7 +61,7 @@ type OperationType string const ( operationDeploy OperationType = "deploy" - // operationStart OperationType = "start" + operationStart OperationType = "start" // operationStop OperationType = "stop" // operationScaleIn OperationType = "scaleIn" operationScaleOut OperationType = "scaleOut" @@ -92,6 +92,12 @@ func NewManager(sysName string, specManager *spec.SpecManager, bindVersion spec. } } +// DoStartCluster start the cluster with specified name. +func (m *Manager) DoStartCluster(name string, options operator.Options, fn ...func(b *task.Builder, metadata spec.Metadata)) { + operationInfo = OperationInfo{operationType: operationStart, clusterName: name} + operationInfo.err = m.StartCluster(name, options, fn...) +} + // StartCluster start the cluster with specified name. func (m *Manager) StartCluster(name string, options operator.Options, fn ...func(b *task.Builder, metadata spec.Metadata)) error { log.Infof("Starting cluster %s...", name) @@ -118,6 +124,7 @@ func (m *Manager) StartCluster(name string, options operator.Options, fn ...func } t := b.Build() + operationInfo.curTask = t.(*task.Serial) if err := t.Execute(task.NewContext()); err != nil { if errorx.Cast(err) != nil { @@ -1217,7 +1224,6 @@ func (m *Manager) Deploy( } t := builder.Build() - operationInfo.curTask = t.(*task.Serial) if err := t.Execute(task.NewContext()); err != nil { @@ -1265,7 +1271,7 @@ func (m *Manager) GetOperationStatus() OperationStatus { steps, progress := operationInfo.curTask.ComputeProgress() operationStatus.TotalProgress = progress operationStatus.Steps = steps - } else if operationInfo.operationType == operationScaleOut { + } else { operationStatus.TotalProgress = operationInfo.curTask.Progress operationStatus.Steps = []string{} operationStatus.Steps = append(operationStatus.Steps, operationInfo.curTask.Steps...) From 299c066c7b68ab68513723942cbbb88e1c960972 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 11:43:59 +0800 Subject: [PATCH 043/126] update stop cluster, record status as well --- components/web/main.go | 17 +++++++---------- pkg/cluster/manager.go | 9 ++++++++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index c952ca9e0c..312cf74d3c 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -168,16 +168,13 @@ func startClusterHandler(c *gin.Context) { func stopClusterHandler(c *gin.Context) { clusterName := c.Param("clusterName") - err := manager.StopCluster(clusterName, operator.Options{ - SSHTimeout: 5, - OptTimeout: 120, - APITimeout: 300, - }) - - if err != nil { - _ = c.Error(err) - return - } + go func() { + manager.DoStopCluster(clusterName, operator.Options{ + SSHTimeout: 5, + OptTimeout: 120, + APITimeout: 300, + }) + }() c.Status(http.StatusNoContent) } diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index d3bfc2e586..886404bbdf 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -62,7 +62,7 @@ type OperationType string const ( operationDeploy OperationType = "deploy" operationStart OperationType = "start" - // operationStop OperationType = "stop" + operationStop OperationType = "stop" // operationScaleIn OperationType = "scaleIn" operationScaleOut OperationType = "scaleOut" // operationDestroy OperationType = "destroy" @@ -138,6 +138,12 @@ func (m *Manager) StartCluster(name string, options operator.Options, fn ...func return nil } +// DoStopCluster stop the cluster. +func (m *Manager) DoStopCluster(clusterName string, options operator.Options) { + operationInfo = OperationInfo{operationType: operationStop, clusterName: clusterName} + operationInfo.err = m.StopCluster(clusterName, options) +} + // StopCluster stop the cluster. func (m *Manager) StopCluster(clusterName string, options operator.Options) error { metadata, err := m.meta(clusterName) @@ -157,6 +163,7 @@ func (m *Manager) StopCluster(clusterName string, options operator.Options) erro return operator.Stop(ctx, topo, options) }). Build() + operationInfo.curTask = t.(*task.Serial) if err := t.Execute(task.NewContext()); err != nil { if errorx.Cast(err) != nil { From d3ad4f1de8240eb5ef7ac0fb0059459d93275e9a Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 11:58:31 +0800 Subject: [PATCH 044/126] update scale in cluster, record status as well --- components/web/main.go | 15 ++++------ pkg/cluster/manager.go | 31 ++++++++++++++++++--- web-ui/src/pages/Clusters/ClusterDetail.tsx | 8 ++---- web-ui/src/pages/Deployment/index.tsx | 1 - web-ui/src/utils/api.ts | 2 +- 5 files changed, 36 insertions(+), 21 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index 312cf74d3c..d14c00f907 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -181,8 +181,8 @@ func stopClusterHandler(c *gin.Context) { // ScaleInReq represents the request for scale in cluster type ScaleInReq struct { - NodeID string `json:"node_id"` - Force bool `json:"force"` + Nodes []string `json:"nodes"` + Force bool `json:"force"` } func scaleInClusterHandler(c *gin.Context) { @@ -200,7 +200,7 @@ func scaleInClusterHandler(c *gin.Context) { APITimeout: 300, NativeSSH: false, Force: req.Force, - Nodes: []string{req.NodeID}} + Nodes: req.Nodes} scale := func(b *task.Builder, imetadata spec.Metadata) { metadata := imetadata.(*spec.ClusterMeta) if !gOpt.Force { @@ -214,12 +214,9 @@ func scaleInClusterHandler(c *gin.Context) { } } - err := manager.ScaleIn(clusterName, true, gOpt.SSHTimeout, gOpt.NativeSSH, gOpt.Force, gOpt.Nodes, scale) - - if err != nil { - _ = c.Error(err) - return - } + go func() { + manager.DoScaleIn(clusterName, true, gOpt.SSHTimeout, gOpt.NativeSSH, gOpt.Force, gOpt.Nodes, scale) + }() c.Status(http.StatusNoContent) } diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 886404bbdf..1c2f547c49 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -60,10 +60,10 @@ var ( type OperationType string const ( - operationDeploy OperationType = "deploy" - operationStart OperationType = "start" - operationStop OperationType = "stop" - // operationScaleIn OperationType = "scaleIn" + operationDeploy OperationType = "deploy" + operationStart OperationType = "start" + operationStop OperationType = "stop" + operationScaleIn OperationType = "scaleIn" operationScaleOut OperationType = "scaleOut" // operationDestroy OperationType = "destroy" ) @@ -1291,6 +1291,28 @@ func (m *Manager) GetOperationStatus() OperationStatus { return operationStatus } +// DoScaleIn the cluster. +func (m *Manager) DoScaleIn( + clusterName string, + skipConfirm bool, + sshTimeout int64, + nativeSSH bool, + force bool, + nodes []string, + scale func(builer *task.Builder, metadata spec.Metadata), +) { + operationInfo = OperationInfo{operationType: operationScaleIn, clusterName: clusterName} + operationInfo.err = m.ScaleIn( + clusterName, + skipConfirm, + sshTimeout, + nativeSSH, + force, + nodes, + scale, + ) +} + // ScaleIn the cluster. func (m *Manager) ScaleIn( clusterName string, @@ -1399,6 +1421,7 @@ func (m *Manager) ScaleIn( scale(b, metadata) t := b.Parallel(regenConfigTasks...).Build() + operationInfo.curTask = t.(*task.Serial) if err := t.Execute(task.NewContext()); err != nil { if errorx.Cast(err) != nil { diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 9a88c5b2d1..94a8dcd41a 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -79,7 +79,7 @@ export default function ClusterDetailPage() { }, } as any) return _columns - }, []) + }, [handleScaleInCluster]) function destroyCluster() { setDestroying(true) @@ -157,7 +157,7 @@ export default function ClusterDetailPage() { setScaleIning(true) scaleInCluster(clusterName, { - node_id: node.id, + nodes: [node.id], force, }).then(({ data, err }) => { setScaleIning(false) @@ -173,10 +173,6 @@ export default function ClusterDetailPage() { }) } - // function handleScaleOutCluster() { - // // TODO - // } - if (cluster === undefined) { return } diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index c7d884c409..4e35644224 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -8,7 +8,6 @@ import { Form, Input, Select, - message, } from 'antd' import uniqid from 'uniqid' import yaml from 'yaml' diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts index 75ca72628c..f4e419bc0e 100644 --- a/web-ui/src/utils/api.ts +++ b/web-ui/src/utils/api.ts @@ -38,7 +38,7 @@ export function stopCluster(clusterName: string) { export function scaleInCluster( clusterName: string, - scaleInOpts: { node_id: string; force: boolean } + scaleInOpts: { nodes: string[]; force: boolean } ) { return request( fullUrl(`clusters/${clusterName}/scale_in`), From 7000f9328a6b01371297a7f51937f1c69ffb6595 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 12:02:45 +0800 Subject: [PATCH 045/126] update destroy cluster, record status as well --- components/web/main.go | 17 +++++++---------- pkg/cluster/manager.go | 14 +++++++++++++- web-ui/src/pages/Deployment/DeploymentTable.tsx | 8 +++++++- web-ui/src/pages/Deployment/OperationStatus.tsx | 2 +- web-ui/src/pages/Machines/MachinesTable.tsx | 2 +- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index d14c00f907..455e5d0fd7 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -135,16 +135,13 @@ func clusterHandler(c *gin.Context) { func destroyClusterHandler(c *gin.Context) { clusterName := c.Param("clusterName") - err := manager.DestroyCluster(clusterName, operator.Options{ - SSHTimeout: 5, - OptTimeout: 120, - APITimeout: 300, - }, operator.Options{}, true) - - if err != nil { - _ = c.Error(err) - return - } + go func() { + manager.DoDestroyCluster(clusterName, operator.Options{ + SSHTimeout: 5, + OptTimeout: 120, + APITimeout: 300, + }, operator.Options{}, true) + }() c.Status(http.StatusNoContent) } diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 1c2f547c49..351da9529b 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -65,7 +65,7 @@ const ( operationStop OperationType = "stop" operationScaleIn OperationType = "scaleIn" operationScaleOut OperationType = "scaleOut" - // operationDestroy OperationType = "destroy" + operationDestroy OperationType = "destroy" ) // OperationInfo records latest operation task and related info @@ -318,6 +318,17 @@ func (m *Manager) CleanCluster(clusterName string, gOpt operator.Options, cleanO return nil } +// DoDestroyCluster destroy the cluster. +func (m *Manager) DoDestroyCluster(clusterName string, gOpt operator.Options, destroyOpt operator.Options, skipConfirm bool) { + operationInfo = OperationInfo{operationType: operationDestroy, clusterName: clusterName} + operationInfo.err = m.DestroyCluster( + clusterName, + gOpt, + destroyOpt, + skipConfirm, + ) +} + // DestroyCluster destroy the cluster. func (m *Manager) DestroyCluster(clusterName string, gOpt operator.Options, destroyOpt operator.Options, skipConfirm bool) error { metadata, err := m.meta(clusterName) @@ -352,6 +363,7 @@ func (m *Manager) DestroyCluster(clusterName string, gOpt operator.Options, dest return operator.Destroy(ctx, topo, destroyOpt) }). Build() + operationInfo.curTask = t.(*task.Serial) if err := t.Execute(task.NewContext()); err != nil { if errorx.Cast(err) != nil { diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index b1e6a18dd0..0806bb54da 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -304,7 +304,13 @@ export default function DeploymentTable({ }, }, ] - }, [onAddComponent, onEditComponent, onDeleteComponent, onDeleteComponents]) + }, [ + onAddComponent, + onEditComponent, + onDeleteComponent, + onDeleteComponents, + globalLoginOptions.username, + ]) return (
-

正在执行的操作:{operation_type === 'deploy' ? '部署' : '扩容'}

+

正在执行的操作:{operation_type} cluster

集群:{cluster_name}

执行结果: {result()}

{err_msg && ( diff --git a/web-ui/src/pages/Machines/MachinesTable.tsx b/web-ui/src/pages/Machines/MachinesTable.tsx index cdb63e2fca..6e8b14a57d 100644 --- a/web-ui/src/pages/Machines/MachinesTable.tsx +++ b/web-ui/src/pages/Machines/MachinesTable.tsx @@ -76,7 +76,7 @@ export default function MachinesTable({ ), }, ] - }, [onEdit, onDelete]) + }, [onEdit, onDelete, globalLoginOptions.username]) return (
Date: Thu, 27 Aug 2020 14:18:50 +0800 Subject: [PATCH 046/126] adjust router --- web-ui/src/App.tsx | 61 ++++++++----------------------- web-ui/src/pages/Home/index.tsx | 55 ++++++++++++++++++++++++++++ web-ui/src/pages/Status/index.tsx | 40 ++++++++++++++++++++ 3 files changed, 110 insertions(+), 46 deletions(-) create mode 100644 web-ui/src/pages/Home/index.tsx create mode 100644 web-ui/src/pages/Status/index.tsx diff --git a/web-ui/src/App.tsx b/web-ui/src/App.tsx index 8349c1106f..5ad02a45fe 100644 --- a/web-ui/src/App.tsx +++ b/web-ui/src/App.tsx @@ -1,61 +1,30 @@ import React from 'react' -import { - BrowserRouter as Router, - Routes, - Route, - NavLink, - Navigate, -} from 'react-router-dom' -import { Layout, Menu } from 'antd' -import { - HddOutlined, - DeploymentUnitOutlined, - ClusterOutlined, -} from '@ant-design/icons' +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom' import MachinesPage from './pages/Machines' import DeploymentPage from './pages/Deployment' import ClustersPage from './pages/Clusters' -import './App.less' import ClusterDetailPage from './pages/Clusters/ClusterDetail' +import StatusPage from './pages/Status' +import HomePage from './pages/Home' -const { Sider, Content } = Layout - -function SiderMenu() { - return ( - - - }> - 配置机器 - - }> - 部署 - - }> - 集群管理 - - - - ) -} +import './App.less' function App() { return ( - - - - - } /> - } /> - } /> - }> - } /> - - - - + + } /> + + }> + }> + } /> + + } /> + } /> + + ) } diff --git a/web-ui/src/pages/Home/index.tsx b/web-ui/src/pages/Home/index.tsx new file mode 100644 index 0000000000..75e342a39a --- /dev/null +++ b/web-ui/src/pages/Home/index.tsx @@ -0,0 +1,55 @@ +import React, { useEffect } from 'react' +import { NavLink, Outlet, useNavigate } from 'react-router-dom' +import { Layout, Menu } from 'antd' +import { + HddOutlined, + DeploymentUnitOutlined, + ClusterOutlined, +} from '@ant-design/icons' +import { getStatus } from '../../utils/api' + +const { Sider, Content } = Layout + +function SiderMenu() { + return ( + + + }> + 集群管理 + + }> + 配置机器 + + }> + 部署 + + }> + 操作状态 + + + + ) +} + +export default function HomePage() { + const navigate = useNavigate() + + useEffect(() => { + getStatus().then(({ data }) => { + if (data !== undefined) { + if (data.total_progress < 100 && data.err_msg === '') { + navigate('/status') + } + } + }) + }, [navigate]) + + return ( + + + + + + + ) +} diff --git a/web-ui/src/pages/Status/index.tsx b/web-ui/src/pages/Status/index.tsx new file mode 100644 index 0000000000..0ae4f53844 --- /dev/null +++ b/web-ui/src/pages/Status/index.tsx @@ -0,0 +1,40 @@ +import React, { useState, useEffect } from 'react' +import { Root } from '../../components/Root' +import OperationStatus, { + IOperationStatus, +} from '../Deployment/OperationStatus' +import { getStatus } from '../../utils/api' + +export default function StatusPage() { + const [operationStatus, setOperationStatus] = useState< + IOperationStatus | undefined + >(undefined) + + useEffect(() => { + const id = setInterval(() => { + getStatus().then(({ data }) => { + if (data !== undefined) { + setOperationStatus(data) + if ( + data.total_progress === 100 || + data.err_msg || + data.cluster_name === '' + ) { + clearInterval(id) + } + } + }) + }, 2000) + return () => clearInterval(id) + }, []) + + return ( + + {operationStatus ? ( + + ) : ( +
Loading...
+ )} +
+ ) +} From 6a5400a911dedc7ae830e57db56b3eb8e2859d77 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 15:09:05 +0800 Subject: [PATCH 047/126] update status page --- .../src/pages/Deployment/OperationStatus.tsx | 2 +- web-ui/src/pages/Home/index.tsx | 19 ++++++++++----- web-ui/src/pages/Status/index.tsx | 24 +++++++++++++++---- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/web-ui/src/pages/Deployment/OperationStatus.tsx b/web-ui/src/pages/Deployment/OperationStatus.tsx index 2bc014e051..b709b94d4f 100644 --- a/web-ui/src/pages/Deployment/OperationStatus.tsx +++ b/web-ui/src/pages/Deployment/OperationStatus.tsx @@ -29,7 +29,7 @@ export default function OperationStatus({ if (err_msg) { return '失败' } else if (total_progress === 100) { - return '成功 (请进入 "集群管理" 界面对该集群进行启动,停止,缩容,销毁等操作)' + return '成功' } else { return '进行中' } diff --git a/web-ui/src/pages/Home/index.tsx b/web-ui/src/pages/Home/index.tsx index 75e342a39a..2f026327bd 100644 --- a/web-ui/src/pages/Home/index.tsx +++ b/web-ui/src/pages/Home/index.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react' +import React, { useEffect, useState } from 'react' import { NavLink, Outlet, useNavigate } from 'react-router-dom' import { Layout, Menu } from 'antd' import { @@ -11,19 +11,26 @@ import { getStatus } from '../../utils/api' const { Sider, Content } = Layout function SiderMenu() { + const [curMenu, setCurMenu] = useState('') + + useEffect(() => { + const path = window.location.pathname.split('/')[1] + setCurMenu(path || '') + }) + return ( - - }> + + }> 集群管理 - }> + }> 配置机器 - }> + }> 部署 - }> + }> 操作状态 diff --git a/web-ui/src/pages/Status/index.tsx b/web-ui/src/pages/Status/index.tsx index 0ae4f53844..559f03c2e9 100644 --- a/web-ui/src/pages/Status/index.tsx +++ b/web-ui/src/pages/Status/index.tsx @@ -1,4 +1,6 @@ import React, { useState, useEffect } from 'react' +import { Link } from 'react-router-dom' + import { Root } from '../../components/Root' import OperationStatus, { IOperationStatus, @@ -30,11 +32,23 @@ export default function StatusPage() { return ( - {operationStatus ? ( - - ) : ( -
Loading...
- )} +
+
+

操作状态

+ {operationStatus ? ( + + ) : ( +
Loading...
+ )} + {operationStatus && + (operationStatus.total_progress === 100 || + operationStatus.err_msg) && ( +
+ 进入集群管理 +
+ )} +
+
) } From c356c8b0ce4647c7112608e88a7c5b8c5f87a27f Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 15:53:37 +0800 Subject: [PATCH 048/126] refine --- components/web/main.go | 38 ++++---- web-ui/src/pages/Clusters/ClusterDetail.tsx | 96 +++------------------ web-ui/src/pages/Deployment/index.tsx | 79 ++--------------- web-ui/src/pages/Home/index.tsx | 9 +- web-ui/src/pages/Status/index.tsx | 3 +- 5 files changed, 44 insertions(+), 181 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index 455e5d0fd7..3c41ff7caf 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -191,27 +191,27 @@ func scaleInClusterHandler(c *gin.Context) { return } - gOpt := operator.Options{ - SSHTimeout: 5, - OptTimeout: 120, - APITimeout: 300, - NativeSSH: false, - Force: req.Force, - Nodes: req.Nodes} - scale := func(b *task.Builder, imetadata spec.Metadata) { - metadata := imetadata.(*spec.ClusterMeta) - if !gOpt.Force { - b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt). - UpdateMeta(clusterName, metadata, operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false)). - UpdateTopology(clusterName, metadata, operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false)) - } else { - b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt). - UpdateMeta(clusterName, metadata, gOpt.Nodes). - UpdateTopology(clusterName, metadata, gOpt.Nodes) + go func() { + gOpt := operator.Options{ + SSHTimeout: 5, + OptTimeout: 120, + APITimeout: 300, + NativeSSH: false, + Force: req.Force, + Nodes: req.Nodes} + scale := func(b *task.Builder, imetadata spec.Metadata) { + metadata := imetadata.(*spec.ClusterMeta) + if !gOpt.Force { + b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt). + UpdateMeta(clusterName, metadata, operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false)). + UpdateTopology(clusterName, metadata, operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false)) + } else { + b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt). + UpdateMeta(clusterName, metadata, gOpt.Nodes). + UpdateTopology(clusterName, metadata, gOpt.Nodes) + } } - } - go func() { manager.DoScaleIn(clusterName, true, gOpt.SSHTimeout, gOpt.NativeSSH, gOpt.Force, gOpt.Nodes, scale) }() diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 94a8dcd41a..052b7f18cd 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -1,6 +1,6 @@ import React, { useMemo, useState } from 'react' import { useParams, useNavigate } from 'react-router-dom' -import { Space, Button, Modal, message, Table, Popconfirm } from 'antd' +import { Space, Button, Modal, Table, Popconfirm } from 'antd' import { ExclamationCircleOutlined } from '@ant-design/icons' import { useSessionStorageState } from 'ahooks' @@ -33,10 +33,6 @@ export default function ClusterDetailPage() { () => clustersList.find((el) => el.name === clusterName), [clustersList, clusterName] ) - const [destroying, setDestroying] = useState(false) - const [starting, setStarting] = useState(false) - const [stoping, setStoping] = useState(false) - const [scaleIning, setScaleIning] = useState(false) const [clusterInstInfos, setClusterInstInfos] = useSessionStorageState< IClusterInstInfo[] @@ -82,16 +78,8 @@ export default function ClusterDetailPage() { }, [handleScaleInCluster]) function destroyCluster() { - setDestroying(true) - deleteCluster(clusterName).then(({ data, err }) => { - setDestroying(false) - if (data) { - message.success('销毁成功!') - navigate('/') - } else { - message.error(err.message) - } - }) + deleteCluster(clusterName) + navigate('/status') } function handleDestroyCluster() { @@ -117,35 +105,13 @@ export default function ClusterDetailPage() { } function handleStartCluster() { - setStarting(true) - startCluster(clusterName).then(({ data, err }) => { - setStarting(false) - handleShowTopo() - if (data !== undefined) { - message.success(`${clusterName} 集群已启动!`) - } else if (err !== undefined) { - Modal.confirm({ - title: `${clusterName} 集群启动失败`, - content: err.message, - }) - } - }) + startCluster(clusterName) + navigate('/status') } function handleStopCluster() { - setStoping(true) - stopCluster(clusterName).then(({ data, err }) => { - setStoping(false) - handleShowTopo() - if (data !== undefined) { - message.success(`${clusterName} 集群已停止!`) - } else if (err !== undefined) { - Modal.confirm({ - title: `${clusterName} 集群停止失败`, - content: err.message, - }) - } - }) + stopCluster(clusterName) + navigate('/status') } function handleScaleInCluster(node: IClusterInstInfo) { @@ -153,24 +119,12 @@ export default function ClusterDetailPage() { const force = lowerStatus.indexOf('down') !== -1 || lowerStatus.indexOf('inactive') !== -1 - message.info(`${clusterName} 集群正在缩容中!请尽量不要进行其它操作!`) - setScaleIning(true) scaleInCluster(clusterName, { nodes: [node.id], force, - }).then(({ data, err }) => { - setScaleIning(false) - handleShowTopo() - if (data !== undefined) { - message.success(`${clusterName} 集群缩容成功!`) - } else if (err !== undefined) { - Modal.confirm({ - title: `${clusterName} 集群缩容失败`, - content: err.message, - }) - } }) + navigate('/status') } if (cluster === undefined) { @@ -186,37 +140,19 @@ export default function ClusterDetailPage() { onConfirm={handleStartCluster} okText="启动" cancelText="取消" - disabled={destroying || stoping || scaleIning} > - + - + - @@ -229,11 +165,7 @@ export default function ClusterDetailPage() { - @@ -242,9 +174,7 @@ export default function ClusterDetailPage() { columns={columns} pagination={false} rowKey={'id'} - loading={ - loadingTopo || scaleIning || destroying || starting || stoping - } + loading={loadingTopo} /> diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 4e35644224..2f770c147b 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -1,14 +1,6 @@ import React, { useCallback, useState, useEffect } from 'react' import { useLocalStorageState } from 'ahooks' -import { - Drawer, - Space, - Button, - Modal, - Form, - Input, - Select, -} from 'antd' +import { Drawer, Space, Button, Modal, Form, Input, Select } from 'antd' import uniqid from 'uniqid' import yaml from 'yaml' @@ -38,6 +30,7 @@ import OperationStatus, { IOperationStatus } from './OperationStatus' import { getStatus, deployCluster, scaleOutCluster } from '../../utils/api' import { IGlobalLoginOptions } from '../Machines/GlobalLoginOptionsForm' import { ExclamationCircleOutlined } from '@ant-design/icons' +import { useNavigate } from 'react-router-dom' // TODO: fetch from API const TIDB_VERSIONS = [ @@ -54,7 +47,6 @@ const TIDB_VERSIONS = [ export interface IDeployReq { cluster_name: string tidb_version: string - // topo_yaml:string } export default function DeploymentPage() { @@ -71,14 +63,6 @@ export default function DeploymentPage() { forScaleOut: false, }) - const [viewDeployStatus, setViewDeployStatus] = useState(false) - - const [operationStatus, setOperationStatus] = useState< - IOperationStatus | undefined - >(undefined) - - const [reloadTimes, setReloadTimes] = useState(0) - const [deployReq, setDeployReq] = useLocalStorageState( 'deploy_req', { cluster_name: '', tidb_version: '' } @@ -89,25 +73,9 @@ export default function DeploymentPage() { {} ) - const [form] = Form.useForm() + const navigate = useNavigate() - useEffect(() => { - const id = setInterval(() => { - getStatus().then(({ data }) => { - if (data !== undefined) { - setOperationStatus(data) - if ( - data.total_progress === 100 || - data.err_msg || - data.cluster_name === '' - ) { - clearInterval(id) - } - } - }) - }, 2000) - return () => clearInterval(id) - }, [reloadTimes]) + const [form] = Form.useForm() const handleAddComponent = useCallback( (machine: IMachine, componentType: string, forScaleOut: boolean) => { @@ -213,18 +181,6 @@ export default function DeploymentPage() { ) function handleFinish(values: any) { - if (operationStatus !== undefined) { - const { cluster_name, total_progress, err_msg } = operationStatus - if (cluster_name !== '' && err_msg === '' && total_progress < 100) { - Modal.error({ - title: '操作暂时无法进行', - content: - '当前有正在进行中的部署或扩容任务,请点击 "查看进度" 进行查看', - }) - return - } - } - const topoYaml = yaml.stringify( genTopo({ machines, components, forScaleOut: previewYaml.forScaleOut }) ) @@ -240,9 +196,7 @@ export default function DeploymentPage() { global_login_options: globalLoginOptions, }) } - setOperationStatus(undefined) - setReloadTimes((pre) => pre + 1) - setViewDeployStatus(true) + navigate('/status') } function startOperate() { @@ -294,19 +248,9 @@ export default function DeploymentPage() { onClick={() => setPreviewYaml({ preview: true, forScaleOut: false }) } - disabled={operationStatus === undefined} > 预览部署拓扑 - - @@ -346,19 +290,6 @@ export default function DeploymentPage() { forScaleOut={previewYaml.forScaleOut} /> - - setViewDeployStatus(false)} - onCancel={() => setViewDeployStatus(false)} - > - {operationStatus ? ( - - ) : ( -
Loading...
- )} -
) } diff --git a/web-ui/src/pages/Home/index.tsx b/web-ui/src/pages/Home/index.tsx index 2f026327bd..1db431d41c 100644 --- a/web-ui/src/pages/Home/index.tsx +++ b/web-ui/src/pages/Home/index.tsx @@ -30,9 +30,6 @@ function SiderMenu() { }> 部署 - }> - 操作状态 -
) @@ -44,7 +41,11 @@ export default function HomePage() { useEffect(() => { getStatus().then(({ data }) => { if (data !== undefined) { - if (data.total_progress < 100 && data.err_msg === '') { + if ( + data.cluster_name !== '' && + data.total_progress < 100 && + data.err_msg === '' + ) { navigate('/status') } } diff --git a/web-ui/src/pages/Status/index.tsx b/web-ui/src/pages/Status/index.tsx index 559f03c2e9..55daad94f7 100644 --- a/web-ui/src/pages/Status/index.tsx +++ b/web-ui/src/pages/Status/index.tsx @@ -42,7 +42,8 @@ export default function StatusPage() { )} {operationStatus && (operationStatus.total_progress === 100 || - operationStatus.err_msg) && ( + operationStatus.err_msg || + operationStatus.cluster_name === '') && (
进入集群管理
From 18b657c286ad9505efbcd2cd5182cc24c336033d Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 16:19:24 +0800 Subject: [PATCH 049/126] add scale out page --- web-ui/src/App.tsx | 7 ++++++- web-ui/src/pages/Clusters/ClusterDetail.tsx | 5 +++++ web-ui/src/pages/Clusters/ClusterScaleOut.tsx | 9 +++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 web-ui/src/pages/Clusters/ClusterScaleOut.tsx diff --git a/web-ui/src/App.tsx b/web-ui/src/App.tsx index 5ad02a45fe..f7fb8c70e8 100644 --- a/web-ui/src/App.tsx +++ b/web-ui/src/App.tsx @@ -5,9 +5,10 @@ import MachinesPage from './pages/Machines' import DeploymentPage from './pages/Deployment' import ClustersPage from './pages/Clusters' -import ClusterDetailPage from './pages/Clusters/ClusterDetail' import StatusPage from './pages/Status' import HomePage from './pages/Home' +import ClusterScaleOutPage from './pages/Clusters/ClusterScaleOut' +import ClusterDetailPage from './pages/Clusters/ClusterDetail' import './App.less' @@ -20,6 +21,10 @@ function App() { }> }> } /> + } + /> } /> } /> diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 052b7f18cd..6feefd0a9a 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -127,6 +127,10 @@ export default function ClusterDetailPage() { navigate('/status') } + function handleScaleOutCluster() { + navigate(`/clusters/${clusterName}/scaleout`) + } + if (cluster === undefined) { return } @@ -151,6 +155,7 @@ export default function ClusterDetailPage() { > + + + +
+ setCurComp(rec)} + onDeleteComponent={handleDeleteComponent} + onDeleteComponents={handleDeleteComponents} + /> +
+ + setCurComp(undefined)} + destroyOnClose={true} + > + + + + setPreviewYaml(false)} + > + + + + ) +} diff --git a/web-ui/src/pages/Deployment/index.tsx b/web-ui/src/pages/Deployment/index.tsx index 838b0dc374..26ad14ba34 100644 --- a/web-ui/src/pages/Deployment/index.tsx +++ b/web-ui/src/pages/Deployment/index.tsx @@ -1,294 +1,6 @@ -import React, { useCallback, useState } from 'react' -import { useLocalStorageState } from 'ahooks' -import { Drawer, Space, Button, Modal, Form, Input, Select } from 'antd' -import uniqid from 'uniqid' -import yaml from 'yaml' - -import { IMachine } from '../Machines/MachineForm' -import DeploymentTable, { - IComponent, - COMPONENT_TYPES, - DEF_TIDB_PORT, - DEF_TIDB_STATUS_PORT, - DEF_TIKV_PORT, - DEF_TIKV_STATUS_PORT, - DEF_TIFLASH_TCP_PORT, - DEF_TIFLASH_HTTP_PORT, - DEF_TIFLASH_SERVICE_PORT, - DEF_TIFLASH_PROXY_PORT, - DEF_TIFLASH_PROXY_STATUS_PORT, - DEF_TIFLASH_METRICS_PORT, - DEF_PD_PEER_PORT, - DEF_PROM_PORT, - DEF_GRAFANA_PORT, - DEF_ALERT_CLUSTER_PORT, -} from './DeploymentTable' -import EditCompForm from './EditCompForm' -import TopoPreview, { genTopo } from './TopoPreview' -import { Root } from '../../components/Root' -import { deployCluster, scaleOutCluster } from '../../utils/api' -import { IGlobalLoginOptions } from '../Machines/GlobalLoginOptionsForm' -import { ExclamationCircleOutlined } from '@ant-design/icons' -import { useNavigate } from 'react-router-dom' - -// TODO: fetch from API -const TIDB_VERSIONS = [ - 'v4.0.4', - 'v4.0.3', - 'v4.0.2', - 'v4.0.1', - 'v4.0.0', - 'v3.1.2', - 'v3.1.1', - 'v3.1.0', -] - -export interface IDeployReq { - cluster_name: string - tidb_version: string -} +import React from 'react' +import CompsManager from './CompsManager' export default function DeploymentPage() { - const [machines] = useLocalStorageState<{ - [key: string]: IMachine - }>('machines', {}) - const [components, setComponents] = useLocalStorageState<{ - [key: string]: IComponent - }>('components', {}) - const [curComp, setCurComp] = useState(undefined) - - const [previewYaml, setPreviewYaml] = useState({ - preview: false, - forScaleOut: false, - }) - - const [deployReq, setDeployReq] = useLocalStorageState( - 'deploy_req', - { cluster_name: '', tidb_version: '' } - ) - - const [globalLoginOptions] = useLocalStorageState( - 'global_login_options', - {} - ) - - const navigate = useNavigate() - - const [form] = Form.useForm() - - const handleAddComponent = useCallback( - (machine: IMachine, componentType: string, forScaleOut: boolean) => { - let comp: IComponent = { - id: uniqid(), - machineID: machine.id, - type: componentType, - for_scale_out: forScaleOut, - priority: COMPONENT_TYPES.indexOf(componentType), - } - const existedSameComps = Object.values(components).filter( - (comp) => comp.type === componentType && comp.machineID === machine.id - ) - if (existedSameComps.length > 0) { - const lastComp = existedSameComps[existedSameComps.length - 1] as any - comp.deploy_dir_prefix = lastComp.deploy_dir_prefix - comp.data_dir_prefix = lastComp.data_dir_prefix - let newComp = comp as any - switch (componentType) { - case 'TiDB': - newComp.port = (lastComp.port || DEF_TIDB_PORT) + 1 - newComp.status_port = - (lastComp.status_port || DEF_TIDB_STATUS_PORT) + 1 - break - case 'TiKV': - newComp.port = (lastComp.port || DEF_TIKV_PORT) + 1 - newComp.status_port = - (lastComp.status_port || DEF_TIKV_STATUS_PORT) + 1 - break - case 'TiFlash': - newComp.tcp_port = (lastComp.tcp_port || DEF_TIFLASH_TCP_PORT) + 1 - newComp.http_port = - (lastComp.http_port || DEF_TIFLASH_HTTP_PORT) + 1 - newComp.flash_service_port = - (lastComp.flash_service_port || DEF_TIFLASH_SERVICE_PORT) + 1 - newComp.flash_proxy_port = - (lastComp.flash_proxy_port || DEF_TIFLASH_PROXY_PORT) + 1 - newComp.flash_proxy_status_port = - (lastComp.flash_proxy_status_port || - DEF_TIFLASH_PROXY_STATUS_PORT) + 1 - newComp.metrics_port = - (lastComp.metrics_port || DEF_TIFLASH_METRICS_PORT) + 1 - break - case 'PD': - newComp.client_port = (lastComp.peer_port || DEF_PD_PEER_PORT) + 1 - newComp.peer_port = (lastComp.peer_port || DEF_PD_PEER_PORT) + 2 - break - case 'Prometheus': - newComp.port = (lastComp.port || DEF_PROM_PORT) + 1 - break - case 'Grafana': - newComp.port = (lastComp.port || DEF_GRAFANA_PORT) + 2 - break - case 'AlertManager': - newComp.web_port = - (lastComp.cluster_port || DEF_ALERT_CLUSTER_PORT) + 1 - newComp.cluster_port = - (lastComp.cluster_port || DEF_ALERT_CLUSTER_PORT) + 2 - break - } - comp = newComp - } - setComponents({ - ...components, - [comp.id]: comp, - }) - }, - [components, setComponents] - ) - - const handleUpdateComponent = useCallback( - (comp: IComponent) => { - setComponents({ - ...components, - [comp.id]: comp, - }) - setCurComp(undefined) - }, - [components, setComponents] - ) - - const handleDeleteComponent = useCallback( - (comp: IComponent) => { - const newComps = { ...components } - delete newComps[comp.id] - setComponents(newComps) - }, - [components, setComponents] - ) - - const handleDeleteComponents = useCallback( - (machine: IMachine) => { - const newComps = { ...components } - const belongedComps = Object.values(components).filter( - (c) => c.machineID === machine.id - ) - for (const c of belongedComps) { - delete newComps[c.id] - } - setComponents(newComps) - }, - [components, setComponents] - ) - - function handleFinish(values: any) { - const topoYaml = yaml.stringify( - genTopo({ machines, components, forScaleOut: previewYaml.forScaleOut }) - ) - if (previewYaml.forScaleOut) { - scaleOutCluster(values.cluster_name, { - topo_yaml: topoYaml, - global_login_options: globalLoginOptions, - }) - } else { - deployCluster({ - ...values, - topo_yaml: topoYaml, - global_login_options: globalLoginOptions, - }) - } - navigate('/status') - } - - function startOperate() { - setPreviewYaml((prev) => ({ ...prev, preview: false })) - form.validateFields().then((values) => { - setDeployReq(values as any) - if (previewYaml.forScaleOut) { - Modal.confirm({ - title: `开始扩容`, - icon: , - content: - '即将开始扩容,请确保在扩容之前已经集群已部署成功,否则扩容将失败!', - okText: '扩容', - cancelText: '取消', - onOk: () => handleFinish(values), - }) - } else { - handleFinish(values) - } - }) - } - - return ( - -
- - - - - - - - - - - - - -
- setCurComp(rec)} - onDeleteComponent={handleDeleteComponent} - onDeleteComponents={handleDeleteComponents} - /> -
- - setCurComp(undefined)} - destroyOnClose={true} - > - - - - setPreviewYaml((prev) => ({ ...prev, preview: false }))} - > - - -
- ) + return } From 4460b5d2d513f0553e1f497e8c184c8218f5df53 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 17:21:13 +0800 Subject: [PATCH 052/126] edit and delete component --- web-ui/src/pages/Deployment/CompsManager.tsx | 65 +++++++------- .../src/pages/Deployment/DeploymentTable.tsx | 85 +++++++++---------- web-ui/src/pages/Deployment/EditCompForm.tsx | 3 - 3 files changed, 74 insertions(+), 79 deletions(-) diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/web-ui/src/pages/Deployment/CompsManager.tsx index db181e9135..acd98d73b3 100644 --- a/web-ui/src/pages/Deployment/CompsManager.tsx +++ b/web-ui/src/pages/Deployment/CompsManager.tsx @@ -171,13 +171,15 @@ export default function CompsManager({ ) const handleDeleteComponents = useCallback( - (machine: IMachine) => { + (machine: IMachine, forScaleOut: boolean) => { const newComps = { ...components } const belongedComps = Object.values(components).filter( (c) => c.machineID === machine.id ) for (const c of belongedComps) { - delete newComps[c.id] + if (c.for_scale_out === forScaleOut) { + delete newComps[c.id] + } } setComponents(newComps) }, @@ -222,38 +224,43 @@ export default function CompsManager({ return ( - - {!forScaleOut && ( -
- - - - - - - - )} + {forScaleOut ? ( -
+ ) : ( +
+ + + + + + + + + + + )}
void onEditComponent?: (comp: IComponent) => void onDeleteComponent?: (comp: IComponent) => void - onDeleteComponents?: (machine: IMachine) => void + onDeleteComponents?: (machine: IMachine, forScaleOut: boolean) => void } export default function DeploymentTable({ + forScaleOut, machines, components, onAddComponent, @@ -128,9 +130,13 @@ export default function DeploymentTable({ ) for (const machine of sortedMachines) { machinesAndComps.push(machine) - const respondComps = Object.values(components).filter( - (c) => c.machineID === machine.id - ) + const respondComps = Object.values(components).filter((c) => { + if (forScaleOut) { + return c.machineID === machine.id + } else { + return c.machineID === machine.id && !c.for_scale_out + } + }) if (respondComps.length > 0) { respondComps.sort((a: any, b: any) => { let delta @@ -234,7 +240,7 @@ export default function DeploymentTable({ onAddComponent && - onAddComponent(rec, e.key as string, false) + onAddComponent(rec, e.key as string, forScaleOut) } > {COMPONENT_TYPES.map((t) => ( @@ -245,62 +251,47 @@ export default function DeploymentTable({ trigger={['click']} > e.preventDefault()}> - 添加组件 + {forScaleOut ? '扩容' : '添加'}组件 - - onAddComponent && - onAddComponent(rec, e.key as string, true) - } - > - {COMPONENT_TYPES.map((t) => ( - {t} - ))} - + + onDeleteComponents && onDeleteComponents(rec, forScaleOut) } - trigger={['click']} + okText="删除" + cancelText="取消" > - e.preventDefault()}> - 扩容组件 - - + 删除{forScaleOut ? '扩容' : '部署'}组件 + + + ) + } + if (forScaleOut === rec.for_scale_out) { + return ( + + onEditComponent && onEditComponent(rec)} + > + 编辑 + - onDeleteComponents && onDeleteComponents(rec) - } + title="你确定要删除这个组件吗?" + onConfirm={() => onDeleteComponent && onDeleteComponent(rec)} okText="删除" cancelText="取消" > - 删除所有组件 + 删除 ) } - return ( - - onEditComponent && onEditComponent(rec)} - > - 编辑 - - - onDeleteComponent && onDeleteComponent(rec)} - okText="删除" - cancelText="取消" - > - 删除 - - - ) + return null }, }, ] diff --git a/web-ui/src/pages/Deployment/EditCompForm.tsx b/web-ui/src/pages/Deployment/EditCompForm.tsx index 34fb39f18b..08ba4b93be 100644 --- a/web-ui/src/pages/Deployment/EditCompForm.tsx +++ b/web-ui/src/pages/Deployment/EditCompForm.tsx @@ -72,9 +72,6 @@ export default function EditCompForm({ return (
- - 扩容组件? - From d2a09cb9419099d2bf8a032ee3c71d916c64c23e Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 17:36:23 +0800 Subject: [PATCH 053/126] auto get topo --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 56 +++++++++---------- web-ui/src/pages/Clusters/ClusterScaleOut.tsx | 3 +- web-ui/src/pages/Deployment/CompsManager.tsx | 3 +- .../src/pages/Deployment/DeploymentTable.tsx | 3 +- web-ui/src/pages/Deployment/EditCompForm.tsx | 2 +- 5 files changed, 33 insertions(+), 34 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 6feefd0a9a..b16e5eacf8 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useState } from 'react' +import React, { useMemo, useState, useCallback, useEffect } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { Space, Button, Modal, Table, Popconfirm } from 'antd' import { ExclamationCircleOutlined } from '@ant-design/icons' @@ -40,6 +40,22 @@ export default function ClusterDetailPage() { const [loadingTopo, setLoadingTopo] = useState(false) + const handleScaleInCluster = useCallback( + (node: IClusterInstInfo) => { + const lowerStatus = node.status.toLowerCase() + const force = + lowerStatus.indexOf('down') !== -1 || + lowerStatus.indexOf('inactive') !== -1 + + scaleInCluster(clusterName, { + nodes: [node.id], + force, + }) + navigate('/status') + }, + [navigate, clusterName] + ) + const columns = useMemo(() => { const _columns = [ 'ID', @@ -77,6 +93,17 @@ export default function ClusterDetailPage() { return _columns }, [handleScaleInCluster]) + useEffect(() => { + setLoadingTopo(true) + getClusterTopo(clusterName).then(({ data, err }) => { + setLoadingTopo(false) + if (data !== undefined) { + setClusterInstInfos(data) + } + }) + // eslint-disable-next-line + }, []) + function destroyCluster() { deleteCluster(clusterName) navigate('/status') @@ -94,16 +121,6 @@ export default function ClusterDetailPage() { }) } - function handleShowTopo() { - setLoadingTopo(true) - getClusterTopo(clusterName).then(({ data, err }) => { - setLoadingTopo(false) - if (data !== undefined) { - setClusterInstInfos(data) - } - }) - } - function handleStartCluster() { startCluster(clusterName) navigate('/status') @@ -114,19 +131,6 @@ export default function ClusterDetailPage() { navigate('/status') } - function handleScaleInCluster(node: IClusterInstInfo) { - const lowerStatus = node.status.toLowerCase() - const force = - lowerStatus.indexOf('down') !== -1 || - lowerStatus.indexOf('inactive') !== -1 - - scaleInCluster(clusterName, { - nodes: [node.id], - force, - }) - navigate('/status') - } - function handleScaleOutCluster() { navigate(`/clusters/${clusterName}/scaleout`) } @@ -170,10 +174,6 @@ export default function ClusterDetailPage() {
- -
{ return [ @@ -301,6 +301,7 @@ export default function DeploymentTable({ onDeleteComponent, onDeleteComponents, globalLoginOptions.username, + forScaleOut, ]) return ( diff --git a/web-ui/src/pages/Deployment/EditCompForm.tsx b/web-ui/src/pages/Deployment/EditCompForm.tsx index 08ba4b93be..90b395cb50 100644 --- a/web-ui/src/pages/Deployment/EditCompForm.tsx +++ b/web-ui/src/pages/Deployment/EditCompForm.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { Form, Input, Button, Checkbox } from 'antd' +import { Form, Input, Button } from 'antd' import { IComponent, From fcbfc515f5d946892ef1052b8b6caa8ad5528fad Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 27 Aug 2020 17:43:54 +0800 Subject: [PATCH 054/126] refine --- web-ui/src/App.tsx | 8 +++++++- web-ui/src/pages/Clusters/index.tsx | 17 +++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/web-ui/src/App.tsx b/web-ui/src/App.tsx index f7fb8c70e8..25ef0891bf 100644 --- a/web-ui/src/App.tsx +++ b/web-ui/src/App.tsx @@ -1,5 +1,10 @@ import React from 'react' -import { BrowserRouter as Router, Routes, Route } from 'react-router-dom' +import { + BrowserRouter as Router, + Routes, + Route, + Navigate, +} from 'react-router-dom' import MachinesPage from './pages/Machines' import DeploymentPage from './pages/Deployment' @@ -19,6 +24,7 @@ function App() { } /> }> + } /> }> } /> +

当前没有可用的集群

+ + 去配置机器 + 去部署组件 + + + ) + } + return ( From b9a36ca43fe6e02b370e1163a322cbc2f81e0086 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 28 Aug 2020 10:03:10 +0800 Subject: [PATCH 055/126] fix compile --- components/web/main.go | 2 +- pkg/cluster/manager.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/components/web/main.go b/components/web/main.go index 3c41ff7caf..0ecaf3a125 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -212,7 +212,7 @@ func scaleInClusterHandler(c *gin.Context) { } } - manager.DoScaleIn(clusterName, true, gOpt.SSHTimeout, gOpt.NativeSSH, gOpt.Force, gOpt.Nodes, scale) + manager.DoScaleIn(clusterName, true, gOpt.OptTimeout, gOpt.SSHTimeout, gOpt.NativeSSH, gOpt.Force, gOpt.Nodes, scale) }() c.Status(http.StatusNoContent) diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 03c32c0982..acdb574500 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -1308,6 +1308,7 @@ func (m *Manager) GetOperationStatus() OperationStatus { func (m *Manager) DoScaleIn( clusterName string, skipConfirm bool, + optTimeout int64, sshTimeout int64, nativeSSH bool, force bool, @@ -1318,6 +1319,7 @@ func (m *Manager) DoScaleIn( operationInfo.err = m.ScaleIn( clusterName, skipConfirm, + optTimeout, sshTimeout, nativeSSH, force, From 76b3d3c77e91a0656f5ee9d29390db904c2c8fc6 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 28 Aug 2020 10:21:32 +0800 Subject: [PATCH 056/126] revert --- pkg/cluster/manager.go | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index acdb574500..ce18dbd64a 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -1044,16 +1044,14 @@ func (m *Manager) Deploy( exist, err := m.specManager.Exist(clusterName) if err != nil { - err = perrs.AddStack(err) - return err + return perrs.AddStack(err) } if exist { // FIXME: When change to use args, the suggestion text need to be updatem. - err = errDeployNameDuplicate. + return errDeployNameDuplicate. New("Cluster name '%s' is duplicated", clusterName). WithProperty(cliutil.SuggestionFromFormat("Please specify another cluster name")) - return err } metadata := m.specManager.NewMetadata() @@ -1088,10 +1086,9 @@ func (m *Manager) Deploy( } if err := os.MkdirAll(m.specManager.Path(clusterName), 0755); err != nil { - err = errorx.InitializationFailed. + return errorx.InitializationFailed. Wrap(err, "Failed to create cluster metadata directory '%s'", m.specManager.Path(clusterName)). WithProperty(cliutil.SuggestionFromString("Please check file system permissions and try again.")) - return err } var ( @@ -1251,8 +1248,7 @@ func (m *Manager) Deploy( // FIXME: Map possible task errors and give suggestions. return err } - err = perrs.AddStack(err) - return err + return perrs.AddStack(err) } metadata.SetUser(globalOptions.User) @@ -1260,13 +1256,11 @@ func (m *Manager) Deploy( err = m.specManager.SaveMeta(clusterName, metadata) if err != nil { - err = perrs.AddStack(err) - return err + return perrs.AddStack(err) } hint := color.New(color.Bold).Sprintf("%s start %s", cliutil.OsArgs0(), clusterName) log.Infof("Deployed cluster `%s` successfully, you can start the cluster via `%s`", clusterName, hint) - return nil } @@ -1576,8 +1570,7 @@ func (m *Manager) ScaleOut( // FIXME: Map possible task errors and give suggestions. return err } - err = perrs.Trace(err) - return err + return perrs.Trace(err) } log.Infof("Scaled cluster `%s` out successfully", clusterName) From 2c2499aabd74bfe29c6d276679b0360484f2da48 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 28 Aug 2020 10:28:13 +0800 Subject: [PATCH 057/126] wip --- pkg/cluster/manager.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index ce18dbd64a..811bdd4004 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -1493,8 +1493,7 @@ func (m *Manager) ScaleOut( ) error { metadata, err := m.meta(clusterName) if err != nil { // not allowing validation errors - err = perrs.AddStack(err) - return err + return perrs.AddStack(err) } topo := metadata.GetTopology() From 810920f06656cdb33beff73fde887ce07b4a3a10 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 28 Aug 2020 10:49:24 +0800 Subject: [PATCH 058/126] wip --- web-ui/src/pages/Deployment/DeploymentTable.tsx | 8 ++++---- web-ui/src/pages/Deployment/TopoPreview.tsx | 11 ++++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index da4ec5c845..f6a7c30faf 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -36,11 +36,11 @@ export interface IComponent { for_scale_out: boolean priority: number - deploy_dir_prefix?: string // "/tidb-deploy" - data_dir_prefix?: string // "/tidb-data", TiDB and Grafana have no data_dir + deploy_dir_prefix?: string // "tidb-deploy" + data_dir_prefix?: string // "tidb-data", TiDB and Grafana have no data_dir } -export const DEF_DEPLOY_DIR_PREFIX = '/tidb-deploy' -export const DEF_DATA_DIR_PREFIX = '/tidb-data' +export const DEF_DEPLOY_DIR_PREFIX = 'tidb-deploy' +export const DEF_DATA_DIR_PREFIX = 'tidb-data' export interface ITiDBComponent extends IComponent { port?: number // 4000 diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index e8616f831d..97a6d6ddce 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -2,7 +2,12 @@ import React, { useMemo } from 'react' import yaml from 'yaml' import { IMachine } from '../Machines/MachineForm' -import { IComponent, COMPONENT_TYPES } from './DeploymentTable' +import { + IComponent, + COMPONENT_TYPES, + DEF_DEPLOY_DIR_PREFIX, + DEF_DATA_DIR_PREFIX, +} from './DeploymentTable' interface ITopoPreviewProps { forScaleOut: boolean @@ -24,8 +29,8 @@ export function genTopo({ topo = { global: { user: 'tidb', - deploy_dir: 'tidb-deploy', - data_dir: 'tidb-data', + deploy_dir: DEF_DEPLOY_DIR_PREFIX, + data_dir: DEF_DATA_DIR_PREFIX, }, server_configs: { pd: { From 2e54aba7e2104a83b6ad805ca90fe9abdd80e709 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 28 Aug 2020 11:49:30 +0800 Subject: [PATCH 059/126] handle location labels --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 2 +- web-ui/src/pages/Deployment/TopoPreview.tsx | 7 +++++++ web-ui/src/pages/Machines/MachineForm.tsx | 3 ++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index b16e5eacf8..dd65aa4bf0 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -162,7 +162,7 @@ export default function ClusterDetailPage() {
diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index 97a6d6ddce..a3cbb3f196 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -74,6 +74,13 @@ export function genTopo({ // TODO: handle deploy dir and data dir } + // location labels + if (compType === 'TiKV' && (targetMachine.dc || targetMachine.rack)) { + m.config = { + 'server.labels': { dc: targetMachine.dc, rack: targetMachine.rack }, + } + } + topo[topoKey].push(m) topo[topoKey].sort((a: any, b: any) => (a.host > b.host ? 1 : -1)) } diff --git a/web-ui/src/pages/Machines/MachineForm.tsx b/web-ui/src/pages/Machines/MachineForm.tsx index ec1c65522b..fc49743e47 100644 --- a/web-ui/src/pages/Machines/MachineForm.tsx +++ b/web-ui/src/pages/Machines/MachineForm.tsx @@ -65,7 +65,7 @@ function correctFormValues( if (values.name === '') { values.name = `${ values.username || globalLoginOptions.username || DEF_UESRNAME - }@${values.host}:${values.ssh_port || DEF_SSH_PORT}` + }@${values.host}` } } @@ -143,6 +143,7 @@ export default function MachineForm({ const m = machines[machineID] form.setFieldsValue({ + host: m.host, ssh_port: m.ssh_port, isPubKeyAuth: m.isPubKeyAuth, From 833de2ecb088314d0921ead348e6a90a8de71bdb Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 28 Aug 2020 13:49:51 +0800 Subject: [PATCH 060/126] sync scale out --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 29 +++++++++- web-ui/src/pages/Deployment/CompsManager.tsx | 58 ++++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index dd65aa4bf0..9ae158a0c0 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -2,7 +2,7 @@ import React, { useMemo, useState, useCallback, useEffect } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { Space, Button, Modal, Table, Popconfirm } from 'antd' import { ExclamationCircleOutlined } from '@ant-design/icons' -import { useSessionStorageState } from 'ahooks' +import { useSessionStorageState, useLocalStorageState } from 'ahooks' import { deleteCluster, @@ -13,6 +13,7 @@ import { } from '../../utils/api' import { Root } from '../../components/Root' import { ICluster } from '.' +import { IComponent } from '../Deployment/DeploymentTable' export interface IClusterInstInfo { id: string @@ -38,6 +39,14 @@ export default function ClusterDetailPage() { IClusterInstInfo[] >(`${clusterName}_cluster_topo`, []) + const [curScaleOutNodes, setCurScaleOutNodes] = useLocalStorageState<{ + cluster_name: string + scale_out_nodes: any[] + }>('cur_scale_out_nodes', { cluster_name: '', scale_out_nodes: [] }) + const [components, setComponents] = useLocalStorageState<{ + [key: string]: IComponent + }>('components', {}) + const [loadingTopo, setLoadingTopo] = useState(false) const handleScaleInCluster = useCallback( @@ -99,11 +108,29 @@ export default function ClusterDetailPage() { setLoadingTopo(false) if (data !== undefined) { setClusterInstInfos(data) + updateLocalTopo(data) } }) // eslint-disable-next-line }, []) + function updateLocalTopo(clusters: IClusterInstInfo[]) { + if ( + curScaleOutNodes.cluster_name !== clusterName || + curScaleOutNodes.scale_out_nodes.length === 0 + ) { + return + } + let newComps = { ...components } + for (const n of curScaleOutNodes.scale_out_nodes) { + const exist = clusters.find((el) => el.id === n.node) + if (exist && newComps[n.id]) { + newComps[n.id].for_scale_out = false + } + } + setComponents(newComps) + } + function destroyCluster() { deleteCluster(clusterName) navigate('/status') diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/web-ui/src/pages/Deployment/CompsManager.tsx index 261524095c..ccab80ff52 100644 --- a/web-ui/src/pages/Deployment/CompsManager.tsx +++ b/web-ui/src/pages/Deployment/CompsManager.tsx @@ -22,6 +22,8 @@ import DeploymentTable, { DEF_PROM_PORT, DEF_GRAFANA_PORT, DEF_ALERT_CLUSTER_PORT, + DEF_PD_CLIENT_PORT, + DEF_ALERT_WEB_PORT, } from './DeploymentTable' import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' @@ -76,6 +78,11 @@ export default function CompsManager({ {} ) + const [curScaleOutNodes, setCurScaleOutNodes] = useLocalStorageState( + 'cur_scale_out_nodes', + {} + ) + const navigate = useNavigate() const [form] = Form.useForm() @@ -198,6 +205,57 @@ export default function CompsManager({ } function handleScaleOut() { + // save in local + // cluster name, scale out nodes + const scaleOutComps = Object.values(components).filter( + (comp) => comp.for_scale_out + ) + if (scaleOutComps.length === 0) { + Modal.warn({ + title: '扩容无法进行', + content: '没有可扩容的组件', + }) + return + } + + const scaleOutNodes: any[] = [] + for (const comp of scaleOutComps) { + let port: number = 0 + let rec = comp as any + + switch (rec.type) { + case 'TiDB': + port = rec.port || DEF_TIDB_PORT + break + case 'TiKV': + port = rec.port || DEF_TIKV_PORT + break + case 'TiFlash': + port = rec.tcp_port || DEF_TIFLASH_TCP_PORT + break + case 'PD': + port = rec.client_port || DEF_PD_CLIENT_PORT + break + case 'Prometheus': + port = rec.port || DEF_PROM_PORT + break + case 'Grafana': + port = rec.port || DEF_GRAFANA_PORT + break + case 'AlertManager': + port = rec.web_port || DEF_ALERT_WEB_PORT + break + } + + const machine = machines[comp.machineID] + scaleOutNodes.push({ id: comp.id, node: `${machine.host}:${port}` }) + } + setCurScaleOutNodes({ + cluster_name: clusterName!, + scale_out_nodes: scaleOutNodes, + }) + + // scale out const topoYaml = yaml.stringify( genTopo({ machines, components, forScaleOut }) ) From d2fe18f76043d35fcc2bd6a76a052d4e7fc8586f Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 28 Aug 2020 14:08:34 +0800 Subject: [PATCH 061/126] wip --- web-ui/src/pages/Deployment/TopoPreview.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index a3cbb3f196..69f9186990 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -33,6 +33,9 @@ export function genTopo({ data_dir: DEF_DATA_DIR_PREFIX, }, server_configs: { + // tidb: { + // 'performance.txn-total-size-limit': 1048576000, + // }, pd: { 'replication.enable-placement-rules': true, }, From bc86612b448990b42c3ff15b1480ba7d5af66a54 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 28 Aug 2020 16:57:49 +0800 Subject: [PATCH 062/126] embed assets --- Makefile | 6 +++ components/web/main.go | 29 ++++++++++++- components/web/uiserver/.gitignore | 1 + .../web/uiserver/empty_assets_handler.go | 22 ++++++++++ components/web/uiserver/uiserver.go | 32 ++++++++++++++ go.mod | 2 + go.sum | 3 ++ scripts/embed_ui_assets.sh | 42 +++++++++++++++++++ tools/assets_generate/main.go | 25 +++++++++++ 9 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 components/web/uiserver/.gitignore create mode 100644 components/web/uiserver/empty_assets_handler.go create mode 100644 components/web/uiserver/uiserver.go create mode 100755 scripts/embed_ui_assets.sh create mode 100644 tools/assets_generate/main.go diff --git a/Makefile b/Makefile index df2230a74c..c8a0083d7a 100644 --- a/Makefile +++ b/Makefile @@ -59,7 +59,13 @@ err: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-err ./components/err web: +ifeq ($(UI),1) + cd web-ui && yarn && yarn build + scripts/embed_ui_assets.sh + $(GOBUILD) -ldflags '$(LDFLAGS)' -tags ui_server -o bin/tiup-web ./components/web +else $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-web ./components/web +endif server: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-server ./server diff --git a/components/web/main.go b/components/web/main.go index 0ecaf3a125..5fedcea2d7 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -1,12 +1,16 @@ package main import ( + "fmt" "io/ioutil" + "net" "net/http" "strings" "github.com/gin-gonic/gin" "github.com/pingcap/tiup/components/cluster/command" + "github.com/pingcap/tiup/components/web/uiserver" + "github.com/pingcap/tiup/pkg/cluster" operator "github.com/pingcap/tiup/pkg/cluster/operation" "github.com/pingcap/tiup/pkg/cluster/spec" @@ -24,7 +28,7 @@ func main() { tidbSpec = spec.GetSpecManager() manager = cluster.NewManager("tidb", tidbSpec, spec.TiDBComponentVersion) - router := gin.Default() + router := gin.New() router.Use(cors.AllowAll()) api := router.Group("/api") { @@ -39,7 +43,28 @@ func main() { api.POST("/clusters/:clusterName/scale_in", scaleInClusterHandler) api.POST("/clusters/:clusterName/scale_out", scaleOutClusterHandler) } - _ = router.Run() + // router.GET("/", gin.WrapH(uiserver.Handler())) + // _ = router.Run() + + apiHandler := func(w http.ResponseWriter, r *http.Request) { + router.ServeHTTP(w, r) + } + + mux := http.DefaultServeMux + uiHandler := http.StripPrefix("", uiserver.Handler()) + mux.Handle("/api", http.HandlerFunc(apiHandler)) + mux.Handle("/", uiHandler) + + // TODO: configurable + listenAddr := "127.0.0.1:8080" + listener, err := net.Listen("tcp", listenAddr) + if err != nil { + fmt.Println("web server start failed") + return + } + + srv := &http.Server{Handler: mux} + _ = srv.Serve(listener) } // DeployGlobalLoginOptions represents the global options for deploy diff --git a/components/web/uiserver/.gitignore b/components/web/uiserver/.gitignore new file mode 100644 index 0000000000..6bdcefb9ec --- /dev/null +++ b/components/web/uiserver/.gitignore @@ -0,0 +1 @@ +/embedded_assets_handler.go diff --git a/components/web/uiserver/empty_assets_handler.go b/components/web/uiserver/empty_assets_handler.go new file mode 100644 index 0000000000..8b29f709bd --- /dev/null +++ b/components/web/uiserver/empty_assets_handler.go @@ -0,0 +1,22 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. +// +build !ui_server + +package uiserver + +import ( + "net/http" +) + +// Assets represent the front-end assets +var assets http.FileSystem = nil diff --git a/components/web/uiserver/uiserver.go b/components/web/uiserver/uiserver.go new file mode 100644 index 0000000000..fcf0fe80a0 --- /dev/null +++ b/components/web/uiserver/uiserver.go @@ -0,0 +1,32 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package uiserver + +import ( + "io" + "net/http" + + "github.com/shurcooL/httpgzip" +) + +// Handler to handle ui static files +func Handler() http.Handler { + if assets != nil { + return httpgzip.FileServer(assets, httpgzip.FileServerOptions{IndexHTML: true}) + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, _ = io.WriteString(w, "TiUP UI is not built. Use `UI=1 make`.\n") + }) +} diff --git a/go.mod b/go.mod index 6b7f95408e..6fdcdc64db 100644 --- a/go.mod +++ b/go.mod @@ -54,6 +54,8 @@ require ( github.com/rs/cors v1.7.0 github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44 github.com/shirou/gopsutil v2.20.3+incompatible + github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0 + github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/spf13/cobra v1.0.0 github.com/spf13/pflag v1.0.5 diff --git a/go.sum b/go.sum index 97fb9ac36c..969c2e000b 100644 --- a/go.sum +++ b/go.sum @@ -683,11 +683,14 @@ github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20191125035519-b054a8dfd10d/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200105231215-408a2507e114/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0 h1:mj/nMDAwTBiaCqMEs4cYCqF7pO6Np7vhy1D1wcQGz+E= github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20181020040650-a97a25d856ca/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= github.com/siddontang/go-log v0.0.0-20180807004314-8d05993dda07/go.mod h1:yFdBgwXP24JziuRl2NMUahT7nGLNOKi1SIiFxMttVD4= diff --git a/scripts/embed_ui_assets.sh b/scripts/embed_ui_assets.sh new file mode 100755 index 0000000000..4e90a85dab --- /dev/null +++ b/scripts/embed_ui_assets.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +# This script embeds UI assets into Golang source file. UI assets must be already built +# before calling this script. +# +# Available flags: +# NO_ASSET_BUILD_TAG=1 +# No build tags will be included in the generated source code. +# ASSET_BUILD_TAG=X +# Customize the build tag of the generated source code. If unspecified, build tag will be "ui_server". + +set -euo pipefail + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +PROJECT_DIR="$(dirname "$DIR")" + +# See https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module + +cd "$PROJECT_DIR" + +export GOBIN=$PROJECT_DIR/bin +export PATH=$GOBIN:$PATH + +echo "+ Preflight check" +if [ ! -d "web-ui/build" ]; then + echo " - Error: UI assets must be built first" + exit 1 +fi + +if [ "${NO_ASSET_BUILD_TAG:-}" = "1" ]; then + BUILD_TAG_PARAMETER="" +else + BUILD_TAG_PARAMETER=${ASSET_BUILD_TAG:-ui_server} +fi + +echo "+ Embed UI assets" + +go run tools/assets_generate/main.go $BUILD_TAG_PARAMETER + +HANDLER_PATH=components/web/uiserver/embedded_assets_handler.go +mv assets_vfsdata.go $HANDLER_PATH +echo " - Assets handler written to $HANDLER_PATH" diff --git a/tools/assets_generate/main.go b/tools/assets_generate/main.go new file mode 100644 index 0000000000..94a749da12 --- /dev/null +++ b/tools/assets_generate/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "log" + "net/http" + "os" + + "github.com/shurcooL/vfsgen" +) + +func main() { + buildTag := "" + if len(os.Args) > 1 { + buildTag = os.Args[1] + } + var fs http.FileSystem = http.Dir("web-ui/build") + err := vfsgen.Generate(fs, vfsgen.Options{ + BuildTags: buildTag, + PackageName: "uiserver", + VariableName: "assets", + }) + if err != nil { + log.Fatalln(err) + } +} From ff62f328cfbb4724820cf8f913d2bf77d31dfd29 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 28 Aug 2020 17:16:51 +0800 Subject: [PATCH 063/126] wip --- Makefile | 6 ++-- components/web/main.go | 29 ++++--------------- .../web/uiserver/empty_assets_handler.go | 2 +- components/web/uiserver/uiserver.go | 4 +-- tools/assets_generate/main.go | 2 +- web-ui/public/index.html | 4 ++- 6 files changed, 16 insertions(+), 31 deletions(-) diff --git a/Makefile b/Makefile index c8a0083d7a..0b7e4728ed 100644 --- a/Makefile +++ b/Makefile @@ -58,10 +58,12 @@ doc: err: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-err ./components/err -web: -ifeq ($(UI),1) +embed_ui: cd web-ui && yarn && yarn build scripts/embed_ui_assets.sh + +web: +ifeq ($(UI),1) $(GOBUILD) -ldflags '$(LDFLAGS)' -tags ui_server -o bin/tiup-web ./components/web else $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-web ./components/web diff --git a/components/web/main.go b/components/web/main.go index 5fedcea2d7..78c4b383b3 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -1,9 +1,7 @@ package main import ( - "fmt" "io/ioutil" - "net" "net/http" "strings" @@ -28,7 +26,7 @@ func main() { tidbSpec = spec.GetSpecManager() manager = cluster.NewManager("tidb", tidbSpec, spec.TiDBComponentVersion) - router := gin.New() + router := gin.Default() router.Use(cors.AllowAll()) api := router.Group("/api") { @@ -44,27 +42,10 @@ func main() { api.POST("/clusters/:clusterName/scale_out", scaleOutClusterHandler) } // router.GET("/", gin.WrapH(uiserver.Handler())) - // _ = router.Run() - - apiHandler := func(w http.ResponseWriter, r *http.Request) { - router.ServeHTTP(w, r) - } - - mux := http.DefaultServeMux - uiHandler := http.StripPrefix("", uiserver.Handler()) - mux.Handle("/api", http.HandlerFunc(apiHandler)) - mux.Handle("/", uiHandler) - - // TODO: configurable - listenAddr := "127.0.0.1:8080" - listener, err := net.Listen("tcp", listenAddr) - if err != nil { - fmt.Println("web server start failed") - return - } - - srv := &http.Server{Handler: mux} - _ = srv.Serve(listener) + // router.GET("/static", gin.WrapH(uiserver.Handler())) + router.StaticFS("/ui", uiserver.Assets) + router.StaticFS("/static", uiserver.Assets) + _ = router.Run() } // DeployGlobalLoginOptions represents the global options for deploy diff --git a/components/web/uiserver/empty_assets_handler.go b/components/web/uiserver/empty_assets_handler.go index 8b29f709bd..15445e7b39 100644 --- a/components/web/uiserver/empty_assets_handler.go +++ b/components/web/uiserver/empty_assets_handler.go @@ -19,4 +19,4 @@ import ( ) // Assets represent the front-end assets -var assets http.FileSystem = nil +var Assets http.FileSystem = nil diff --git a/components/web/uiserver/uiserver.go b/components/web/uiserver/uiserver.go index fcf0fe80a0..ddc2676aea 100644 --- a/components/web/uiserver/uiserver.go +++ b/components/web/uiserver/uiserver.go @@ -22,8 +22,8 @@ import ( // Handler to handle ui static files func Handler() http.Handler { - if assets != nil { - return httpgzip.FileServer(assets, httpgzip.FileServerOptions{IndexHTML: true}) + if Assets != nil { + return httpgzip.FileServer(Assets, httpgzip.FileServerOptions{IndexHTML: true}) } return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/tools/assets_generate/main.go b/tools/assets_generate/main.go index 94a749da12..010fc94e7b 100644 --- a/tools/assets_generate/main.go +++ b/tools/assets_generate/main.go @@ -17,7 +17,7 @@ func main() { err := vfsgen.Generate(fs, vfsgen.Options{ BuildTags: buildTag, PackageName: "uiserver", - VariableName: "assets", + VariableName: "Assets", }) if err != nil { log.Fatalln(err) diff --git a/web-ui/public/index.html b/web-ui/public/index.html index aa069f27cb..296b152065 100644 --- a/web-ui/public/index.html +++ b/web-ui/public/index.html @@ -28,7 +28,9 @@ -
+
+

TiUP UI

+
- - - React App + + TiUP + +
-

TiUP UI

+
- diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 9ae158a0c0..5edf6629b5 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -39,7 +39,7 @@ export default function ClusterDetailPage() { IClusterInstInfo[] >(`${clusterName}_cluster_topo`, []) - const [curScaleOutNodes, setCurScaleOutNodes] = useLocalStorageState<{ + const [curScaleOutNodes] = useLocalStorageState<{ cluster_name: string scale_out_nodes: any[] }>('cur_scale_out_nodes', { cluster_name: '', scale_out_nodes: [] }) diff --git a/web-ui/src/pages/Clusters/index.tsx b/web-ui/src/pages/Clusters/index.tsx index 2d2fd69cc6..bd61245a50 100644 --- a/web-ui/src/pages/Clusters/index.tsx +++ b/web-ui/src/pages/Clusters/index.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react' -import { Layout, Menu, Button, Space } from 'antd' +import { Layout, Menu, Space } from 'antd' import { NavLink, Outlet, useNavigate, Link } from 'react-router-dom' import { useSessionStorageState } from 'ahooks' import { getClusterList } from '../../utils/api' @@ -24,7 +24,8 @@ export default function ClustersPage() { getClusterList().then((res) => { const clusters = res.data || [] setClustersList(clusters) - if (clusters.length > 0) { + const paths = window.location.hash.split('/') // ['#', 'clusters', 'xxx'] + if (clusters.length === 1 && paths.length === 2) { navigate(`/clusters/${clusters[0].name}`) } }) @@ -47,9 +48,9 @@ export default function ClustersPage() { - {clustersList.map((clsuter) => ( - - {clsuter.name} + {clustersList.map((cluster) => ( + + {cluster.name} ))} diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/web-ui/src/pages/Deployment/CompsManager.tsx index ccab80ff52..97817d06af 100644 --- a/web-ui/src/pages/Deployment/CompsManager.tsx +++ b/web-ui/src/pages/Deployment/CompsManager.tsx @@ -78,7 +78,7 @@ export default function CompsManager({ {} ) - const [curScaleOutNodes, setCurScaleOutNodes] = useLocalStorageState( + const [, setCurScaleOutNodes] = useLocalStorageState( 'cur_scale_out_nodes', {} ) diff --git a/web-ui/src/pages/Home/index.tsx b/web-ui/src/pages/Home/index.tsx index 1db431d41c..1203a61912 100644 --- a/web-ui/src/pages/Home/index.tsx +++ b/web-ui/src/pages/Home/index.tsx @@ -14,7 +14,7 @@ function SiderMenu() { const [curMenu, setCurMenu] = useState('') useEffect(() => { - const path = window.location.pathname.split('/')[1] + const path = window.location.hash.split('/')[1] setCurMenu(path || '') }) From f26acefe18a326b69bad6544001cd26c1a3e11b0 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 29 Aug 2020 20:31:04 +0800 Subject: [PATCH 067/126] refine --- web-ui/src/pages/Clusters/index.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/web-ui/src/pages/Clusters/index.tsx b/web-ui/src/pages/Clusters/index.tsx index bd61245a50..f97fe403c6 100644 --- a/web-ui/src/pages/Clusters/index.tsx +++ b/web-ui/src/pages/Clusters/index.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react' +import React, { useEffect, useState } from 'react' import { Layout, Menu, Space } from 'antd' import { NavLink, Outlet, useNavigate, Link } from 'react-router-dom' import { useSessionStorageState } from 'ahooks' @@ -19,6 +19,7 @@ export default function ClustersPage() { [] ) const navigate = useNavigate() + const [curMenu, setCurMenu] = useState('') useEffect(() => { getClusterList().then((res) => { @@ -32,6 +33,13 @@ export default function ClustersPage() { // eslint-disable-next-line }, []) + useEffect(() => { + const paths = window.location.hash.split('/') // ['#', 'clusters', 'xxx'] + if (paths[1] === 'clusters') { + setCurMenu(paths[2] || '') + } + }) + if (clustersList.length === 0) { return ( @@ -47,7 +55,7 @@ export default function ClustersPage() { return ( - + {clustersList.map((cluster) => ( {cluster.name} From eb126d16e524d8b436065b63fae4ab0c0243ecb0 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 29 Aug 2020 20:59:22 +0800 Subject: [PATCH 068/126] fix routers --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 2 +- web-ui/src/pages/Deployment/DeploymentTable.tsx | 9 +++------ web-ui/src/pages/Machines/MachinesTable.tsx | 6 ++---- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 5edf6629b5..018ca2f640 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -94,7 +94,7 @@ export default function ClusterDetailPage() { okText="下线" cancelText="取消" > - 缩容 + 缩容 ) }, diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index f6a7c30faf..097fb86751 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -265,7 +265,7 @@ export default function DeploymentTable({ okText="删除" cancelText="取消" > - 删除{forScaleOut ? '扩容' : '部署'}组件 + 删除{forScaleOut ? '扩容' : '部署'}组件 ) @@ -273,10 +273,7 @@ export default function DeploymentTable({ if (forScaleOut === rec.for_scale_out) { return ( - onEditComponent && onEditComponent(rec)} - > + onEditComponent && onEditComponent(rec)}> 编辑 @@ -286,7 +283,7 @@ export default function DeploymentTable({ okText="删除" cancelText="取消" > - 删除 + 删除 ) diff --git a/web-ui/src/pages/Machines/MachinesTable.tsx b/web-ui/src/pages/Machines/MachinesTable.tsx index 6e8b14a57d..f6e72e9846 100644 --- a/web-ui/src/pages/Machines/MachinesTable.tsx +++ b/web-ui/src/pages/Machines/MachinesTable.tsx @@ -60,9 +60,7 @@ export default function MachinesTable({ key: 'action', render: (text: any, rec: any) => ( - onEdit && onEdit(rec)}> - 编辑 - + onEdit && onEdit(rec)}>编辑 - 删除 + 删除 ), From 4b0baa9700d0c7256abeadff4fc658955d7e581c Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Sat, 29 Aug 2020 21:16:13 +0800 Subject: [PATCH 069/126] refine, add redirect --- components/web/main.go | 4 ++++ web-ui/src/pages/Status/index.tsx | 12 ++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index 7b220c778a..8963f0edee 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -42,6 +42,10 @@ func main() { api.POST("/clusters/:clusterName/scale_out", scaleOutClusterHandler) } router.StaticFS("/tiup", uiserver.Assets) + router.GET("/", func(c *gin.Context) { + c.Redirect(http.StatusMovedPermanently, "/tiup") + c.Abort() + }) _ = router.Run() } diff --git a/web-ui/src/pages/Status/index.tsx b/web-ui/src/pages/Status/index.tsx index 010cbabad1..0431a26db9 100644 --- a/web-ui/src/pages/Status/index.tsx +++ b/web-ui/src/pages/Status/index.tsx @@ -2,9 +2,7 @@ import React, { useState, useEffect } from 'react' import { Link } from 'react-router-dom' import { Root } from '../../components/Root' -import OperationStatus, { - IOperationStatus, -} from './OperationStatus' +import OperationStatus, { IOperationStatus } from './OperationStatus' import { getStatus } from '../../utils/api' export default function StatusPage() { @@ -45,7 +43,13 @@ export default function StatusPage() { operationStatus.err_msg || operationStatus.cluster_name === '') && (
- 进入集群管理 + {operationStatus.operation_type === 'destroy' ? ( + 进入集群管理 + ) : ( + + 进入集群管理 + + )}
)}
From 201ae0bf5c3e48916bdb796984354165b4c6bd9f Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Mon, 31 Aug 2020 13:22:01 +0800 Subject: [PATCH 070/126] refine --- web-ui/src/components/Root.tsx | 11 ++++------- .../src/pages/Machines/GlobalLoginOptionsForm.tsx | 2 +- web-ui/src/pages/Machines/MachineForm.tsx | 15 ++++++++++++--- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/web-ui/src/components/Root.tsx b/web-ui/src/components/Root.tsx index ec881ddab9..94df865ce3 100644 --- a/web-ui/src/components/Root.tsx +++ b/web-ui/src/components/Root.tsx @@ -1,8 +1,5 @@ -import React, { ReactNode } from 'react' +import React, { FC } from 'react' -export interface IRootProps { - children?: ReactNode -} -export function Root({ children }: IRootProps) { - return
{children}
-} +export const Root: FC = ({ children }) => ( +
{children}
+) diff --git a/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx b/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx index d7eed110c3..d7cb64065b 100644 --- a/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx +++ b/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx @@ -8,7 +8,7 @@ export interface IGlobalLoginOptions { privateKeyPassword?: string } -export const DEF_UESRNAME = 'tidb' +export const DEF_UESRNAME = 'root' export interface IGlobalLoginOptionsFormProps { globalLoginOptions: IGlobalLoginOptions diff --git a/web-ui/src/pages/Machines/MachineForm.tsx b/web-ui/src/pages/Machines/MachineForm.tsx index fc49743e47..3111eacd86 100644 --- a/web-ui/src/pages/Machines/MachineForm.tsx +++ b/web-ui/src/pages/Machines/MachineForm.tsx @@ -218,7 +218,10 @@ export default function MachineForm({ - + 使用私钥登录 @@ -238,12 +241,18 @@ export default function MachineForm({ /> - + ) : ( - + ) }} From f9c021909a709e2866fa42c89b6ba3e447205196 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Mon, 31 Aug 2020 14:31:50 +0800 Subject: [PATCH 071/126] support assign password --- components/cluster/command/check.go | 2 +- components/web/main.go | 66 ++++++++++++++++++----------- pkg/cliutil/ssh.go | 16 +++++-- pkg/cluster/manager.go | 14 +++++- 4 files changed, 68 insertions(+), 30 deletions(-) diff --git a/components/cluster/command/check.go b/components/cluster/command/check.go index df04c30703..c52d0836b9 100644 --- a/components/cluster/command/check.go +++ b/components/cluster/command/check.go @@ -103,7 +103,7 @@ conflict checks with other clusters`, } } - sshConnProps, err := cliutil.ReadIdentityFileOrPassword(opt.identityFile, opt.usePassword) + sshConnProps, err := cliutil.ReadIdentityFileOrPassword(opt.identityFile, opt.usePassword, nil) if err != nil { return err } diff --git a/components/web/main.go b/components/web/main.go index 8963f0edee..815eae6838 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -82,25 +82,34 @@ func deployHandler(c *gin.Context) { topoFilePath := tmpfile.Name() tmpfile.Close() - // create private key file - tmpfile, err = ioutil.TempFile("", "private_key") - if err != nil { - _ = c.Error(err) - return + opt := cluster.DeployOptions{ + User: req.GlobalLoginOptions.Username, + } + if req.GlobalLoginOptions.Password != "" { + opt.UsePassword = true + opt.Pass = &req.GlobalLoginOptions.Password + } else { + // create private key file + tmpfile, err = ioutil.TempFile("", "private_key") + if err != nil { + _ = c.Error(err) + return + } + _, _ = tmpfile.WriteString(strings.TrimSpace(req.GlobalLoginOptions.PrivateKey)) + identifyFile := tmpfile.Name() + tmpfile.Close() + + opt.UsePassword = false + opt.IdentityFile = identifyFile + opt.Pass = &req.GlobalLoginOptions.PrivateKeyPassword } - _, _ = tmpfile.WriteString(strings.TrimSpace(req.GlobalLoginOptions.PrivateKey)) - identifyFile := tmpfile.Name() - tmpfile.Close() go func() { manager.DoDeploy( req.ClusterName, req.TiDBVersion, topoFilePath, - cluster.DeployOptions{ - User: req.GlobalLoginOptions.Username, - IdentityFile: identifyFile, - }, + opt, command.PostDeployHook, true, 120, @@ -250,15 +259,27 @@ func scaleOutClusterHandler(c *gin.Context) { topoFilePath := tmpfile.Name() tmpfile.Close() - // create private key file - tmpfile, err = ioutil.TempFile("", "private_key") - if err != nil { - _ = c.Error(err) - return + opt := cluster.ScaleOutOptions{ + User: req.GlobalLoginOptions.Username, + } + if req.GlobalLoginOptions.Password != "" { + opt.UsePassword = true + opt.Pass = &req.GlobalLoginOptions.Password + } else { + // create private key file + tmpfile, err = ioutil.TempFile("", "private_key") + if err != nil { + _ = c.Error(err) + return + } + _, _ = tmpfile.WriteString(strings.TrimSpace(req.GlobalLoginOptions.PrivateKey)) + identifyFile := tmpfile.Name() + tmpfile.Close() + + opt.UsePassword = false + opt.IdentityFile = identifyFile + opt.Pass = &req.GlobalLoginOptions.PrivateKeyPassword } - _, _ = tmpfile.WriteString(strings.TrimSpace(req.GlobalLoginOptions.PrivateKey)) - identifyFile := tmpfile.Name() - tmpfile.Close() go func() { manager.DoScaleOut( @@ -266,10 +287,7 @@ func scaleOutClusterHandler(c *gin.Context) { topoFilePath, command.PostScaleOutHook, command.Final, - cluster.ScaleOutOptions{ - User: req.GlobalLoginOptions.Username, - IdentityFile: identifyFile, - }, + opt, true, 120, 5, diff --git a/pkg/cliutil/ssh.go b/pkg/cliutil/ssh.go index 7918b207a3..d812407f77 100644 --- a/pkg/cliutil/ssh.go +++ b/pkg/cliutil/ssh.go @@ -34,10 +34,15 @@ type SSHConnectionProps struct { } // ReadIdentityFileOrPassword is ReadIdentityFileOrPassword -func ReadIdentityFileOrPassword(identityFilePath string, usePass bool) (*SSHConnectionProps, error) { +func ReadIdentityFileOrPassword(identityFilePath string, usePass bool, pwd *string) (*SSHConnectionProps, error) { // If identity file is not specified, prompt to read password if usePass { - password := PromptForPassword("Input SSH password: ") + var password string + if pwd != nil { + password = *pwd + } else { + password = PromptForPassword("Input SSH password: ") + } return &SSHConnectionProps{ Password: password, }, nil @@ -77,7 +82,12 @@ Looks like your SSH private key {{ColorKeyword}}{{.File}}{{ColorReset}} is inval } // SSH key is passphrase protected - passphrase := PromptForPassword("The SSH identity key is encrypted. Input its passphrase: ") + var passphrase string + if pwd != nil { + passphrase = *pwd + } else { + passphrase = PromptForPassword("The SSH identity key is encrypted. Input its passphrase: ") + } if _, err := sshkeys.ParseEncryptedPrivateKey(buf, []byte(passphrase)); err != nil { return nil, ErrIdentityFileReadFiled. Wrap(err, "Failed to decrypt SSH identity file '%s'", identityFilePath) diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 811bdd4004..a376c116cf 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -982,6 +982,8 @@ type ScaleOutOptions struct { SkipCreateUser bool // don't create user IdentityFile string // path to the private key file UsePassword bool // use password instead of identity file for ssh connection + + Pass *string // password for login User or passphrase for IdentityFile } // DeployOptions contains the options for scale out. @@ -992,6 +994,8 @@ type DeployOptions struct { IdentityFile string // path to the private key file UsePassword bool // use password instead of identity file for ssh connection IgnoreConfigCheck bool // ignore config check result + + Pass *string // password for login User or passphrase for IdentityFile } // DeployerInstance is a instance can deploy to a target deploy directory. @@ -1080,7 +1084,10 @@ func (m *Manager) Deploy( } } - sshConnProps, err := cliutil.ReadIdentityFileOrPassword(opt.IdentityFile, opt.UsePassword) + sshConnProps, err := cliutil.ReadIdentityFileOrPassword( + opt.IdentityFile, + opt.UsePassword, + opt.Pass) if err != nil { return err } @@ -1551,7 +1558,10 @@ func (m *Manager) ScaleOut( } } - sshConnProps, err := cliutil.ReadIdentityFileOrPassword(opt.IdentityFile, opt.UsePassword) + sshConnProps, err := cliutil.ReadIdentityFileOrPassword( + opt.IdentityFile, + opt.UsePassword, + opt.Pass) if err != nil { return err } From 01149df31b9afe79e7d74039e840e9e87373a65b Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Mon, 31 Aug 2020 15:47:39 +0800 Subject: [PATCH 072/126] refine --- web-ui/src/utils/api.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web-ui/src/utils/api.ts b/web-ui/src/utils/api.ts index f4e419bc0e..d2ce507a37 100644 --- a/web-ui/src/utils/api.ts +++ b/web-ui/src/utils/api.ts @@ -1,6 +1,7 @@ import request from './request' -const API_URL = 'http://127.0.0.1:8080/api' +const API_URL = + process.env.NODE_ENV === 'production' ? '/api' : 'http://127.0.0.1:8080/api' function fullUrl(path: string): string { return `${API_URL}/${path}` From 17137cd1a65582616c5add897ceeb923e058fd2a Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Mon, 31 Aug 2020 18:15:24 +0800 Subject: [PATCH 073/126] extract types --- web-ui/src/types/comps.ts | 235 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 web-ui/src/types/comps.ts diff --git a/web-ui/src/types/comps.ts b/web-ui/src/types/comps.ts new file mode 100644 index 0000000000..d3ed035a4f --- /dev/null +++ b/web-ui/src/types/comps.ts @@ -0,0 +1,235 @@ +import uniqid from 'uniqid' + +const COMP_COLORS = { + TiDB: 'magenta', + TiKV: 'orange', + TiFlash: 'red', + PD: 'purple', + Prometheus: 'green', + Grafana: 'cyan', + AlertManager: 'blue', +} + +type CompTypes = keyof typeof COMP_COLORS // "TiDB" | "TiKV" | "TiFlash" | ... + +export const COMP_TYPES_ARR = [ + 'TiDB', + 'TiKV', + 'TiFlash', + 'PD', + 'Prometheus', + 'Grafana', + 'AlertManager', +] + +/////////////////////// + +const DEF_DEPLOY_DIR_PREFIX = 'tidb-deploy' +const DEF_DATA_DIR_PREFIX = 'tidb-data' +export abstract class BaseComp { + id: string + machineID: string + type: CompTypes + for_scale_out: boolean + priority: number + color: string + + deploy_dir_prefix?: string // "tidb-deploy" + data_dir_prefix?: string // "tidb-data", TiDB and Grafana have no data_dir + + constructor(machineID: string, compType: CompTypes, for_scale_out: boolean) { + this.id = uniqid() + this.machineID = machineID + this.type = compType + this.for_scale_out = for_scale_out + this.priority = COMP_TYPES_ARR.indexOf(compType) + this.color = COMP_COLORS[compType] + } + + public abstract ports(): string + public abstract increasePorts(comp: BaseComp): void +} + +/////////////////////// + +const DEF_TIDB_PORT = 4000 +const DEF_TIDB_STATUS_PORT = 10080 +export class TiDBComp extends BaseComp { + port?: number + status_port?: number + + constructor(machineID: string, for_scale_out: boolean) { + super(machineID, 'TiDB', for_scale_out) + } + + public ports() { + return `${this.port || DEF_TIDB_PORT}/${ + this.status_port || DEF_TIDB_STATUS_PORT + }` + } + + public increasePorts(comp: BaseComp) { + const c = comp as TiDBComp + this.port = (c.port || DEF_TIDB_PORT) + 1 + this.status_port = (c.status_port || DEF_TIDB_STATUS_PORT) + 1 + } +} + +/////////////////////// + +const DEF_TIKV_PORT = 20160 +const DEF_TIKV_STATUS_PORT = 20180 +export class TiKVComp extends BaseComp { + port?: number + status_port?: number + + constructor(machineID: string, for_scale_out: boolean) { + super(machineID, 'TiKV', for_scale_out) + } + + public ports() { + return `${this.port || DEF_TIKV_PORT}/${ + this.status_port || DEF_TIKV_STATUS_PORT + }` + } + + public increasePorts(comp: BaseComp) { + const c = comp as TiKVComp + this.port = (c.port || DEF_TIKV_PORT) + 1 + this.status_port = (c.status_port || DEF_TIKV_STATUS_PORT) + 1 + } +} + +/////////////////////// + +const DEF_TIFLASH_TCP_PORT = 9000 +const DEF_TIFLASH_HTTP_PORT = 8123 +const DEF_TIFLASH_SERVICE_PORT = 3930 +const DEF_TIFLASH_PROXY_PORT = 20170 +const DEF_TIFLASH_PROXY_STATUS_PORT = 20292 +const DEF_TIFLASH_METRICS_PORT = 8234 +export class TiFlashComp extends BaseComp { + tcp_port?: number + http_port?: number + flash_service_port?: number + flash_proxy_port?: number + flash_proxy_status_port?: number + metrics_port?: number + + constructor(machineID: string, for_scale_out: boolean) { + super(machineID, 'TiFlash', for_scale_out) + } + + public ports() { + return `${this.tcp_port || DEF_TIFLASH_TCP_PORT}/${ + this.http_port || DEF_TIFLASH_HTTP_PORT + }/${this.flash_service_port || DEF_TIFLASH_SERVICE_PORT}/${ + this.flash_proxy_port || DEF_TIFLASH_PROXY_PORT + }/${this.flash_proxy_status_port || DEF_TIFLASH_PROXY_STATUS_PORT}/${ + this.metrics_port || DEF_TIFLASH_METRICS_PORT + }` + } + + public increasePorts(comp: BaseComp) { + const c = comp as TiFlashComp + this.tcp_port = (c.tcp_port || DEF_TIFLASH_TCP_PORT) + 1 + this.http_port = (c.http_port || DEF_TIFLASH_HTTP_PORT) + 1 + this.flash_service_port = + (c.flash_service_port || DEF_TIFLASH_SERVICE_PORT) + 1 + this.flash_proxy_port = (c.flash_proxy_port || DEF_TIFLASH_PROXY_PORT) + 1 + this.flash_proxy_status_port = + (c.flash_proxy_status_port || DEF_TIFLASH_PROXY_STATUS_PORT) + 1 + this.metrics_port = (c.metrics_port || DEF_TIFLASH_METRICS_PORT) + 1 + } +} + +/////////////////////// + +const DEF_PD_CLIENT_PORT = 2379 +const DEF_PD_PEER_PORT = 2380 +export class PDComp extends BaseComp { + client_port?: number + peer_port?: number + + constructor(machineID: string, for_scale_out: boolean) { + super(machineID, 'PD', for_scale_out) + } + + public ports() { + return `${this.client_port || DEF_PD_CLIENT_PORT}/${ + this.peer_port || DEF_PD_PEER_PORT + }` + } + + public increasePorts(comp: BaseComp) { + const c = comp as PDComp + this.client_port = (c.client_port || DEF_PD_CLIENT_PORT) + 1 + this.peer_port = (c.peer_port || DEF_PD_PEER_PORT) + 1 + } +} + +/////////////////////// + +const DEF_PROM_PORT = 9090 +export class PromComp extends BaseComp { + port?: number + + constructor(machineID: string, for_scale_out: boolean) { + super(machineID, 'Prometheus', for_scale_out) + } + + public ports() { + return `${this.port || DEF_PROM_PORT}` + } + + public increasePorts(comp: BaseComp) { + const c = comp as PromComp + this.port = (c.port || DEF_PROM_PORT) + 1 + } +} + +/////////////////////// + +const DEF_GRAFANA_PORT = 3000 +export class GrafanaComp extends BaseComp { + port?: number + + constructor(machineID: string, for_scale_out: boolean) { + super(machineID, 'Grafana', for_scale_out) + } + + public ports() { + return `${this.port || DEF_PROM_PORT}` + } + + public increasePorts(comp: BaseComp) { + const c = comp as GrafanaComp + this.port = (c.port || DEF_GRAFANA_PORT) + 1 + } +} + +/////////////////////// + +const DEF_ALERT_WEB_PORT = 9093 +const DEF_ALERT_CLUSTER_PORT = 9094 +export class AlertManagerComp extends BaseComp { + web_port?: number + cluster_port?: number + + constructor(machineID: string, for_scale_out: boolean) { + super(machineID, 'AlertManager', for_scale_out) + } + + public ports() { + return `${this.web_port || DEF_ALERT_WEB_PORT}/${ + this.cluster_port || DEF_ALERT_CLUSTER_PORT + } + ` + } + + public increasePorts(comp: BaseComp) { + const c = comp as AlertManagerComp + this.web_port = (c.web_port || DEF_ALERT_WEB_PORT) + 1 + this.cluster_port = (c.cluster_port || DEF_ALERT_CLUSTER_PORT) + 1 + } +} From 8bd384fb98805ebb7817dc52f37df9d30d8b92e6 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Mon, 31 Aug 2020 21:47:15 +0800 Subject: [PATCH 074/126] wip --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 4 +- web-ui/src/pages/Deployment/CompsManager.tsx | 116 ++------------ .../src/pages/Deployment/DeploymentTable.tsx | 147 ++---------------- web-ui/src/pages/Deployment/EditCompForm.tsx | 8 +- web-ui/src/pages/Deployment/TopoPreview.tsx | 10 +- web-ui/src/pages/Machines/index.tsx | 4 +- web-ui/src/types/comps.ts | 104 ++++++++++--- 7 files changed, 119 insertions(+), 274 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 018ca2f640..6b403fae87 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -13,7 +13,7 @@ import { } from '../../utils/api' import { Root } from '../../components/Root' import { ICluster } from '.' -import { IComponent } from '../Deployment/DeploymentTable' +import { BaseComp } from '../../types/comps' export interface IClusterInstInfo { id: string @@ -44,7 +44,7 @@ export default function ClusterDetailPage() { scale_out_nodes: any[] }>('cur_scale_out_nodes', { cluster_name: '', scale_out_nodes: [] }) const [components, setComponents] = useLocalStorageState<{ - [key: string]: IComponent + [key: string]: BaseComp }>('components', {}) const [loadingTopo, setLoadingTopo] = useState(false) diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/web-ui/src/pages/Deployment/CompsManager.tsx index 97817d06af..56bef7efcc 100644 --- a/web-ui/src/pages/Deployment/CompsManager.tsx +++ b/web-ui/src/pages/Deployment/CompsManager.tsx @@ -1,36 +1,17 @@ import React, { useCallback, useState } from 'react' import { useLocalStorageState } from 'ahooks' import { Drawer, Button, Modal, Form, Input, Select } from 'antd' -import uniqid from 'uniqid' import yaml from 'yaml' import { IMachine } from '../Machines/MachineForm' -import DeploymentTable, { - IComponent, - COMPONENT_TYPES, - DEF_TIDB_PORT, - DEF_TIDB_STATUS_PORT, - DEF_TIKV_PORT, - DEF_TIKV_STATUS_PORT, - DEF_TIFLASH_TCP_PORT, - DEF_TIFLASH_HTTP_PORT, - DEF_TIFLASH_SERVICE_PORT, - DEF_TIFLASH_PROXY_PORT, - DEF_TIFLASH_PROXY_STATUS_PORT, - DEF_TIFLASH_METRICS_PORT, - DEF_PD_PEER_PORT, - DEF_PROM_PORT, - DEF_GRAFANA_PORT, - DEF_ALERT_CLUSTER_PORT, - DEF_PD_CLIENT_PORT, - DEF_ALERT_WEB_PORT, -} from './DeploymentTable' +import DeploymentTable from './DeploymentTable' import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' import { Root } from '../../components/Root' import { deployCluster, scaleOutCluster } from '../../utils/api' import { IGlobalLoginOptions } from '../Machines/GlobalLoginOptionsForm' import { useNavigate } from 'react-router-dom' +import { BaseComp, CompTypes } from '../../types/comps' // TODO: fetch from API const TIDB_VERSIONS = [ @@ -62,9 +43,9 @@ export default function CompsManager({ [key: string]: IMachine }>('machines', {}) const [components, setComponents] = useLocalStorageState<{ - [key: string]: IComponent + [key: string]: BaseComp }>('components', {}) - const [curComp, setCurComp] = useState(undefined) + const [curComp, setCurComp] = useState(undefined) const [previewYaml, setPreviewYaml] = useState(false) @@ -88,65 +69,16 @@ export default function CompsManager({ const [form] = Form.useForm() const handleAddComponent = useCallback( - (machine: IMachine, componentType: string, forScaleOut: boolean) => { - let comp: IComponent = { - id: uniqid(), - machineID: machine.id, - type: componentType, - for_scale_out: forScaleOut, - priority: COMPONENT_TYPES.indexOf(componentType), - } + (machine: IMachine, componentType: CompTypes, forScaleOut: boolean) => { + let comp = BaseComp.create(componentType, machine.id, forScaleOut) const existedSameComps = Object.values(components).filter( (comp) => comp.type === componentType && comp.machineID === machine.id ) if (existedSameComps.length > 0) { - const lastComp = existedSameComps[existedSameComps.length - 1] as any + const lastComp = existedSameComps[existedSameComps.length - 1] comp.deploy_dir_prefix = lastComp.deploy_dir_prefix comp.data_dir_prefix = lastComp.data_dir_prefix - let newComp = comp as any - switch (componentType) { - case 'TiDB': - newComp.port = (lastComp.port || DEF_TIDB_PORT) + 1 - newComp.status_port = - (lastComp.status_port || DEF_TIDB_STATUS_PORT) + 1 - break - case 'TiKV': - newComp.port = (lastComp.port || DEF_TIKV_PORT) + 1 - newComp.status_port = - (lastComp.status_port || DEF_TIKV_STATUS_PORT) + 1 - break - case 'TiFlash': - newComp.tcp_port = (lastComp.tcp_port || DEF_TIFLASH_TCP_PORT) + 1 - newComp.http_port = - (lastComp.http_port || DEF_TIFLASH_HTTP_PORT) + 1 - newComp.flash_service_port = - (lastComp.flash_service_port || DEF_TIFLASH_SERVICE_PORT) + 1 - newComp.flash_proxy_port = - (lastComp.flash_proxy_port || DEF_TIFLASH_PROXY_PORT) + 1 - newComp.flash_proxy_status_port = - (lastComp.flash_proxy_status_port || - DEF_TIFLASH_PROXY_STATUS_PORT) + 1 - newComp.metrics_port = - (lastComp.metrics_port || DEF_TIFLASH_METRICS_PORT) + 1 - break - case 'PD': - newComp.client_port = (lastComp.peer_port || DEF_PD_PEER_PORT) + 1 - newComp.peer_port = (lastComp.peer_port || DEF_PD_PEER_PORT) + 2 - break - case 'Prometheus': - newComp.port = (lastComp.port || DEF_PROM_PORT) + 1 - break - case 'Grafana': - newComp.port = (lastComp.port || DEF_GRAFANA_PORT) + 2 - break - case 'AlertManager': - newComp.web_port = - (lastComp.cluster_port || DEF_ALERT_CLUSTER_PORT) + 1 - newComp.cluster_port = - (lastComp.cluster_port || DEF_ALERT_CLUSTER_PORT) + 2 - break - } - comp = newComp + comp.increasePorts(lastComp) } setComponents({ ...components, @@ -157,7 +89,7 @@ export default function CompsManager({ ) const handleUpdateComponent = useCallback( - (comp: IComponent) => { + (comp: BaseComp) => { setComponents({ ...components, [comp.id]: comp, @@ -168,7 +100,7 @@ export default function CompsManager({ ) const handleDeleteComponent = useCallback( - (comp: IComponent) => { + (comp: BaseComp) => { const newComps = { ...components } delete newComps[comp.id] setComponents(newComps) @@ -220,33 +152,7 @@ export default function CompsManager({ const scaleOutNodes: any[] = [] for (const comp of scaleOutComps) { - let port: number = 0 - let rec = comp as any - - switch (rec.type) { - case 'TiDB': - port = rec.port || DEF_TIDB_PORT - break - case 'TiKV': - port = rec.port || DEF_TIKV_PORT - break - case 'TiFlash': - port = rec.tcp_port || DEF_TIFLASH_TCP_PORT - break - case 'PD': - port = rec.client_port || DEF_PD_CLIENT_PORT - break - case 'Prometheus': - port = rec.port || DEF_PROM_PORT - break - case 'Grafana': - port = rec.port || DEF_GRAFANA_PORT - break - case 'AlertManager': - port = rec.web_port || DEF_ALERT_WEB_PORT - break - } - + let port: number = comp.symbolPort() const machine = machines[comp.machineID] scaleOutNodes.push({ id: comp.id, node: `${machine.host}:${port}` }) } diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index 097fb86751..7dcd6f7a2c 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -8,104 +8,19 @@ import { IGlobalLoginOptions, DEF_UESRNAME, } from '../Machines/GlobalLoginOptionsForm' - -export const COMPONENT_TYPES = [ - 'TiDB', - 'TiKV', - 'TiFlash', - 'PD', - 'Prometheus', - 'Grafana', - 'AlertManager', -] - -const COMPONENT_COLORS = { - TiDB: 'magenta', - TiKV: 'orange', - TiFlash: 'red', - PD: 'purple', - Prometheus: 'green', - Grafana: 'cyan', - AlertManager: 'blue', -} - -export interface IComponent { - id: string - machineID: string - type: string - for_scale_out: boolean - priority: number - - deploy_dir_prefix?: string // "tidb-deploy" - data_dir_prefix?: string // "tidb-data", TiDB and Grafana have no data_dir -} -export const DEF_DEPLOY_DIR_PREFIX = 'tidb-deploy' -export const DEF_DATA_DIR_PREFIX = 'tidb-data' - -export interface ITiDBComponent extends IComponent { - port?: number // 4000 - status_port?: number // 10080 -} -export const DEF_TIDB_PORT = 4000 -export const DEF_TIDB_STATUS_PORT = 10080 - -export interface ITiKVComponent extends IComponent { - port?: number // 20160 - status_port?: number // 20180 -} -export const DEF_TIKV_PORT = 20160 -export const DEF_TIKV_STATUS_PORT = 20180 - -export interface ITiFlashComponent extends IComponent { - tcp_port?: number // 9000 - http_port?: number // 8123 - flash_service_port?: number // 3930 - flash_proxy_port?: number // 20170 - flash_proxy_status_port?: number // 20292 - metrics_port?: number // 8234 -} -export const DEF_TIFLASH_TCP_PORT = 9000 -export const DEF_TIFLASH_HTTP_PORT = 8123 -export const DEF_TIFLASH_SERVICE_PORT = 3930 -export const DEF_TIFLASH_PROXY_PORT = 20170 -export const DEF_TIFLASH_PROXY_STATUS_PORT = 20292 -export const DEF_TIFLASH_METRICS_PORT = 8234 - -export interface IPDComponent extends IComponent { - client_port?: number // 2379 - peer_port?: number // 2380 -} -export const DEF_PD_CLIENT_PORT = 2379 -export const DEF_PD_PEER_PORT = 2380 - -export interface IPrometheusComponent extends IComponent { - port?: number // 9090 -} -export const DEF_PROM_PORT = 9090 - -export interface IGrafanaComponent extends IComponent { - port?: number // 3000 -} -export const DEF_GRAFANA_PORT = 3000 - -export interface IAlertManagerComponent extends IComponent { - web_port?: number // 9093 - cluster_port?: number // 9094 -} -export const DEF_ALERT_WEB_PORT = 9093 -export const DEF_ALERT_CLUSTER_PORT = 9094 +import { BaseComp, COMP_TYPES_ARR, CompTypes } from '../../types/comps' interface IDeploymentTableProps { forScaleOut: boolean // deploy or scale out machines: { [key: string]: IMachine } - components: { [key: string]: IComponent } + components: { [key: string]: BaseComp } onAddComponent?: ( machine: IMachine, - componentType: string, + componentType: CompTypes, forScaleOut: boolean ) => void - onEditComponent?: (comp: IComponent) => void - onDeleteComponent?: (comp: IComponent) => void + onEditComponent?: (comp: BaseComp) => void + onDeleteComponent?: (comp: BaseComp) => void onDeleteComponents?: (machine: IMachine, forScaleOut: boolean) => void } @@ -124,7 +39,7 @@ export default function DeploymentTable({ ) const dataSource = useMemo(() => { - let machinesAndComps: (IMachine | IComponent)[] = [] + let machinesAndComps: (IMachine | BaseComp)[] = [] const sortedMachines = Object.values(machines).sort((a, b) => a.host > b.host ? 1 : -1 ) @@ -166,7 +81,7 @@ export default function DeploymentTable({ return (
--  - + {rec.type} {rec.for_scale_out ? ' (Scale)' : ''} @@ -183,49 +98,7 @@ export default function DeploymentTable({ rec.username || globalLoginOptions.username || DEF_UESRNAME }, DC=${rec.dc}, Rack=${rec.rack}` } - switch (rec.type) { - case 'TiDB': - return `Port=${rec.port || DEF_TIDB_PORT}/${ - rec.status_port || DEF_TIDB_STATUS_PORT - }, Path=${rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX}` - case 'TiKV': - return `Port=${rec.port || DEF_TIKV_PORT}/${ - rec.status_port || DEF_TIKV_STATUS_PORT - }, Path=${rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX},${ - rec.data_dir_prefix || DEF_DATA_DIR_PREFIX - }` - case 'TiFlash': - return `Port=${rec.tcp_port || DEF_TIFLASH_TCP_PORT}/${ - rec.http_port || DEF_TIFLASH_HTTP_PORT - }/${rec.flash_service_port || DEF_TIFLASH_SERVICE_PORT}/${ - rec.flash_proxy_port || DEF_TIFLASH_PROXY_PORT - }/${ - rec.flash_proxy_status_port || DEF_TIFLASH_PROXY_STATUS_PORT - }/${rec.metrics_port || DEF_TIFLASH_METRICS_PORT}, Path=${ - rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX - },${rec.data_dir_prefix || DEF_DATA_DIR_PREFIX}` - case 'PD': - return `Port=${rec.client_port || DEF_PD_CLIENT_PORT}/${ - rec.peer_port || DEF_PD_PEER_PORT - }, Path=${rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX},${ - rec.data_dir_prefix || DEF_DATA_DIR_PREFIX - }` - case 'Prometheus': - return `Port=${rec.port || DEF_PROM_PORT}, Path=${ - rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX - },${rec.data_dir_prefix || DEF_DATA_DIR_PREFIX}` - case 'Grafana': - return `Port=${rec.port || DEF_GRAFANA_PORT}, Path=${ - rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX - }` - case 'AlertManager': - return `Port=${rec.web_port || DEF_ALERT_WEB_PORT}/${ - rec.cluster_port || DEF_ALERT_CLUSTER_PORT - }, Path=${rec.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX},${ - rec.data_dir_prefix || DEF_DATA_DIR_PREFIX - }` - } - return '...' + return `Port=${rec.ports()}, Path=${rec.paths()}` }, }, { @@ -240,10 +113,10 @@ export default function DeploymentTable({ onAddComponent && - onAddComponent(rec, e.key as string, forScaleOut) + onAddComponent(rec, e.key as CompTypes, forScaleOut) } > - {COMPONENT_TYPES.map((t) => ( + {COMP_TYPES_ARR.map((t) => ( {t} ))} diff --git a/web-ui/src/pages/Deployment/EditCompForm.tsx b/web-ui/src/pages/Deployment/EditCompForm.tsx index 90b395cb50..f54f577593 100644 --- a/web-ui/src/pages/Deployment/EditCompForm.tsx +++ b/web-ui/src/pages/Deployment/EditCompForm.tsx @@ -2,7 +2,7 @@ import React from 'react' import { Form, Input, Button } from 'antd' import { - IComponent, + BaseComp, DEF_DEPLOY_DIR_PREFIX, DEF_DATA_DIR_PREFIX, DEF_TIDB_PORT, @@ -21,11 +21,11 @@ import { DEF_PROM_PORT, DEF_ALERT_WEB_PORT, DEF_ALERT_CLUSTER_PORT, -} from './DeploymentTable' +} from '../../types/comps' interface IEditCompFormProps { - comp?: IComponent - onUpdateComp: (comp: IComponent) => void + comp?: BaseComp + onUpdateComp: (comp: BaseComp) => void } export default function EditCompForm({ diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index 69f9186990..5e9fcb0319 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -3,16 +3,16 @@ import yaml from 'yaml' import { IMachine } from '../Machines/MachineForm' import { - IComponent, - COMPONENT_TYPES, + BaseComp, DEF_DEPLOY_DIR_PREFIX, DEF_DATA_DIR_PREFIX, -} from './DeploymentTable' + COMP_TYPES_ARR, +} from '../../types/comps' interface ITopoPreviewProps { forScaleOut: boolean machines: { [key: string]: IMachine } - components: { [key: string]: IComponent } + components: { [key: string]: BaseComp } } // TODO: split into 2 methods: genDeployTopo, genScaleOutTopo @@ -43,7 +43,7 @@ export function genTopo({ } } - for (const compType of COMPONENT_TYPES) { + for (const compType of COMP_TYPES_ARR) { const comps = componentsArr.filter( (comp) => comp.type === compType && comp.for_scale_out === forScaleOut ) as any[] diff --git a/web-ui/src/pages/Machines/index.tsx b/web-ui/src/pages/Machines/index.tsx index c16be0be48..50400c92bb 100644 --- a/web-ui/src/pages/Machines/index.tsx +++ b/web-ui/src/pages/Machines/index.tsx @@ -4,11 +4,11 @@ import { useLocalStorageState } from 'ahooks' import MachineForm, { IMachine } from './MachineForm' import MachinesTable from './MachinesTable' -import { IComponent } from '../Deployment/DeploymentTable' import { Root } from '../../components/Root' import GlobalLoginOptionsForm, { IGlobalLoginOptions, } from './GlobalLoginOptionsForm' +import { BaseComp } from '../../types/comps' export default function MachinesPage() { const [showForm, setShowForm] = useState(false) @@ -18,7 +18,7 @@ export default function MachinesPage() { [key: string]: IMachine }>('machines', {}) const [components, setComponents] = useLocalStorageState<{ - [key: string]: IComponent + [key: string]: BaseComp }>('components', {}) const [globalLoginOptions, setGlobalLoginOptions] = useLocalStorageState< diff --git a/web-ui/src/types/comps.ts b/web-ui/src/types/comps.ts index d3ed035a4f..8274445213 100644 --- a/web-ui/src/types/comps.ts +++ b/web-ui/src/types/comps.ts @@ -10,7 +10,7 @@ const COMP_COLORS = { AlertManager: 'blue', } -type CompTypes = keyof typeof COMP_COLORS // "TiDB" | "TiKV" | "TiFlash" | ... +export type CompTypes = keyof typeof COMP_COLORS // "TiDB" | "TiKV" | "TiFlash" | ... export const COMP_TYPES_ARR = [ 'TiDB', @@ -24,8 +24,8 @@ export const COMP_TYPES_ARR = [ /////////////////////// -const DEF_DEPLOY_DIR_PREFIX = 'tidb-deploy' -const DEF_DATA_DIR_PREFIX = 'tidb-data' +export const DEF_DEPLOY_DIR_PREFIX = 'tidb-deploy' +export const DEF_DATA_DIR_PREFIX = 'tidb-data' export abstract class BaseComp { id: string machineID: string @@ -46,14 +46,44 @@ export abstract class BaseComp { this.color = COMP_COLORS[compType] } + public paths(): string { + return `${this.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX},${ + this.data_dir_prefix || DEF_DATA_DIR_PREFIX + }` + } + + public abstract symbolPort(): number public abstract ports(): string public abstract increasePorts(comp: BaseComp): void + + static create( + compType: CompTypes, + machineID: string, + for_scale_out: boolean + ): BaseComp { + switch (compType) { + case 'TiDB': + return new TiDBComp(machineID, for_scale_out) + case 'TiKV': + return new TiKVComp(machineID, for_scale_out) + case 'TiFlash': + return new TiFlashComp(machineID, for_scale_out) + case 'PD': + return new PDComp(machineID, for_scale_out) + case 'Prometheus': + return new PromComp(machineID, for_scale_out) + case 'Grafana': + return new GrafanaComp(machineID, for_scale_out) + case 'AlertManager': + return new AlertManagerComp(machineID, for_scale_out) + } + } } /////////////////////// -const DEF_TIDB_PORT = 4000 -const DEF_TIDB_STATUS_PORT = 10080 +export const DEF_TIDB_PORT = 4000 +export const DEF_TIDB_STATUS_PORT = 10080 export class TiDBComp extends BaseComp { port?: number status_port?: number @@ -62,6 +92,14 @@ export class TiDBComp extends BaseComp { super(machineID, 'TiDB', for_scale_out) } + public paths(): string { + return `${this.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX}` + } + + public symbolPort() { + return this.port || DEF_TIDB_PORT + } + public ports() { return `${this.port || DEF_TIDB_PORT}/${ this.status_port || DEF_TIDB_STATUS_PORT @@ -77,8 +115,8 @@ export class TiDBComp extends BaseComp { /////////////////////// -const DEF_TIKV_PORT = 20160 -const DEF_TIKV_STATUS_PORT = 20180 +export const DEF_TIKV_PORT = 20160 +export const DEF_TIKV_STATUS_PORT = 20180 export class TiKVComp extends BaseComp { port?: number status_port?: number @@ -87,6 +125,10 @@ export class TiKVComp extends BaseComp { super(machineID, 'TiKV', for_scale_out) } + public symbolPort() { + return this.port || DEF_TIKV_PORT + } + public ports() { return `${this.port || DEF_TIKV_PORT}/${ this.status_port || DEF_TIKV_STATUS_PORT @@ -102,12 +144,12 @@ export class TiKVComp extends BaseComp { /////////////////////// -const DEF_TIFLASH_TCP_PORT = 9000 -const DEF_TIFLASH_HTTP_PORT = 8123 -const DEF_TIFLASH_SERVICE_PORT = 3930 -const DEF_TIFLASH_PROXY_PORT = 20170 -const DEF_TIFLASH_PROXY_STATUS_PORT = 20292 -const DEF_TIFLASH_METRICS_PORT = 8234 +export const DEF_TIFLASH_TCP_PORT = 9000 +export const DEF_TIFLASH_HTTP_PORT = 8123 +export const DEF_TIFLASH_SERVICE_PORT = 3930 +export const DEF_TIFLASH_PROXY_PORT = 20170 +export const DEF_TIFLASH_PROXY_STATUS_PORT = 20292 +export const DEF_TIFLASH_METRICS_PORT = 8234 export class TiFlashComp extends BaseComp { tcp_port?: number http_port?: number @@ -120,6 +162,10 @@ export class TiFlashComp extends BaseComp { super(machineID, 'TiFlash', for_scale_out) } + public symbolPort() { + return this.tcp_port || DEF_TIFLASH_TCP_PORT + } + public ports() { return `${this.tcp_port || DEF_TIFLASH_TCP_PORT}/${ this.http_port || DEF_TIFLASH_HTTP_PORT @@ -145,8 +191,8 @@ export class TiFlashComp extends BaseComp { /////////////////////// -const DEF_PD_CLIENT_PORT = 2379 -const DEF_PD_PEER_PORT = 2380 +export const DEF_PD_CLIENT_PORT = 2379 +export const DEF_PD_PEER_PORT = 2380 export class PDComp extends BaseComp { client_port?: number peer_port?: number @@ -155,6 +201,10 @@ export class PDComp extends BaseComp { super(machineID, 'PD', for_scale_out) } + public symbolPort() { + return this.client_port || DEF_PD_CLIENT_PORT + } + public ports() { return `${this.client_port || DEF_PD_CLIENT_PORT}/${ this.peer_port || DEF_PD_PEER_PORT @@ -170,7 +220,7 @@ export class PDComp extends BaseComp { /////////////////////// -const DEF_PROM_PORT = 9090 +export const DEF_PROM_PORT = 9090 export class PromComp extends BaseComp { port?: number @@ -178,6 +228,10 @@ export class PromComp extends BaseComp { super(machineID, 'Prometheus', for_scale_out) } + public symbolPort() { + return this.port || DEF_PROM_PORT + } + public ports() { return `${this.port || DEF_PROM_PORT}` } @@ -190,7 +244,7 @@ export class PromComp extends BaseComp { /////////////////////// -const DEF_GRAFANA_PORT = 3000 +export const DEF_GRAFANA_PORT = 3000 export class GrafanaComp extends BaseComp { port?: number @@ -198,6 +252,14 @@ export class GrafanaComp extends BaseComp { super(machineID, 'Grafana', for_scale_out) } + public paths(): string { + return `${this.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX}` + } + + public symbolPort() { + return this.port || DEF_GRAFANA_PORT + } + public ports() { return `${this.port || DEF_PROM_PORT}` } @@ -210,8 +272,8 @@ export class GrafanaComp extends BaseComp { /////////////////////// -const DEF_ALERT_WEB_PORT = 9093 -const DEF_ALERT_CLUSTER_PORT = 9094 +export const DEF_ALERT_WEB_PORT = 9093 +export const DEF_ALERT_CLUSTER_PORT = 9094 export class AlertManagerComp extends BaseComp { web_port?: number cluster_port?: number @@ -220,6 +282,10 @@ export class AlertManagerComp extends BaseComp { super(machineID, 'AlertManager', for_scale_out) } + public symbolPort() { + return this.web_port || DEF_ALERT_WEB_PORT + } + public ports() { return `${this.web_port || DEF_ALERT_WEB_PORT}/${ this.cluster_port || DEF_ALERT_CLUSTER_PORT From 615e57b1bc03dc2083ebde03105c09e620db54b3 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 09:50:36 +0800 Subject: [PATCH 075/126] refine --- web-ui/src/hooks/useComps.ts | 20 +++++++++ web-ui/src/pages/Deployment/CompsManager.tsx | 46 ++++++++++---------- web-ui/src/pages/Deployment/EditCompForm.tsx | 2 - web-ui/src/types/comps.ts | 15 +++++++ 4 files changed, 57 insertions(+), 26 deletions(-) create mode 100644 web-ui/src/hooks/useComps.ts diff --git a/web-ui/src/hooks/useComps.ts b/web-ui/src/hooks/useComps.ts new file mode 100644 index 0000000000..e5f653156a --- /dev/null +++ b/web-ui/src/hooks/useComps.ts @@ -0,0 +1,20 @@ +import { useLocalStorageState } from 'ahooks' +import { BaseComp, CompMap } from '../types/comps' +import { useMemo } from 'react' + +export function useComps() { + const [compObjs, setCompObjs] = useLocalStorageState( + 'components', + {} + ) + + const comps = useMemo(() => { + let _comps: CompMap = {} + Object.keys(compObjs).forEach((k) => { + _comps[k] = BaseComp.deSerial(compObjs[k]) + }) + return _comps + }, [compObjs]) + + return { comps, setCompObjs } +} diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/web-ui/src/pages/Deployment/CompsManager.tsx index 56bef7efcc..488947c388 100644 --- a/web-ui/src/pages/Deployment/CompsManager.tsx +++ b/web-ui/src/pages/Deployment/CompsManager.tsx @@ -12,6 +12,7 @@ import { deployCluster, scaleOutCluster } from '../../utils/api' import { IGlobalLoginOptions } from '../Machines/GlobalLoginOptionsForm' import { useNavigate } from 'react-router-dom' import { BaseComp, CompTypes } from '../../types/comps' +import { useComps } from '../../hooks/useComps' // TODO: fetch from API const TIDB_VERSIONS = [ @@ -42,9 +43,7 @@ export default function CompsManager({ const [machines] = useLocalStorageState<{ [key: string]: IMachine }>('machines', {}) - const [components, setComponents] = useLocalStorageState<{ - [key: string]: BaseComp - }>('components', {}) + const { comps, setCompObjs } = useComps() const [curComp, setCurComp] = useState(undefined) const [previewYaml, setPreviewYaml] = useState(false) @@ -71,47 +70,46 @@ export default function CompsManager({ const handleAddComponent = useCallback( (machine: IMachine, componentType: CompTypes, forScaleOut: boolean) => { let comp = BaseComp.create(componentType, machine.id, forScaleOut) - const existedSameComps = Object.values(components).filter( + const existedSameComps = Object.values(comps).filter( (comp) => comp.type === componentType && comp.machineID === machine.id ) if (existedSameComps.length > 0) { const lastComp = existedSameComps[existedSameComps.length - 1] - comp.deploy_dir_prefix = lastComp.deploy_dir_prefix - comp.data_dir_prefix = lastComp.data_dir_prefix + comp.copyPaths(lastComp) comp.increasePorts(lastComp) } - setComponents({ - ...components, + setCompObjs({ + ...comps, [comp.id]: comp, }) }, - [components, setComponents] + [comps, setCompObjs] ) const handleUpdateComponent = useCallback( (comp: BaseComp) => { - setComponents({ - ...components, + setCompObjs({ + ...comps, [comp.id]: comp, }) setCurComp(undefined) }, - [components, setComponents] + [comps, setCompObjs] ) const handleDeleteComponent = useCallback( (comp: BaseComp) => { - const newComps = { ...components } + const newComps = { ...comps } delete newComps[comp.id] - setComponents(newComps) + setCompObjs(newComps) }, - [components, setComponents] + [comps, setCompObjs] ) const handleDeleteComponents = useCallback( (machine: IMachine, forScaleOut: boolean) => { - const newComps = { ...components } - const belongedComps = Object.values(components).filter( + const newComps = { ...comps } + const belongedComps = Object.values(comps).filter( (c) => c.machineID === machine.id ) for (const c of belongedComps) { @@ -119,14 +117,14 @@ export default function CompsManager({ delete newComps[c.id] } } - setComponents(newComps) + setCompObjs(newComps) }, - [components, setComponents] + [comps, setCompObjs] ) function handleDeploy(values: any) { const topoYaml = yaml.stringify( - genTopo({ machines, components, forScaleOut }) + genTopo({ machines, components: comps, forScaleOut }) ) deployCluster({ ...values, @@ -139,7 +137,7 @@ export default function CompsManager({ function handleScaleOut() { // save in local // cluster name, scale out nodes - const scaleOutComps = Object.values(components).filter( + const scaleOutComps = Object.values(comps).filter( (comp) => comp.for_scale_out ) if (scaleOutComps.length === 0) { @@ -163,7 +161,7 @@ export default function CompsManager({ // scale out const topoYaml = yaml.stringify( - genTopo({ machines, components, forScaleOut }) + genTopo({ machines, components: comps, forScaleOut }) ) scaleOutCluster(clusterName!, { topo_yaml: topoYaml, @@ -225,7 +223,7 @@ export default function CompsManager({ setCurComp(rec)} onDeleteComponent={handleDeleteComponent} @@ -254,7 +252,7 @@ export default function CompsManager({ > diff --git a/web-ui/src/pages/Deployment/EditCompForm.tsx b/web-ui/src/pages/Deployment/EditCompForm.tsx index f54f577593..beb1ab8bda 100644 --- a/web-ui/src/pages/Deployment/EditCompForm.tsx +++ b/web-ui/src/pages/Deployment/EditCompForm.tsx @@ -33,7 +33,6 @@ export default function EditCompForm({ onUpdateComp, }: IEditCompFormProps) { function handleFinish(values: any) { - console.log('before:', values) for (const key of Object.keys(values)) { let v = values[key] if (v === undefined) { @@ -57,7 +56,6 @@ export default function EditCompForm({ values[key] = undefined } } - console.log('after:', values) onUpdateComp({ ...comp, ...values, diff --git a/web-ui/src/types/comps.ts b/web-ui/src/types/comps.ts index 8274445213..5de7e93219 100644 --- a/web-ui/src/types/comps.ts +++ b/web-ui/src/types/comps.ts @@ -22,6 +22,10 @@ export const COMP_TYPES_ARR = [ 'AlertManager', ] +export type CompMap = { + [key: string]: BaseComp +} + /////////////////////// export const DEF_DEPLOY_DIR_PREFIX = 'tidb-deploy' @@ -52,6 +56,11 @@ export abstract class BaseComp { }` } + public copyPaths(comp: BaseComp): void { + this.deploy_dir_prefix = comp.deploy_dir_prefix + this.data_dir_prefix = comp.data_dir_prefix + } + public abstract symbolPort(): number public abstract ports(): string public abstract increasePorts(comp: BaseComp): void @@ -78,6 +87,12 @@ export abstract class BaseComp { return new AlertManagerComp(machineID, for_scale_out) } } + + static deSerial(obj: any): BaseComp { + let comp = this.create(obj.type, obj.machineID, obj.for_scale_out) + Object.assign(comp, obj) + return comp + } } /////////////////////// From fe2b3b6a112fe722f224294caad8ecfb72408560 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 10:56:36 +0800 Subject: [PATCH 076/126] refine --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 10 ++--- .../src/pages/Deployment/DeploymentTable.tsx | 2 +- web-ui/src/pages/Machines/index.tsx | 14 +++---- web-ui/src/types/comps.ts | 41 +++++++++++++++---- 4 files changed, 44 insertions(+), 23 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 6b403fae87..8e9607fb58 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -13,7 +13,7 @@ import { } from '../../utils/api' import { Root } from '../../components/Root' import { ICluster } from '.' -import { BaseComp } from '../../types/comps' +import { useComps } from '../../hooks/useComps' export interface IClusterInstInfo { id: string @@ -43,9 +43,7 @@ export default function ClusterDetailPage() { cluster_name: string scale_out_nodes: any[] }>('cur_scale_out_nodes', { cluster_name: '', scale_out_nodes: [] }) - const [components, setComponents] = useLocalStorageState<{ - [key: string]: BaseComp - }>('components', {}) + const { comps, setCompObjs } = useComps() const [loadingTopo, setLoadingTopo] = useState(false) @@ -121,14 +119,14 @@ export default function ClusterDetailPage() { ) { return } - let newComps = { ...components } + let newComps = { ...comps } for (const n of curScaleOutNodes.scale_out_nodes) { const exist = clusters.find((el) => el.id === n.node) if (exist && newComps[n.id]) { newComps[n.id].for_scale_out = false } } - setComponents(newComps) + setCompObjs(newComps) } function destroyCluster() { diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index 7dcd6f7a2c..7e86860ae9 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -98,7 +98,7 @@ export default function DeploymentTable({ rec.username || globalLoginOptions.username || DEF_UESRNAME }, DC=${rec.dc}, Rack=${rec.rack}` } - return `Port=${rec.ports()}, Path=${rec.paths()}` + return `Port=${rec.ports()}, Path=${rec.allPathsPrefix()}` }, }, { diff --git a/web-ui/src/pages/Machines/index.tsx b/web-ui/src/pages/Machines/index.tsx index 50400c92bb..be8dd4361c 100644 --- a/web-ui/src/pages/Machines/index.tsx +++ b/web-ui/src/pages/Machines/index.tsx @@ -8,7 +8,7 @@ import { Root } from '../../components/Root' import GlobalLoginOptionsForm, { IGlobalLoginOptions, } from './GlobalLoginOptionsForm' -import { BaseComp } from '../../types/comps' +import { useComps } from '../../hooks/useComps' export default function MachinesPage() { const [showForm, setShowForm] = useState(false) @@ -17,9 +17,7 @@ export default function MachinesPage() { const [machines, setMachines] = useLocalStorageState<{ [key: string]: IMachine }>('machines', {}) - const [components, setComponents] = useLocalStorageState<{ - [key: string]: BaseComp - }>('components', {}) + const { comps, setCompObjs } = useComps() const [globalLoginOptions, setGlobalLoginOptions] = useLocalStorageState< IGlobalLoginOptions @@ -95,16 +93,16 @@ export default function MachinesPage() { setMachines(newMachines) // delete related component - const newComps = { ...components } - const belongedComps = Object.values(components).filter( + const newComps = { ...comps } + const belongedComps = Object.values(comps).filter( (c) => c.machineID === m.id ) for (const c of belongedComps) { delete newComps[c.id] } - setComponents(newComps) + setCompObjs(newComps) }, - [machines, setMachines, components, setComponents] + [machines, setMachines, comps, setCompObjs] ) return ( diff --git a/web-ui/src/types/comps.ts b/web-ui/src/types/comps.ts index 5de7e93219..dddad2dc7d 100644 --- a/web-ui/src/types/comps.ts +++ b/web-ui/src/types/comps.ts @@ -50,10 +50,8 @@ export abstract class BaseComp { this.color = COMP_COLORS[compType] } - public paths(): string { - return `${this.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX},${ - this.data_dir_prefix || DEF_DATA_DIR_PREFIX - }` + public name(): string { + return this.type.toLowerCase() } public copyPaths(comp: BaseComp): void { @@ -61,6 +59,29 @@ export abstract class BaseComp { this.data_dir_prefix = comp.data_dir_prefix } + public deployPathPrefix() { + return this.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX + } + + public dataPathPrefix() { + return this.data_dir_prefix || DEF_DATA_DIR_PREFIX + } + + public allPathsPrefix() { + if (this.dataPathPrefix()) { + return `${this.deployPathPrefix()},${this.dataPathPrefix()}` + } + return this.deployPathPrefix() + } + + public deployPathFull(): string { + return `${this.deployPathPrefix()}/${this.name()}-${this.symbolPort()}` + } + + public dataPathFull(): string { + return `${this.deployPathFull()}/${this.dataPathPrefix()}` + } + public abstract symbolPort(): number public abstract ports(): string public abstract increasePorts(comp: BaseComp): void @@ -107,8 +128,8 @@ export class TiDBComp extends BaseComp { super(machineID, 'TiDB', for_scale_out) } - public paths(): string { - return `${this.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX}` + public dataPathPrefix() { + return '' } public symbolPort() { @@ -243,6 +264,10 @@ export class PromComp extends BaseComp { super(machineID, 'Prometheus', for_scale_out) } + public name(): string { + return 'monitoring' + } + public symbolPort() { return this.port || DEF_PROM_PORT } @@ -267,8 +292,8 @@ export class GrafanaComp extends BaseComp { super(machineID, 'Grafana', for_scale_out) } - public paths(): string { - return `${this.deploy_dir_prefix || DEF_DEPLOY_DIR_PREFIX}` + public dataPathPrefix() { + return '' } public symbolPort() { From bc05c608d08123b88ec822cc3abb6d698d2d034b Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 12:45:20 +0800 Subject: [PATCH 077/126] support setting deploy dir and data dir --- web-ui/src/pages/Deployment/EditCompForm.tsx | 22 ++++++++++++++--- web-ui/src/pages/Deployment/TopoPreview.tsx | 26 ++++++++++---------- web-ui/src/types/comps.ts | 3 +++ 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/web-ui/src/pages/Deployment/EditCompForm.tsx b/web-ui/src/pages/Deployment/EditCompForm.tsx index beb1ab8bda..28d1a43e71 100644 --- a/web-ui/src/pages/Deployment/EditCompForm.tsx +++ b/web-ui/src/pages/Deployment/EditCompForm.tsx @@ -70,12 +70,26 @@ export default function EditCompForm({ return ( - - + + + + +

{comp.deployPathFull()}

{['TiDB', 'Grafana'].indexOf(componentType) === -1 && ( - - + + + + +

{comp.dataPathFull()}

)} {componentType === 'TiDB' && ( diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index 5e9fcb0319..8b1499ed2a 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -3,16 +3,16 @@ import yaml from 'yaml' import { IMachine } from '../Machines/MachineForm' import { - BaseComp, DEF_DEPLOY_DIR_PREFIX, DEF_DATA_DIR_PREFIX, COMP_TYPES_ARR, + CompMap, } from '../../types/comps' interface ITopoPreviewProps { forScaleOut: boolean machines: { [key: string]: IMachine } - components: { [key: string]: BaseComp } + components: CompMap } // TODO: split into 2 methods: genDeployTopo, genScaleOutTopo @@ -46,18 +46,13 @@ export function genTopo({ for (const compType of COMP_TYPES_ARR) { const comps = componentsArr.filter( (comp) => comp.type === compType && comp.for_scale_out === forScaleOut - ) as any[] + ) if (comps.length === 0) { continue } - let topoKey = '' - if (compType === 'Prometheus') { - topoKey = 'monitoring_servers' - } else { - topoKey = `${compType.toLowerCase()}_servers` - } + let topoKey = `${comps[0].name()}_servers` topo[topoKey] = [] for (const comp of comps) { @@ -68,13 +63,18 @@ export function genTopo({ m.ssh_port = targetMachine.ssh_port } // TODO: - // username / password / privateKey / deploy_dir / data_dir + // username / password / privateKey for (const key of Object.keys(comp)) { - if (key.indexOf('port') !== -1 && comp[key] !== undefined) { - m[key] = comp[key] + if (key.indexOf('port') !== -1 && (comp as any)[key] !== undefined) { + m[key] = (comp as any)[key] + } + if (key === 'deploy_dir_prefix' && comp[key] !== undefined) { + m[key] = comp.deployPathFull() + } + if (key === 'data_dir_prefix' && comp[key] !== undefined) { + m[key] = comp.dataPathFull() } - // TODO: handle deploy dir and data dir } // location labels diff --git a/web-ui/src/types/comps.ts b/web-ui/src/types/comps.ts index dddad2dc7d..0481be98ea 100644 --- a/web-ui/src/types/comps.ts +++ b/web-ui/src/types/comps.ts @@ -79,6 +79,9 @@ export abstract class BaseComp { } public dataPathFull(): string { + if (this.dataPathPrefix().startsWith('/')) { + return `${this.dataPathPrefix()}/${this.name()}-${this.symbolPort()}` + } return `${this.deployPathFull()}/${this.dataPathPrefix()}` } From dbe568876c7c303a1e40e1c6764a78d807a18e4b Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 15:06:44 +0800 Subject: [PATCH 078/126] set alias --- web-ui/config-overrides.js | 13 +++++++++++-- web-ui/package.json | 1 + web-ui/src/App.tsx | 5 ++--- web-ui/src/hooks/index.ts | 1 + web-ui/src/index.tsx | 3 ++- web-ui/src/pages/Status/OperationStatus.tsx | 8 +------- web-ui/src/pages/Status/index.tsx | 3 ++- web-ui/src/types/index.ts | 2 ++ web-ui/src/types/misc.ts | 7 +++++++ web-ui/src/utils/index.ts | 3 +++ web-ui/src/utils/request.ts | 1 - web-ui/tsconfig.json | 1 + web-ui/tsconfig.paths.json | 8 ++++++++ web-ui/yarn.lock | 5 +++++ 14 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 web-ui/src/hooks/index.ts create mode 100644 web-ui/src/types/index.ts create mode 100644 web-ui/src/types/misc.ts create mode 100644 web-ui/src/utils/index.ts create mode 100644 web-ui/tsconfig.paths.json diff --git a/web-ui/config-overrides.js b/web-ui/config-overrides.js index 2f16e3ea15..4a72ee2d66 100644 --- a/web-ui/config-overrides.js +++ b/web-ui/config-overrides.js @@ -1,10 +1,19 @@ const { override, addLessLoader } = require('customize-cra') +const { alias, configPaths } = require('react-app-rewire-alias') + +const addAlias = () => (config) => { + alias({ + ...configPaths('tsconfig.paths.json'), + })(config) + return config +} module.exports = override( addLessLoader({ lessOptions: { javascriptEnabled: true, modifyVars: { '@primary-color': '#3351ff' }, - } - }) + }, + }), + addAlias() ) diff --git a/web-ui/package.json b/web-ui/package.json index 3c7b41345f..e202650eb3 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -47,6 +47,7 @@ "devDependencies": { "customize-cra": "^1.0.0", "less-loader": "^6.2.0", + "react-app-rewire-alias": "^0.1.6", "react-app-rewired": "^2.1.6" } } diff --git a/web-ui/src/App.tsx b/web-ui/src/App.tsx index ea9aff3687..2ac4093eeb 100644 --- a/web-ui/src/App.tsx +++ b/web-ui/src/App.tsx @@ -1,12 +1,11 @@ import React from 'react' import { HashRouter as Router, Routes, Route, Navigate } from 'react-router-dom' +import StatusPage from './pages/Status' +import HomePage from './pages/Home' import MachinesPage from './pages/Machines' import DeploymentPage from './pages/Deployment' import ClustersPage from './pages/Clusters' - -import StatusPage from './pages/Status' -import HomePage from './pages/Home' import ClusterScaleOutPage from './pages/Clusters/ClusterScaleOut' import ClusterDetailPage from './pages/Clusters/ClusterDetail' diff --git a/web-ui/src/hooks/index.ts b/web-ui/src/hooks/index.ts new file mode 100644 index 0000000000..5e36bb69b0 --- /dev/null +++ b/web-ui/src/hooks/index.ts @@ -0,0 +1 @@ +export * from './useComps' diff --git a/web-ui/src/index.tsx b/web-ui/src/index.tsx index 606a3cf44e..9cc87711a7 100644 --- a/web-ui/src/index.tsx +++ b/web-ui/src/index.tsx @@ -1,7 +1,8 @@ import React from 'react' import ReactDOM from 'react-dom' -import './index.css' + import App from './App' +import './index.css' ReactDOM.render( diff --git a/web-ui/src/pages/Status/OperationStatus.tsx b/web-ui/src/pages/Status/OperationStatus.tsx index b709b94d4f..11489a0f85 100644 --- a/web-ui/src/pages/Status/OperationStatus.tsx +++ b/web-ui/src/pages/Status/OperationStatus.tsx @@ -1,13 +1,7 @@ import React, { useRef } from 'react' import { Progress } from 'antd' -export interface IOperationStatus { - operation_type: string // 'deploy', 'scaleOut' - cluster_name: string - total_progress: number - steps: string[] - err_msg: string -} +import { IOperationStatus } from '_types' export interface IOperationStatusProps { operationStatus: IOperationStatus diff --git a/web-ui/src/pages/Status/index.tsx b/web-ui/src/pages/Status/index.tsx index 0431a26db9..52992a914a 100644 --- a/web-ui/src/pages/Status/index.tsx +++ b/web-ui/src/pages/Status/index.tsx @@ -2,8 +2,9 @@ import React, { useState, useEffect } from 'react' import { Link } from 'react-router-dom' import { Root } from '../../components/Root' -import OperationStatus, { IOperationStatus } from './OperationStatus' +import OperationStatus from './OperationStatus' import { getStatus } from '../../utils/api' +import { IOperationStatus } from '_types' export default function StatusPage() { const [operationStatus, setOperationStatus] = useState< diff --git a/web-ui/src/types/index.ts b/web-ui/src/types/index.ts new file mode 100644 index 0000000000..78c4331f76 --- /dev/null +++ b/web-ui/src/types/index.ts @@ -0,0 +1,2 @@ +export * from './comps' +export * from './misc' diff --git a/web-ui/src/types/misc.ts b/web-ui/src/types/misc.ts new file mode 100644 index 0000000000..6b5391e34a --- /dev/null +++ b/web-ui/src/types/misc.ts @@ -0,0 +1,7 @@ +export interface IOperationStatus { + operation_type: string // deploy | start | stop | scaleIn | scaleOut | destroy + cluster_name: string + total_progress: number + steps: string[] + err_msg: string +} diff --git a/web-ui/src/utils/index.ts b/web-ui/src/utils/index.ts new file mode 100644 index 0000000000..2268b2b95c --- /dev/null +++ b/web-ui/src/utils/index.ts @@ -0,0 +1,3 @@ +export * from './request' +export { default as request } from './request' +export * from './api' diff --git a/web-ui/src/utils/request.ts b/web-ui/src/utils/request.ts index 1a485acaf0..e7efebbf80 100644 --- a/web-ui/src/utils/request.ts +++ b/web-ui/src/utils/request.ts @@ -37,7 +37,6 @@ function parseResponse(response: Response) { } else { return response.json().then((resData: any) => { const errMsg = resData.msg || response.statusText - // message.error(errMsg) const error: ResError = new Error(errMsg) error.response = response throw error diff --git a/web-ui/tsconfig.json b/web-ui/tsconfig.json index f2850b7161..c8121d5e2c 100644 --- a/web-ui/tsconfig.json +++ b/web-ui/tsconfig.json @@ -1,4 +1,5 @@ { + "extends": "./tsconfig.paths.json", "compilerOptions": { "target": "es5", "lib": [ diff --git a/web-ui/tsconfig.paths.json b/web-ui/tsconfig.paths.json new file mode 100644 index 0000000000..f7d9abf66a --- /dev/null +++ b/web-ui/tsconfig.paths.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": "./src", + "paths": { + "_types": ["types"] + } + } +} diff --git a/web-ui/yarn.lock b/web-ui/yarn.lock index bebf6e4b69..1eabb645f6 100644 --- a/web-ui/yarn.lock +++ b/web-ui/yarn.lock @@ -9172,6 +9172,11 @@ react-app-polyfill@^1.0.6: regenerator-runtime "^0.13.3" whatwg-fetch "^3.0.0" +react-app-rewire-alias@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/react-app-rewire-alias/-/react-app-rewire-alias-0.1.6.tgz#27fd6b47769871d97665393e2e572caf184948ef" + integrity sha512-RWI9danv1hw2YJQ1LrAImmB4g1TpGe56RZUbfyhZGS2dwpz2s1tz9JlA2HszSdNUUqcjat+Qcw544/Wz/zE8kw== + react-app-rewired@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/react-app-rewired/-/react-app-rewired-2.1.6.tgz#33ee3076a7f34d6a7c94e649cac67e7c8c580de8" From af4b9e0c35e83578a2c6085b967b72aeb489c735 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 16:01:40 +0800 Subject: [PATCH 079/126] wip --- web-ui/src/components/Root.tsx | 6 +++--- web-ui/src/components/index.ts | 1 + web-ui/src/pages/Clusters/ClusterDetail.tsx | 4 ++-- web-ui/src/pages/Clusters/index.tsx | 4 ++-- web-ui/src/pages/Deployment/CompsManager.tsx | 2 +- web-ui/src/pages/Machines/index.tsx | 4 ++-- web-ui/src/pages/Status/index.tsx | 7 ++++--- 7 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 web-ui/src/components/index.ts diff --git a/web-ui/src/components/Root.tsx b/web-ui/src/components/Root.tsx index 94df865ce3..dd63dabde5 100644 --- a/web-ui/src/components/Root.tsx +++ b/web-ui/src/components/Root.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -export const Root: FC = ({ children }) => ( -
{children}
-) +const Root: FC = ({ children }) =>
{children}
+ +export default Root diff --git a/web-ui/src/components/index.ts b/web-ui/src/components/index.ts new file mode 100644 index 0000000000..098334a73c --- /dev/null +++ b/web-ui/src/components/index.ts @@ -0,0 +1 @@ +export { default as Root } from './Root' diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 8e9607fb58..b74e63a157 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -11,9 +11,9 @@ import { stopCluster, scaleInCluster, } from '../../utils/api' -import { Root } from '../../components/Root' +import { Root } from '../../components' import { ICluster } from '.' -import { useComps } from '../../hooks/useComps' +import { useComps } from '../../hooks' export interface IClusterInstInfo { id: string diff --git a/web-ui/src/pages/Clusters/index.tsx b/web-ui/src/pages/Clusters/index.tsx index f97fe403c6..3f2b9914fa 100644 --- a/web-ui/src/pages/Clusters/index.tsx +++ b/web-ui/src/pages/Clusters/index.tsx @@ -2,8 +2,8 @@ import React, { useEffect, useState } from 'react' import { Layout, Menu, Space } from 'antd' import { NavLink, Outlet, useNavigate, Link } from 'react-router-dom' import { useSessionStorageState } from 'ahooks' -import { getClusterList } from '../../utils/api' -import { Root } from '../../components/Root' +import { getClusterList } from '../../utils' +import { Root } from '../../components' export interface ICluster { name: string diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/web-ui/src/pages/Deployment/CompsManager.tsx index 488947c388..26106e3181 100644 --- a/web-ui/src/pages/Deployment/CompsManager.tsx +++ b/web-ui/src/pages/Deployment/CompsManager.tsx @@ -7,7 +7,7 @@ import { IMachine } from '../Machines/MachineForm' import DeploymentTable from './DeploymentTable' import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' -import { Root } from '../../components/Root' +import { Root } from '../../components' import { deployCluster, scaleOutCluster } from '../../utils/api' import { IGlobalLoginOptions } from '../Machines/GlobalLoginOptionsForm' import { useNavigate } from 'react-router-dom' diff --git a/web-ui/src/pages/Machines/index.tsx b/web-ui/src/pages/Machines/index.tsx index be8dd4361c..71150804fa 100644 --- a/web-ui/src/pages/Machines/index.tsx +++ b/web-ui/src/pages/Machines/index.tsx @@ -4,11 +4,11 @@ import { useLocalStorageState } from 'ahooks' import MachineForm, { IMachine } from './MachineForm' import MachinesTable from './MachinesTable' -import { Root } from '../../components/Root' +import { Root } from '../../components' import GlobalLoginOptionsForm, { IGlobalLoginOptions, } from './GlobalLoginOptionsForm' -import { useComps } from '../../hooks/useComps' +import { useComps } from '../../hooks' export default function MachinesPage() { const [showForm, setShowForm] = useState(false) diff --git a/web-ui/src/pages/Status/index.tsx b/web-ui/src/pages/Status/index.tsx index 52992a914a..3c3686ca99 100644 --- a/web-ui/src/pages/Status/index.tsx +++ b/web-ui/src/pages/Status/index.tsx @@ -1,11 +1,12 @@ import React, { useState, useEffect } from 'react' import { Link } from 'react-router-dom' -import { Root } from '../../components/Root' -import OperationStatus from './OperationStatus' -import { getStatus } from '../../utils/api' +import { Root } from '../../components' +import { getStatus } from '../../utils' import { IOperationStatus } from '_types' +import OperationStatus from './OperationStatus' + export default function StatusPage() { const [operationStatus, setOperationStatus] = useState< IOperationStatus | undefined From c7c2e98de83fd98909307f3450045f4836752c26 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 16:08:02 +0800 Subject: [PATCH 080/126] fix compile error --- web-ui/package.json | 2 +- web-ui/yarn.lock | 2741 +++++++++++++++++++++++-------------------- 2 files changed, 1449 insertions(+), 1294 deletions(-) diff --git a/web-ui/package.json b/web-ui/package.json index e202650eb3..e1f2a22f86 100644 --- a/web-ui/package.json +++ b/web-ui/package.json @@ -20,7 +20,7 @@ "react-dom": "^16.13.1", "react-router-dom": "^6.0.0-beta.0", "react-scripts": "3.4.2", - "typescript": "~3.7.2", + "typescript": "4.0.2", "uniqid": "^5.2.0", "yaml": "^1.10.0" }, diff --git a/web-ui/yarn.lock b/web-ui/yarn.lock index 1eabb645f6..2e73c855b6 100644 --- a/web-ui/yarn.lock +++ b/web-ui/yarn.lock @@ -17,6 +17,13 @@ dependencies: tinycolor2 "^1.4.1" +"@ant-design/colors@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-4.0.5.tgz#d7d100d7545cca8f624954604a6892fc48ba5aae" + integrity sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q== + dependencies: + tinycolor2 "^1.4.1" + "@ant-design/css-animation@^1.7.2": version "1.7.3" resolved "https://registry.yarnpkg.com/@ant-design/css-animation/-/css-animation-1.7.3.tgz#60a1c970014e86b28f940510d69e503e428f1136" @@ -40,9 +47,9 @@ rc-util "^5.0.1" "@ant-design/react-slick@~0.27.0": - version "0.27.0" - resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.27.0.tgz#c5d4bfd879885b74024ffbce42cccb5f7bff41e9" - integrity sha512-dq/p/1oKgew99cNrhT6/BA4v7c7nAhPlS6IcVGVTMsp175bYxbHBT1GfY5vxZyz97YaTnzJ8s2Wql4AOnFQ+9g== + version "0.27.10" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.27.10.tgz#84b01288ad1a9b049f1ff537d85b765d397b60c1" + integrity sha512-Lg/9RlGaYGeFjB1UkvK50xUKf7XgIVpxXVPkm+45/VoA66c3uC1KN5yRxx7AEayHcSPZDqO9TGvMXu1WbbY2vw== dependencies: "@babel/runtime" "^7.10.4" classnames "^2.2.5" @@ -50,30 +57,30 @@ lodash "^4.17.15" resize-observer-polyfill "^1.5.0" -"@babel/code-frame@7.8.3", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": +"@babel/code-frame@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== dependencies: "@babel/highlight" "^7.8.3" -"@babel/code-frame@^7.10.4": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" - integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== +"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0", "@babel/compat-data@^7.9.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" + integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== dependencies: - browserslist "^4.9.1" + browserslist "^4.12.0" invariant "^2.2.4" semver "^5.5.0" -"@babel/core@7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5": +"@babel/core@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== @@ -95,78 +102,81 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== +"@babel/core@^7.1.0", "@babel/core@^7.4.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.5.tgz#6ad96e2f71899ea3f9b651f0a911e85205d1ff6d" + integrity sha512-fsEANVOcZHzrsV6dMVWqpSeXClq3lNbYrfFGme6DE25FQWe7pyeYpXyx9guqUnpy466JLzZ8z4uwSr2iv60V5Q== dependencies: - "@babel/types" "^7.11.0" - jsesc "^2.5.1" - source-map "^0.5.0" + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.5" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.5" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.5" + "@babel/types" "^7.11.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.6.1" -"@babel/generator@^7.4.0", "@babel/generator@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.0.tgz#0f67adea4ec39dad6e63345f70eec33014d78c89" - integrity sha512-onl4Oy46oGCzymOXtKMQpI7VXtCbTSHK1kqBydZ6AmzuNcacEVqGk9tZtAS+48IA9IstZcDCgIg8hQKnb7suRw== +"@babel/generator@^7.11.5", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.5.tgz#a5582773425a468e4ba269d9a1f701fbca6a7a82" + integrity sha512-9UqHWJ4IwRTy4l0o8gq2ef8ws8UPzvtMkVKjTLAiRmza9p9V6Z+OfuNd9fB1j5Q67F+dVJtPC2sZXI8NM9br4g== dependencies: - "@babel/types" "^7.9.0" + "@babel/types" "^7.11.5" jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" - integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== - dependencies: - "@babel/types" "^7.8.3" + source-map "^0.6.1" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx-experimental@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43" - integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-module-imports" "^7.8.3" - "@babel/types" "^7.9.0" + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" - integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== +"@babel/helper-builder-react-jsx-experimental@^7.10.4", "@babel/helper-builder-react-jsx-experimental@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz#4ea43dd63857b0a35cd1f1b161dc29b43414e79f" + integrity sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/types" "^7.9.0" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/types" "^7.11.5" -"@babel/helper-call-delegate@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab" - integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ== +"@babel/helper-builder-react-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" + integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.7" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-compilation-targets@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" - integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== +"@babel/helper-compilation-targets@^7.10.4", "@babel/helper-compilation-targets@^7.8.7": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" + integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== dependencies: - "@babel/compat-data" "^7.8.6" - browserslist "^4.9.1" + "@babel/compat-data" "^7.10.4" + browserslist "^4.12.0" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.10.5": +"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5", "@babel/helper-create-class-features-plugin@^7.8.3": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== @@ -178,43 +188,30 @@ "@babel/helper-replace-supers" "^7.10.4" "@babel/helper-split-export-declaration" "^7.10.4" -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" - integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - -"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" - integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== +"@babel/helper-create-regexp-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" + integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-regex" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" regexpu-core "^4.7.0" -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b" + integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ== dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" "@babel/helper-function-name@^7.10.4": version "7.10.4" @@ -225,15 +222,6 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - "@babel/helper-get-function-arity@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" @@ -241,19 +229,12 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" "@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": version "7.11.0" @@ -262,32 +243,25 @@ dependencies: "@babel/types" "^7.11.0" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0", "@babel/helper-module-transforms@^7.9.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" "@babel/helper-optimise-call-expression@^7.10.4": version "7.10.4" @@ -296,40 +270,27 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-plugin-utils@^7.10.4": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" - integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== +"@babel/helper-regex@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== dependencies: - lodash "^4.17.13" + lodash "^4.17.19" -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== +"@babel/helper-remap-async-to-generator@^7.10.4": + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d" + integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-replace-supers@^7.10.4": version "7.10.4" @@ -341,23 +302,20 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== +"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" + integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.11.0" "@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": version "7.11.0" @@ -366,43 +324,31 @@ dependencies: "@babel/types" "^7.11.0" -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== - -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== +"@babel/helper-wrap-function@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" + integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helpers@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.0.tgz#ab2c1bc4821af766cab51d4868a5038874ea5a12" - integrity sha512-/9GvfYTCG1NWCNwDj9e+XlnSCmWW/r9T794Xi58vPF9WCcnZCAZ0kWLSn54oqP40SUvh1T2G6VwKmFO5AOlW3A== +"@babel/helpers@^7.10.4", "@babel/helpers@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/highlight@^7.10.4": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== @@ -411,32 +357,18 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.0.tgz#f821b32313f07ee570976d3f6238e8d2d66e0a8e" - integrity sha512-Iwyp00CZsypoNJcpXCbq3G4tcDgphtlMwMVrMhhZ//XBkqjXF7LW6V511yk0+pBX3ZwwGnPea+pTKNJiqA7pUg== +"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" + integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== -"@babel/parser@^7.10.4", "@babel/parser@^7.11.0": - version "7.11.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9" - integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA== - -"@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== +"@babel/plugin-proposal-async-generator-functions@^7.10.4", "@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" + integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-proposal-class-properties@7.8.3": @@ -447,6 +379,14 @@ "@babel/helper-create-class-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-proposal-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" + integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-decorators@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" @@ -456,23 +396,39 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-decorators" "^7.8.3" -"@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== +"@babel/plugin-proposal-dynamic-import@^7.10.4", "@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" + integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== +"@babel/plugin-proposal-export-namespace-from@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" + integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.10.4", "@babel/plugin-proposal-json-strings@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" + integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" + integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== @@ -480,7 +436,15 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@7.8.3", "@babel/plugin-proposal-numeric-separator@^7.8.3": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" + integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== @@ -488,23 +452,32 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" - integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== +"@babel/plugin-proposal-numeric-separator@^7.10.4", "@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" + integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.11.0", "@babel/plugin-proposal-object-rest-spread@^7.9.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" + integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.4" -"@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== +"@babel/plugin-proposal-optional-catch-binding@^7.10.4", "@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" + integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@7.9.0", "@babel/plugin-proposal-optional-chaining@^7.9.0": +"@babel/plugin-proposal-optional-chaining@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== @@ -512,13 +485,30 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" - integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== +"@babel/plugin-proposal-optional-chaining@^7.11.0", "@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" + integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.8" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" + integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" + integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-async-generators@^7.8.0": version "7.8.4" @@ -527,12 +517,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-decorators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" - integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz#6853085b2c429f9d322d02f5a635018cdeb2360c" + integrity sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" @@ -541,13 +538,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-flow@^7.8.3": +"@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" - integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-flow@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz#53351dd7ae01995e567d04ce42af1a6e0ba846a6" + integrity sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" @@ -555,12 +559,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" - integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== +"@babel/plugin-syntax-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c" + integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": version "7.8.3" @@ -569,12 +580,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": version "7.8.3" @@ -597,12 +608,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== +"@babel/plugin-syntax-top-level-await@^7.10.4", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" + integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-typescript@^7.10.4": version "7.10.4" @@ -611,87 +622,86 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== +"@babel/plugin-transform-arrow-functions@^7.10.4", "@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" + integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== +"@babel/plugin-transform-async-to-generator@^7.10.4", "@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" + integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" -"@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== +"@babel/plugin-transform-block-scoped-functions@^7.10.4", "@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" + integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== +"@babel/plugin-transform-block-scoping@^7.10.4", "@babel/plugin-transform-block-scoping@^7.8.3": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" + integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - lodash "^4.17.13" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-classes@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.0.tgz#ab89c175ecf5b4c8911194aa8657966615324ce9" - integrity sha512-xt/0CuBRBsBkqfk95ILxf0ge3gnXjEhOHrNxIiS8fdzSWgecuf9Vq2ogLUfaozJgt3LDO49ThMVWiyezGkei7A== +"@babel/plugin-transform-classes@^7.10.4", "@babel/plugin-transform-classes@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" + integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== +"@babel/plugin-transform-computed-properties@^7.10.4", "@babel/plugin-transform-computed-properties@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" + integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" - integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== +"@babel/plugin-transform-destructuring@^7.10.4", "@babel/plugin-transform-destructuring@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" + integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" - integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== +"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" + integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== +"@babel/plugin-transform-duplicate-keys@^7.10.4", "@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" + integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== +"@babel/plugin-transform-exponentiation-operator@^7.10.4", "@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" + integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-flow-strip-types@7.9.0": version "7.9.0" @@ -701,172 +711,186 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow" "^7.8.3" -"@babel/plugin-transform-for-of@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" - integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== +"@babel/plugin-transform-for-of@^7.10.4", "@babel/plugin-transform-for-of@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" + integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== +"@babel/plugin-transform-function-name@^7.10.4", "@babel/plugin-transform-function-name@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" + integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== +"@babel/plugin-transform-literals@^7.10.4", "@babel/plugin-transform-literals@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" + integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== +"@babel/plugin-transform-member-expression-literals@^7.10.4", "@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" + integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-amd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" - integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== +"@babel/plugin-transform-modules-amd@^7.10.4", "@babel/plugin-transform-modules-amd@^7.9.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" + integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" - integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== +"@babel/plugin-transform-modules-commonjs@^7.10.4", "@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" - integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== +"@babel/plugin-transform-modules-systemjs@^7.10.4", "@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" + integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" - integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== +"@babel/plugin-transform-modules-umd@^7.10.4", "@babel/plugin-transform-modules-umd@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" + integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4", "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" + integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" -"@babel/plugin-transform-new-target@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== +"@babel/plugin-transform-new-target@^7.10.4", "@babel/plugin-transform-new-target@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" + integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-object-super@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== +"@babel/plugin-transform-object-super@^7.10.4", "@babel/plugin-transform-object-super@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" + integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" -"@babel/plugin-transform-parameters@^7.8.7": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.8.tgz#0381de466c85d5404565243660c4496459525daf" - integrity sha512-hC4Ld/Ulpf1psQciWWwdnUspQoQco2bMzSrwU6TmzRlvoYQe4rQFy9vnCZDTlVeCQj0JPfL+1RX0V8hCJvkgBA== +"@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.8.7": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" + integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== dependencies: - "@babel/helper-call-delegate" "^7.8.7" - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-property-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== +"@babel/plugin-transform-property-literals@^7.10.4", "@babel/plugin-transform-property-literals@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" + integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-react-constant-elements@^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz#a75abc936a3819edec42d3386d9f1c93f28d9d9e" - integrity sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz#0f485260bf1c29012bb973e7e404749eaac12c9e" + integrity sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-display-name@7.8.3", "@babel/plugin-transform-react-display-name@^7.8.3": +"@babel/plugin-transform-react-display-name@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-jsx-development@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" - integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== +"@babel/plugin-transform-react-display-name@^7.10.4", "@babel/plugin-transform-react-display-name@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz#b5795f4e3e3140419c3611b7a2a3832b9aef328d" + integrity sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-jsx-self@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" - integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== +"@babel/plugin-transform-react-jsx-development@^7.10.4", "@babel/plugin-transform-react-jsx-development@^7.9.0": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz#e1439e6a57ee3d43e9f54ace363fb29cefe5d7b6" + integrity sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-builder-react-jsx-experimental" "^7.11.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-source@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" - integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== +"@babel/plugin-transform-react-jsx-self@^7.10.4", "@babel/plugin-transform-react-jsx-self@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369" + integrity sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.9.1": - version "7.9.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.1.tgz#d03af29396a6dc51bfa24eefd8005a9fd381152a" - integrity sha512-+xIZ6fPoix7h57CNO/ZeYADchg1tFyX9NDsnmNFFua8e1JNPln156mzS+8AQe1On2X2GLlANHJWHIXbMCqWDkQ== +"@babel/plugin-transform-react-jsx-source@^7.10.4", "@babel/plugin-transform-react-jsx-source@^7.9.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4" + integrity sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA== dependencies: - "@babel/helper-builder-react-jsx" "^7.9.0" - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" + +"@babel/plugin-transform-react-jsx@^7.10.4", "@babel/plugin-transform-react-jsx@^7.9.1": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2" + integrity sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A== + dependencies: + "@babel/helper-builder-react-jsx" "^7.10.4" + "@babel/helper-builder-react-jsx-experimental" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" + +"@babel/plugin-transform-react-pure-annotations@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501" + integrity sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== +"@babel/plugin-transform-regenerator@^7.10.4", "@babel/plugin-transform-regenerator@^7.8.7": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" + integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== +"@babel/plugin-transform-reserved-words@^7.10.4", "@babel/plugin-transform-reserved-words@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" + integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-runtime@7.9.0": version "7.9.0" @@ -878,42 +902,43 @@ resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== +"@babel/plugin-transform-shorthand-properties@^7.10.4", "@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" + integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== +"@babel/plugin-transform-spread@^7.11.0", "@babel/plugin-transform-spread@^7.8.3": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" + integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" -"@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== +"@babel/plugin-transform-sticky-regex@^7.10.4", "@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" + integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" -"@babel/plugin-transform-template-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== +"@babel/plugin-transform-template-literals@^7.10.4", "@babel/plugin-transform-template-literals@^7.8.3": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" + integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== +"@babel/plugin-transform-typeof-symbol@^7.10.4", "@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" + integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-typescript@^7.9.0": version "7.11.0" @@ -924,15 +949,22 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-typescript" "^7.10.4" -"@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== +"@babel/plugin-transform-unicode-escapes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" + integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/preset-env@7.9.0", "@babel/preset-env@^7.4.5": +"@babel/plugin-transform-unicode-regex@^7.10.4", "@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" + integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/preset-env@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== @@ -998,10 +1030,84 @@ levenary "^1.1.1" semver "^5.5.0" +"@babel/preset-env@^7.4.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272" + integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA== + dependencies: + "@babel/compat-data" "^7.11.0" + "@babel/helper-compilation-targets" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-async-generator-functions" "^7.10.4" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-dynamic-import" "^7.10.4" + "@babel/plugin-proposal-export-namespace-from" "^7.10.4" + "@babel/plugin-proposal-json-strings" "^7.10.4" + "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread" "^7.11.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" + "@babel/plugin-proposal-optional-chaining" "^7.11.0" + "@babel/plugin-proposal-private-methods" "^7.10.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.10.4" + "@babel/plugin-transform-arrow-functions" "^7.10.4" + "@babel/plugin-transform-async-to-generator" "^7.10.4" + "@babel/plugin-transform-block-scoped-functions" "^7.10.4" + "@babel/plugin-transform-block-scoping" "^7.10.4" + "@babel/plugin-transform-classes" "^7.10.4" + "@babel/plugin-transform-computed-properties" "^7.10.4" + "@babel/plugin-transform-destructuring" "^7.10.4" + "@babel/plugin-transform-dotall-regex" "^7.10.4" + "@babel/plugin-transform-duplicate-keys" "^7.10.4" + "@babel/plugin-transform-exponentiation-operator" "^7.10.4" + "@babel/plugin-transform-for-of" "^7.10.4" + "@babel/plugin-transform-function-name" "^7.10.4" + "@babel/plugin-transform-literals" "^7.10.4" + "@babel/plugin-transform-member-expression-literals" "^7.10.4" + "@babel/plugin-transform-modules-amd" "^7.10.4" + "@babel/plugin-transform-modules-commonjs" "^7.10.4" + "@babel/plugin-transform-modules-systemjs" "^7.10.4" + "@babel/plugin-transform-modules-umd" "^7.10.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" + "@babel/plugin-transform-new-target" "^7.10.4" + "@babel/plugin-transform-object-super" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-property-literals" "^7.10.4" + "@babel/plugin-transform-regenerator" "^7.10.4" + "@babel/plugin-transform-reserved-words" "^7.10.4" + "@babel/plugin-transform-shorthand-properties" "^7.10.4" + "@babel/plugin-transform-spread" "^7.11.0" + "@babel/plugin-transform-sticky-regex" "^7.10.4" + "@babel/plugin-transform-template-literals" "^7.10.4" + "@babel/plugin-transform-typeof-symbol" "^7.10.4" + "@babel/plugin-transform-unicode-escapes" "^7.10.4" + "@babel/plugin-transform-unicode-regex" "^7.10.4" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.11.5" + browserslist "^4.12.0" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + "@babel/preset-modules@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" - integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -1009,7 +1115,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@7.9.1", "@babel/preset-react@^7.0.0": +"@babel/preset-react@7.9.1": version "7.9.1" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a" integrity sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ== @@ -1021,6 +1127,19 @@ "@babel/plugin-transform-react-jsx-self" "^7.9.0" "@babel/plugin-transform-react-jsx-source" "^7.9.0" +"@babel/preset-react@^7.0.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf" + integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.10.4" + "@babel/plugin-transform-react-jsx" "^7.10.4" + "@babel/plugin-transform-react-jsx-development" "^7.10.4" + "@babel/plugin-transform-react-jsx-self" "^7.10.4" + "@babel/plugin-transform-react-jsx-source" "^7.10.4" + "@babel/plugin-transform-react-pure-annotations" "^7.10.4" + "@babel/preset-typescript@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" @@ -1029,7 +1148,7 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-typescript" "^7.9.0" -"@babel/runtime-corejs3@^7.10.2": +"@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.8.3": version "7.11.2" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz#02c3029743150188edeb66541195f54600278419" integrity sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A== @@ -1037,29 +1156,21 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime-corejs3@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.0.tgz#0d4119c44ad05bfa0ca16f2f4f91cde430056c08" - integrity sha512-Fe3z3yVZNCUTaOFBAofwkEtFiYi7a7Gg2F5S1QX+mqP403i2iKJtyHJYEp/PV2ijUheT0PiKWbmXcqtwLhmBzg== - dependencies: - core-js-pure "^3.0.0" - regenerator-runtime "^0.13.4" - -"@babel/runtime@7.9.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" integrity sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA== dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.5.1", "@babel/runtime@^7.7.6": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.1", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4": version "7.11.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4": +"@babel/template@^7.10.4", "@babel/template@^7.4.0", "@babel/template@^7.8.6": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== @@ -1068,58 +1179,25 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" - integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.10.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" + integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" + "@babel/generator" "^7.11.5" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" + "@babel/parser" "^7.11.5" + "@babel/types" "^7.11.5" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7", "@babel/types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" - integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.10.4", "@babel/types@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.9.0": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" + integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== dependencies: "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.19" @@ -1333,6 +1411,17 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@jest/types@^26.3.0": + version "26.3.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.3.0.tgz#97627bf4bdb72c55346eef98e3b3f7ddc4941f71" + integrity sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1455,15 +1544,15 @@ loader-utils "^1.2.3" "@testing-library/dom@*": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.22.1.tgz#b66861fb7751287bda63a55f5c72ca808c63043c" - integrity sha512-bEszhvj9LcspaRz56mqGV7uc+vJTAYKCKPJcGb5X6U1qBysgTAgCexQXvKZ3BBjWu5S/TANP2NniOVsMWqKXcw== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.23.0.tgz#c54c0fa53705ad867bcefb52fc0c96487fbc10f6" + integrity sha512-H5m090auYH+obdZmsaYLrSWC5OauWD2CvNbz88KBxQJoXgkJzbU0DpAG8BS7Evj5WqCC3nAAKrLS6vw0ljUYLg== dependencies: "@babel/runtime" "^7.10.3" "@types/aria-query" "^4.2.0" aria-query "^4.2.2" - dom-accessibility-api "^0.5.0" - pretty-format "^25.5.0" + dom-accessibility-api "^0.5.1" + pretty-format "^26.4.2" "@testing-library/dom@^6.15.0": version "6.16.0" @@ -1513,9 +1602,9 @@ integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== "@types/babel__core@^7.1.0": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" - integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg== + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" + integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1539,9 +1628,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a" - integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw== + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18" + integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ== dependencies: "@babel/types" "^7.3.0" @@ -1555,24 +1644,18 @@ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - "@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== dependencies: - "@types/events" "*" "@types/minimatch" "*" "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== "@types/istanbul-lib-report@*": version "3.0.0" @@ -1582,13 +1665,20 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/istanbul-reports@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" + integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + dependencies: + "@types/istanbul-lib-report" "*" + "@types/jest@^24.0.0": version "24.9.1" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534" @@ -1601,15 +1691,10 @@ resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== -"@types/json-schema@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" - integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== - -"@types/json-schema@^7.0.4": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== "@types/minimatch@*": version "3.0.3" @@ -1617,9 +1702,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "13.9.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349" - integrity sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg== + version "14.6.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.2.tgz#264b44c5a28dfa80198fc2f7b6d3c8a054b9491f" + integrity sha512-onlIwbaeqvZyniGPfdw/TEhKIh79pz66L1q06WUQqJLnAb6wbjvOtepLYTGHTqzdXgBYIE3ZdmqHDGsRsbBz7A== "@types/node@^12.0.0": version "12.12.54" @@ -1637,9 +1722,9 @@ integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== "@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== "@types/react-dom@*", "@types/react-dom@^16.9.0": version "16.9.8" @@ -1649,9 +1734,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^16.9.0": - version "16.9.46" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.46.tgz#f0326cd7adceda74148baa9bff6e918632f5069e" - integrity sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg== + version "16.9.49" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.49.tgz#09db021cf8089aba0cdb12a49f8021a69cce4872" + integrity sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -1695,9 +1780,9 @@ integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== "@types/yargs@^13.0.0": - version "13.0.8" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99" - integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA== + version "13.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.10.tgz#e77bf3fc73c781d48c2eb541f87c453e321e5f4b" + integrity sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ== dependencies: "@types/yargs-parser" "*" @@ -1709,46 +1794,46 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^2.10.0": - version "2.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz#a86cf618c965a462cddf3601f594544b134d6d68" - integrity sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA== + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== dependencies: - "@typescript-eslint/experimental-utils" "2.24.0" - eslint-utils "^1.4.3" + "@typescript-eslint/experimental-utils" "2.34.0" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.24.0": - version "2.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz#a5cb2ed89fedf8b59638dc83484eb0c8c35e1143" - integrity sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw== +"@typescript-eslint/experimental-utils@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.24.0" + "@typescript-eslint/typescript-estree" "2.34.0" eslint-scope "^5.0.0" + eslint-utils "^2.0.0" "@typescript-eslint/parser@^2.10.0": - version "2.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.24.0.tgz#2cf0eae6e6dd44d162486ad949c126b887f11eb8" - integrity sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw== + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.24.0" - "@typescript-eslint/typescript-estree" "2.24.0" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.24.0": - version "2.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz#38bbc8bb479790d2f324797ffbcdb346d897c62a" - integrity sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA== +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" glob "^7.1.6" is-glob "^4.0.1" lodash "^4.17.15" - semver "^6.3.0" + semver "^7.3.2" tsutils "^3.17.1" "@webassemblyjs/ast@1.8.5": @@ -1908,9 +1993,9 @@ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.4.tgz#6dfa57b417ca06d21b2478f0e638302f99c2405c" + integrity sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" @@ -1949,9 +2034,9 @@ acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== acorn@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + version "7.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" + integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== address@1.1.2, address@^1.0.1: version "1.1.2" @@ -1970,9 +2055,9 @@ adjust-sourcemap-loader@2.0.0: regex-parser "2.2.10" aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" @@ -1997,25 +2082,15 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== - -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: - version "6.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" - integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.12.2: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" + integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -2090,10 +2165,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: color-convert "^2.0.1" antd@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/antd/-/antd-4.5.3.tgz#1ea0cf501e1e71626a4a57ca5e6d9544470afc09" - integrity sha512-/drsnAfUjrdDrIni7zmbRk4HwtuWszj+D6WBCWKh6JO3XLvCjNMJN0ayYMykS80FPw4RaOx0tl2yKhiQODvBgA== + version "4.6.2" + resolved "https://registry.yarnpkg.com/antd/-/antd-4.6.2.tgz#c3a8fda7f7c60aa3d3e8ed356bef61902ed3d1ad" + integrity sha512-6hmSRiSV3Lzz/1fKGOLHld7gf0d+MW7fg7MNGCAAceGmxtG1WEaaOtV8dZeL2WXq0SGH4wY4GytN6chRrtatfw== dependencies: + "@ant-design/colors" "^4.0.5" "@ant-design/css-animation" "^1.7.2" "@ant-design/icons" "^4.2.1" "@ant-design/react-slick" "~0.27.0" @@ -2101,7 +2177,7 @@ antd@^4.5.3: array-tree-filter "^2.1.0" classnames "^2.2.6" copy-to-clipboard "^3.2.0" - lodash "^4.17.13" + lodash "^4.17.20" moment "^2.25.3" omit.js "^2.0.2" raf "^3.4.1" @@ -2112,30 +2188,31 @@ antd@^4.5.3: rc-dialog "~8.1.0" rc-drawer "~4.1.0" rc-dropdown "~3.1.2" - rc-field-form "~1.8.0" + rc-field-form "~1.10.0" + rc-image "~3.0.2" rc-input-number "~6.0.0" rc-mentions "~1.4.0" rc-menu "~8.5.2" rc-motion "^1.0.0" rc-notification "~4.4.0" - rc-pagination "~2.4.5" - rc-picker "~1.15.1" + rc-pagination "~3.0.3" + rc-picker "~2.0.6" rc-progress "~3.0.0" rc-rate "~2.8.2" rc-resize-observer "^0.2.3" - rc-select "~11.0.12" + rc-select "~11.1.0" rc-slider "~9.3.0" rc-steps "~4.1.0" rc-switch "~3.2.0" - rc-table "~7.8.0" - rc-tabs "~11.5.0" + rc-table "~7.9.2" + rc-tabs "~11.6.0" rc-textarea "~0.3.0" rc-tooltip "~4.2.0" - rc-tree "~3.8.5" + rc-tree "~3.9.0" rc-tree-select "~4.1.1" rc-trigger "~4.4.0" - rc-upload "~3.2.0" - rc-util "^5.0.1" + rc-upload "~3.2.1" + rc-util "^5.1.0" scroll-into-view-if-needed "^2.2.25" warning "^4.0.3" @@ -2267,14 +2344,15 @@ asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" asn1@~0.2.3: version "0.2.4" @@ -2351,17 +2429,17 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: - version "9.7.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" - integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== dependencies: - browserslist "^4.8.3" - caniuse-lite "^1.0.30001020" - chalk "^2.4.2" + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.26" - postcss-value-parser "^4.0.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" aws-sign2@~0.7.0: version "0.7.0" @@ -2369,14 +2447,14 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" - integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + version "1.10.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" + integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== axobject-query@^2.0.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799" - integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== babel-code-frame@^6.22.0: version "6.26.0" @@ -2430,10 +2508,10 @@ babel-loader@8.1.0: pify "^4.0.1" schema-utils "^2.6.5" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" @@ -2574,9 +2652,9 @@ binary-extensions@^1.0.0: integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== bindings@^1.5.0: version "1.5.0" @@ -2590,10 +2668,15 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== body-parser@1.19.0: version "1.19.0" @@ -2707,7 +2790,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0: +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= @@ -2716,17 +2799,19 @@ browserify-rsa@^4.0.0: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" browserify-zlib@^0.2.0: version "0.2.0" @@ -2735,7 +2820,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@4.10.0, browserslist@^4.0.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9.1: +browserslist@4.10.0: version "4.10.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== @@ -2745,6 +2830,16 @@ browserslist@4.10.0, browserslist@^4.0.0, browserslist@^4.6.2, browserslist@^4.6 node-releases "^1.1.52" pkg-up "^3.1.0" +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.5, browserslist@^4.9.1: + version "4.14.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000" + integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ== + dependencies: + caniuse-lite "^1.0.30001111" + electron-to-chromium "^1.3.523" + escalade "^3.0.2" + node-releases "^1.1.60" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -2792,9 +2887,9 @@ bytes@3.1.0: integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== cacache@^12.0.2: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -2908,10 +3003,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001035: - version "1.0.30001035" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" - integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001111: + version "1.0.30001122" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001122.tgz#2c8ff631330d986a07a7ba7125cce77a1373b475" + integrity sha512-pxjw28CThdrqfz06nJkpAc5SXM404TXB/h5f4UJX+rrXJKE/1bu/KAILc2AY+O6cQIFtRjV9qOR2vaEp9LDGUA== capture-exit@^2.0.0: version "2.0.0" @@ -2958,12 +3053,20 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^2.0.2, chokidar@^2.1.8: +chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -2982,10 +3085,10 @@ chokidar@^2.0.2, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== +chokidar@^3.3.0, chokidar@^3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -2993,7 +3096,7 @@ chokidar@^3.3.0: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.3.0" + readdirp "~3.4.0" optionalDependencies: fsevents "~2.1.2" @@ -3057,9 +3160,14 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== cliui@^5.0.0: version "5.0.0" @@ -3157,6 +3265,11 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -3320,17 +3433,17 @@ copy-to-clipboard@^3.2.0: toggle-selection "^1.0.6" core-js-compat@^3.6.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" - integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== dependencies: - browserslist "^4.8.3" + browserslist "^4.8.5" semver "7.0.0" core-js-pure@^3.0.0: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a" - integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" + integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== core-js@^2.4.0: version "2.6.11" @@ -3338,9 +3451,9 @@ core-js@^2.4.0: integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-js@^3.5.0: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -3369,14 +3482,14 @@ cosmiconfig@^6.0.0: yaml "^1.7.2" create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" - elliptic "^6.0.0" + elliptic "^6.5.3" -create-hash@^1.1.0, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -3387,7 +3500,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -3522,15 +3635,23 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" +css-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + css-what@2.1: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== css-what@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" - integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" + integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== css.escape@^1.5.1: version "1.5.1" @@ -3631,11 +3752,11 @@ cssnano@^4.1.10: postcss "^7.0.0" csso@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" - integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== dependencies: - css-tree "1.0.0-alpha.37" + css-tree "1.0.0-alpha.39" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: version "0.3.8" @@ -3650,9 +3771,9 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: cssom "0.3.x" csstype@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" - integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== + version "3.0.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8" + integrity sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag== customize-cra@^1.0.0: version "1.0.0" @@ -3696,14 +3817,14 @@ data-urls@^1.0.0, data-urls@^1.1.0: whatwg-url "^7.0.0" date-fns@^2.15.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.15.0.tgz#424de6b3778e4e69d3ff27046ec136af58ae5d5f" - integrity sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ== + version "2.16.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b" + integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ== dayjs@^1.8.30: - version "1.8.33" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.33.tgz#18bc4a2b6c1c6f4d67b4c4f2536c0b97e5b766f7" - integrity sha512-881TDLZCdpJFKbraWRHcUG8zfMLLX400ENf9rFZDuWc5zYMss6xifo2PhlDX0ftOmR2NRmaIY47bAa4gKQfXqw== + version "1.8.34" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.34.tgz#d3ad33cc43d6b0f24cb8686b90aad2c653708069" + integrity sha512-Olb+E6EoMvdPmAMq2QoucuyZycKHjTlBXmRx8Ada+wGtq4SIXuDCdtoaX4KkK0yjf1fJLnwXQURr8gQKWKaybw== debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" @@ -3712,7 +3833,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: +debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3913,10 +4034,10 @@ dom-accessibility-api@^0.3.0: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz#511e5993dd673b97c87ea47dba0e3892f7e0c983" integrity sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA== -dom-accessibility-api@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.0.tgz#fddffd04e178796e241436c3f21be2f89c91afac" - integrity sha512-eCVf9n4Ni5UQAFc2+fqfMPHdtiX7DA0rLakXgNBZfXNJzEbNo3MQIYd+zdYpFBqAaGYVrkd8leNSLGPrG4ODmA== +dom-accessibility-api@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.2.tgz#ef3cdb5d3f0d599d8f9c8b18df2fb63c9793739d" + integrity sha512-k7hRNKAiPJXD2aBqfahSo4/01cTsKWXf+LqJgglnkN2Nz8TsxXKQBXHhKe0Ye9fEfHEZY49uSA5Sr3AqP/sWKA== dom-align@^1.7.0: version "1.12.0" @@ -4009,9 +4130,9 @@ dotenv@8.2.0: integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== duplexer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" @@ -4036,15 +4157,15 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.378: - version "1.3.379" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.379.tgz#81dc5e82a3e72bbb830d93e15bc35eda2bbc910e" - integrity sha512-NK9DBBYEBb5f9D7zXI0hiE941gq3wkBeQmXs1ingigA/jnTg5mhwY2Z5egwA+ZI8OLGKCx0h1Cl8/xeuIBuLlg== +electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.523: + version "1.3.556" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.556.tgz#d2a8fed6b93051c5c27d182c43c7bc4d88b77afb" + integrity sha512-g5cGpg6rOCXxyfaLCQIWz9Fx+raFfbZ6sc4QLfvvaiCERBzY6YD6rh5d12QN++bEF1Tm9osYnxP37lbN/92j4A== -elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== +elliptic@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -4087,9 +4208,9 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: once "^1.4.0" enhanced-resolve@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" - integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== dependencies: graceful-fs "^4.1.2" memory-fs "^0.5.0" @@ -4101,9 +4222,9 @@ entities@^1.1.1: integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: version "0.1.7" @@ -4119,22 +4240,40 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" + is-callable "^1.2.0" + is-regex "^1.1.0" object-inspect "^1.7.0" object-keys "^1.1.1" object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.0: + version "1.18.0-next.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc" + integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -4171,6 +4310,11 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" +escalade@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" + integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -4187,9 +4331,9 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.11.0, escodegen@^1.9.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" - integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" estraverse "^4.2.0" @@ -4206,9 +4350,9 @@ eslint-config-react-app@^5.2.1: confusing-browser-globals "^1.0.9" eslint-import-resolver-node@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" - integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== dependencies: debug "^2.6.9" resolve "^1.13.1" @@ -4225,9 +4369,9 @@ eslint-loader@3.0.3: schema-utils "^2.6.1" eslint-module-utils@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" - integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== dependencies: debug "^2.6.9" pkg-dir "^2.0.0" @@ -4304,9 +4448,9 @@ eslint-scope@^4.0.3: estraverse "^4.1.1" eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -4318,10 +4462,17 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint@^6.6.0: version "6.8.0" @@ -4381,24 +4532,29 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" - integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -4410,14 +4566,14 @@ etag@~1.8.1: integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" - integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== eventsource@^1.0.7: version "1.0.7" @@ -4579,9 +4735,9 @@ extsprintf@^1.2.0: integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^2.0.2: version "2.2.7" @@ -4627,9 +4783,9 @@ fb-watchman@^2.0.0: bser "2.1.1" figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== figures@^3.0.0: version "3.2.0" @@ -4760,9 +4916,9 @@ flat-cache@^2.0.1: write "1.0.3" flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatten@^1.0.2: version "1.0.3" @@ -4778,11 +4934,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" - integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== - dependencies: - debug "^3.0.0" + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== for-in@^0.1.3: version "0.1.8" @@ -4903,19 +5057,24 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@2.1.2, fsevents@~2.1.2: +fsevents@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== fsevents@^1.2.7: - version "1.2.12" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" - integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" nan "^2.12.1" +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -4969,9 +5128,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.0.0, glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" @@ -5045,9 +5204,9 @@ globby@^6.1.0: pinkie-promise "^2.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== growly@^1.3.0: version "1.3.0" @@ -5063,9 +5222,9 @@ gzip-size@5.1.1: pify "^4.0.1" handle-thing@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" - integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== har-schema@^2.0.0: version "2.0.0" @@ -5073,11 +5232,11 @@ har-schema@^2.0.0: integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" harmony-reflect@^1.4.6: @@ -5146,12 +5305,13 @@ has@^1.0.0, has@^1.0.3: function-bind "^1.1.1" hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -5237,14 +5397,14 @@ html-entities@^1.3.1: integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== html-escaper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" - integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-minifier-terser@^5.0.1: - version "5.0.4" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz#e8cc02748acb983bd7912ea9660bd31c0702ec32" - integrity sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g== + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== dependencies: camel-case "^4.1.1" clean-css "^4.2.3" @@ -5315,10 +5475,10 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -"http-parser-js@>=0.4.0 <0.4.11": - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" - integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= +http-parser-js@>=0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" + integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== http-proxy-middleware@0.19.1: version "0.19.1" @@ -5331,9 +5491,9 @@ http-proxy-middleware@0.19.1: micromatch "^3.1.10" http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" @@ -5470,7 +5630,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5510,20 +5670,20 @@ inquirer@7.0.4: through "^2.3.6" inquirer@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== dependencies: ansi-escapes "^4.2.1" - chalk "^3.0.0" + chalk "^4.1.0" cli-cursor "^3.1.0" - cli-width "^2.0.0" + cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.15" + lodash "^4.17.19" mute-stream "0.0.8" run-async "^2.4.0" - rxjs "^6.5.3" + rxjs "^6.6.0" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" @@ -5635,10 +5795,10 @@ is-buffer@^1.0.2, is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.1.4, is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== is-ci@^2.0.0: version "2.0.0" @@ -5702,9 +5862,9 @@ is-directory@^0.3.1: integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-docker@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" - integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -5752,6 +5912,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -5805,17 +5970,12 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-regex@^1.0.4, is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.0.4, is-regex@^1.1.0, is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== dependencies: - has "^1.0.3" + has-symbols "^1.0.1" is-regexp@^1.0.0: version "1.0.0" @@ -5872,9 +6032,11 @@ is-wsl@^1.1.0: integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= is-wsl@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" @@ -6148,9 +6310,9 @@ jest-mock@^24.0.0, jest-mock@^24.9.0: "@jest/types" "^24.9.0" jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: version "24.9.0" @@ -6320,9 +6482,9 @@ jest-worker@^24.6.0, jest-worker@^24.9.0: supports-color "^6.1.0" jest-worker@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" - integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" @@ -6351,9 +6513,9 @@ js-tokens@^3.0.2: integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -6442,6 +6604,11 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz#371873c5ffa44304a6ba12419bcfa95f404ae081" + integrity sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -6489,9 +6656,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" - integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: minimist "^1.2.5" @@ -6518,11 +6685,11 @@ jsprim@^1.2.2: verror "1.10.0" jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" - integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" + integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== dependencies: - array-includes "^3.0.3" + array-includes "^3.1.1" object.assign "^4.1.0" killable@^1.0.1: @@ -6660,12 +6827,12 @@ load-json-file@^4.0.0: strip-bom "^3.0.0" loader-fs-cache@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086" - integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" + integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA== dependencies: find-cache-dir "^0.1.1" - mkdirp "0.5.1" + mkdirp "^0.5.1" loader-runner@^2.4.0: version "2.4.0" @@ -6777,20 +6944,15 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -lodash@^4.17.19: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== loglevel@^1.6.8: - version "1.6.8" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" - integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== + version "1.7.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" + integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -6822,9 +6984,9 @@ make-dir@^2.0.0, make-dir@^2.1.0: semver "^5.6.0" make-dir@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" - integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" @@ -6866,6 +7028,11 @@ mdn-data@2.0.4: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -6907,9 +7074,9 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.2.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: version "1.1.2" @@ -6948,17 +7115,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== dependencies: - mime-db "1.43.0" + mime-db "1.44.0" mime@1.6.0, mime@^1.4.1: version "1.6.0" @@ -6966,9 +7133,9 @@ mime@1.6.0, mime@^1.4.1: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== mimic-fn@^2.1.0: version "2.1.0" @@ -7015,11 +7182,6 @@ minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -7040,16 +7202,16 @@ minipass-flush@^1.0.5: minipass "^3.0.0" minipass-pipeline@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" - integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" - integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== dependencies: yallist "^4.0.0" @@ -7085,21 +7247,7 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" - integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== - dependencies: - minimist "^1.2.5" - -mkdirp@^0.5.5: +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -7157,9 +7305,9 @@ mute-stream@0.0.8: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== nanomatch@^1.2.9: version "1.2.13" @@ -7194,9 +7342,9 @@ negotiator@0.6.2: integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== next-tick@~1.0.0: version "1.0.0" @@ -7271,12 +7419,10 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-releases@^1.1.52: - version "1.1.52" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" - integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== - dependencies: - semver "^6.3.0" +node-releases@^1.1.52, node-releases@^1.1.60: + version "1.1.60" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" + integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== normalize-package-data@^2.3.2: version "2.5.0" @@ -7368,15 +7514,18 @@ object-hash@^2.0.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.7.0, object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== object-is@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -7406,13 +7555,12 @@ object.assign@^4.1.0: object-keys "^1.0.11" object.entries@^1.1.0, object.entries@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" - integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.17.5" has "^1.0.3" object.fromentries@^2.0.2: @@ -7480,16 +7628,16 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: wrappy "1" onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" open@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48" - integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA== + version "7.2.1" + resolved "https://registry.yarnpkg.com/open/-/open-7.2.1.tgz#07b0ade11a43f2a8ce718480bdf3d7563a095195" + integrity sha512-xbYCJib4spUdmcs0g/2mK1nKo/jO2T7INClWd/beL7PFkXRWgr8B23ssDHX/USPn2M2IjDR5UdpYs6I67SnTSA== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" @@ -7558,9 +7706,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -7648,14 +7796,13 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: - asn1.js "^4.0.0" + asn1.js "^5.2.0" browserify-aes "^1.0.0" - create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" safe-buffer "^5.1.1" @@ -7676,13 +7823,13 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse5@4.0.0: @@ -7790,9 +7937,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -7805,10 +7952,10 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.7: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^2.0.0: version "2.3.0" @@ -7921,9 +8068,9 @@ postcss-browser-comments@^3.0.0: postcss "^7" postcss-calc@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" - integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + version "7.0.3" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.3.tgz#d65cca92a3c52bf27ad37a5f732e0587b74f1623" + integrity sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA== dependencies: postcss "^7.0.27" postcss-selector-parser "^6.0.2" @@ -8227,14 +8374,14 @@ postcss-modules-extract-imports@^2.0.0: postcss "^7.0.5" postcss-modules-local-by-default@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" - integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== dependencies: icss-utils "^4.1.1" - postcss "^7.0.16" + postcss "^7.0.32" postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.0" + postcss-value-parser "^4.1.0" postcss-modules-scope@^2.1.1: version "2.2.0" @@ -8534,10 +8681,10 @@ postcss-value-parser@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" - integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: version "2.0.1" @@ -8557,10 +8704,10 @@ postcss@7.0.21: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" - integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -8577,9 +8724,9 @@ prepend-http@^1.0.0: integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= pretty-bytes@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" - integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== + version "5.4.1" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.4.1.tgz#cd89f79bbcef21e3d21eb0da68ffe93f803e884b" + integrity sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA== pretty-error@^2.1.1: version "2.1.1" @@ -8599,7 +8746,7 @@ pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" -pretty-format@^25.1.0, pretty-format@^25.5.0: +pretty-format@^25.1.0: version "25.5.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== @@ -8609,10 +8756,15 @@ pretty-format@^25.1.0, pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" -private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +pretty-format@^26.4.2: + version "26.4.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.2.tgz#d081d032b398e801e2012af2df1214ef75a81237" + integrity sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA== + dependencies: + "@jest/types" "^26.3.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" process-nextick-args@~2.0.0: version "2.0.1" @@ -8672,9 +8824,9 @@ prr@~1.0.1: integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" @@ -8762,9 +8914,9 @@ querystring@0.2.0: integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= querystringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" - integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== raf@^3.4.0, raf@^3.4.1: version "3.4.1" @@ -8773,7 +8925,7 @@ raf@^3.4.0, raf@^3.4.1: dependencies: performance-now "^2.1.0" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -8804,9 +8956,9 @@ raw-body@2.4.0: unpipe "1.0.0" rc-align@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.1.tgz#0566de141a82d9a1923b7672c70bdb19dcde6e23" - integrity sha512-RQ5Fhxl0LW+zsxbY8dxAcpXdaHkHH2jzRSSpvBTS7G9LMK3T+WRcn4ovjg/eqAESM6TdTx0hfqWF2S1pO75jxQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.3.tgz#9f83e816efd9ec66bb57adf22918794cec0dd7ed" + integrity sha512-TpI0t1tvAo/wYdoZbZlkCK+MkQBqNuPyRZesfsji4tMlqoqQ0q0MhnC9JD5KGPitMvmSB+KWgFpaN2uTz4hw6Q== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -8853,10 +9005,19 @@ rc-collapse@~2.0.0: react-is "^16.7.0" shallowequal "^1.1.0" +rc-dialog@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.3.0.tgz#3c31e39b82a04a28340dd95077beb9f0f7056851" + integrity sha512-M4fjUosNhG/ZCW9zOyA+na451ZIfKjsgynYNU5tcZFx04kVy/ec5Em0zlB+Oa70hDkaQzxlBP37RiqzMFFeb9Q== + dependencies: + "@babel/runtime" "^7.10.1" + rc-animate "3.x" + rc-util "^5.0.1" + rc-dialog@~8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.1.0.tgz#393910963bb05ac19d6d136620bd09622f1d677a" - integrity sha512-vMVAtyxpnokh/okFcDQVLO6ymIXfoTKYKtqJ/hMtf+0WcvRn4VgVDBvGyEk5zd94k0RgwEze9o2kGw8SyjivZg== + version "8.1.1" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.1.1.tgz#ce54bd78e940c030b69d3acfc87874536966a27b" + integrity sha512-ToyHiMlV94z8LfnmeKoVvu04Pd9+HdwwSHhY2a8IWeYGA5Cjk1WyIZvS+njCsm8rSMM4NqPqFkMZA0N/Iw0NrQ== dependencies: rc-animate "3.x" rc-util "^5.0.1" @@ -8879,15 +9040,26 @@ rc-dropdown@^3.1.0, rc-dropdown@~3.1.2: classnames "^2.2.6" rc-trigger "^4.0.0" -rc-field-form@~1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.8.1.tgz#ddb5b34cce498b11a3ad9dbfe2eb8e18539cb7e9" - integrity sha512-OAMFhS+92+4o7Y0WyTfQ6E5EdBk7z7vEXf4dL5CpoZU2OEHv/INZP1xts2AIKNVOBligG/WcfMTuk+GvbyVsnA== +rc-field-form@~1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.10.1.tgz#f6eb76b5f24b58938ebadfc03cdd814c24de7db3" + integrity sha512-aosTtNTqLYX2jsG5GyCv7axe+b57XH73T7TmmrX/cmhemhtFjvNE6RkRkmtP9VOJnZg5YGC5HfK172cnJ1Ij7Q== dependencies: "@babel/runtime" "^7.8.4" async-validator "^3.0.3" rc-util "^5.0.0" +rc-image@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-3.0.3.tgz#c7acc385924028d65e1d501eedebedba916285df" + integrity sha512-swJ9F+G7WlzdnUEkz/xGe2Xr00RNA1nq7VE7/5aOfQxYq06sB4jZMdJ19eUamcBO6sVXfhXe5AOlJTgfGeJ6Ag== + dependencies: + "@ant-design/icons" "^4.2.2" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-dialog "^8.1.0" + rc-util "^5.0.6" + rc-input-number@~6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-6.0.0.tgz#0c0af57c8183f3ca6b87f7edf6fed3bd5a3ba16f" @@ -8898,9 +9070,9 @@ rc-input-number@~6.0.0: rc-util "^5.0.1" rc-mentions@~1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.4.1.tgz#01fbfc6aa885ce26c480380c3a397a9901f456ab" - integrity sha512-MraFCsXlorfUj4/VUjRnITAnBzhM0gMH+2yj/3jmS5rIj0NjNJoTXyEUW3gTJxnw9DP22IMccMTdP3Fjz/2UgQ== + version "1.4.2" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.4.2.tgz#534c29622445be8a5c197d405d20491e0ab35cf0" + integrity sha512-wSmHRF9kFwrbj59mR+u4yVr0KtcrfPw53PYOVizYxYeDfmwaCcSgk29F8OjlDy5jVqUaMhHX5nIiYCePu5Aytg== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.6" @@ -8910,9 +9082,9 @@ rc-mentions@~1.4.0: rc-util "^5.0.1" rc-menu@^8.0.1, rc-menu@^8.2.1, rc-menu@~8.5.2: - version "8.5.2" - resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-8.5.2.tgz#fa43bccabfcf422b9d3cdfcae5b71da08bab7e54" - integrity sha512-GPtr7qoCynVEkFgco/9cW0z/xU33GV89Q6r8FgEkrdhaQSJzuSC+v8pv+Bll5fVGQlJyJgOVqiKk7l2Knk1jYg== + version "8.5.3" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-8.5.3.tgz#ac427c50929a2bc1a5fb1ce57e187033d3f09361" + integrity sha512-OLdN+jwhabgyRZDvWYjYpO7RP7wLybhNuAulgGqx1oUPBJrtgVlG/X4HtPb7nypRx/n+eicj6H8CtbCs0L4m/Q== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -8925,9 +9097,9 @@ rc-menu@^8.0.1, rc-menu@^8.2.1, rc-menu@~8.5.2: shallowequal "^1.1.0" rc-motion@^1.0.0, rc-motion@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-1.0.2.tgz#b8aec288642298d74ddc9ac1773e1b600aaa1c25" - integrity sha512-FDmC9ZdzsXerlTZ+YLu+l5erjkMU98s85SFHdQac+pMy6zQ10RuON6Ntv3ZwP0+qY/YlIsK+0uMXIWOJ9LaLIg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-1.0.3.tgz#b2721f679561b134685b95ab40c768812273360a" + integrity sha512-TC15cIndZ0q5i0rVAQGMvy5gBeeA89iM/tgVaTTMT23M0t1XFL89EqjG8ktYlodPMzCCzRa90oa+YrsSDIcLww== dependencies: "@babel/runtime" "^7.11.1" classnames "^2.2.1" @@ -8944,18 +9116,18 @@ rc-notification@~4.4.0: rc-animate "3.x" rc-util "^5.0.1" -rc-pagination@~2.4.5: - version "2.4.6" - resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-2.4.6.tgz#cc030c9693c730b43592bdb6974fb32c1502a500" - integrity sha512-1ykd3Jti+JuOFdzEFXGfVpkuH+hKxLYz3FKV6BSwnnWXLr9Y8bbm7YiTSwBmdDcOg6tinH8b4IYaKzxBWRC6EA== +rc-pagination@~3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.0.3.tgz#48ce55822e153ed9f9b8961fcb3bb8ecab8df37c" + integrity sha512-xm6LsiSOAWlxferiL5e0jcun1B9vbvYzcIkqpYZR7YvC5ZrcU9KKihb+DZe3DY+oUc49xhX2qGS4D66ITHqekQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" -rc-picker@~1.15.1: - version "1.15.3" - resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-1.15.3.tgz#e4379e6fed9a29f0c1705115d11d196625096b83" - integrity sha512-+VfzcsZui6oOOA0W44qQ7TRC28FUCLrZLjowwyouJKMjvU4HtKdDlSMTJHZNvBbfQoAfED4+mzUG2xtcdW7M+g== +rc-picker@~2.0.6: + version "2.0.9" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.0.9.tgz#1c9d59a4724747aba6626e4aad8fb79f0080993a" + integrity sha512-fLVYQYUv+gV9Nr5TXsf//3if7mKaGT/h3roONNSrw3KN86To/ppbfFgvJfzkfdO7zyfY8TpOVhdgYPATehEolg== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" @@ -8964,7 +9136,6 @@ rc-picker@~1.15.1: moment "^2.24.0" rc-trigger "^4.0.0" rc-util "^5.0.1" - react "^16.0.0" shallowequal "^1.1.0" rc-progress@~3.0.0: @@ -8984,39 +9155,26 @@ rc-rate@~2.8.2: rc-util "^5.0.1" rc-resize-observer@^0.2.0, rc-resize-observer@^0.2.1, rc-resize-observer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-0.2.3.tgz#8268284d1766d163240b1682661ae7b59bc4523d" - integrity sha512-dEPCGX15eRRnu+TNBIGyEghpzE24fTDW8pHdJPJS/kCR3lafFqBLqKzBgZW6pMUuM70/ZDyFQ0Kynx9kWsXRNw== + version "0.2.5" + resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-0.2.5.tgz#03e3a5c3dfccd6c996a547e4f82721e4f20f6156" + integrity sha512-cc4sOI722MVoCkGf/ZZybDVsjxvnH0giyDdA7wBJLTiMSFJ0eyxBMnr0JLYoClxftjnr75Xzl/VUB3HDrAx04Q== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" rc-util "^5.0.0" resize-observer-polyfill "^1.5.1" -rc-select@^11.1.1: - version "11.1.3" - resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-11.1.3.tgz#acb6436e0ec389e1676903d9b514aa0d7565dbeb" - integrity sha512-Mf/EiYFmdWOoOget6RacSz1uAfn0hxf3wOa/YSOf7bw70EH6s80biDHQ4WPk8hNMxVRhzojlkktgmN4YxNQisQ== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^1.0.1" - rc-trigger "^4.3.0" - rc-util "^5.0.1" - rc-virtual-list "^1.1.2" - warning "^4.0.3" - -rc-select@~11.0.12: - version "11.0.13" - resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-11.0.13.tgz#fe5718af819d3e0bc12a55334bc1717257ef2dac" - integrity sha512-4/GDmBkGnDhYre3Dvq5UkIRXQJW8hbGdpdH8SjquSbCktAVitYV+opd/lKI28qMcBxCgjOHgYXwZ18TF+kP2VQ== +rc-select@^11.1.1, rc-select@~11.1.0: + version "11.1.7" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-11.1.7.tgz#2d7d190a78dae359d178d7a5f48934607b223584" + integrity sha512-HZozKGhFbLDI995OUKQW2uZ2ZcGyzNhWN6gTQqpW5/Z0rae1zftpgkI1yxZ79LukOc8lO2NKlDDKCGH/SJH2Cg== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" rc-motion "^1.0.1" rc-trigger "^4.3.0" rc-util "^5.0.1" - rc-virtual-list "^1.1.2" + rc-virtual-list "^3.0.3" warning "^4.0.3" rc-slider@~9.3.0: @@ -9040,30 +9198,30 @@ rc-steps@~4.1.0: rc-util "^5.0.1" rc-switch@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-3.2.0.tgz#aa36bb417409ff4cc7d542ec4381cb5d87cfedc1" - integrity sha512-WQZnRrWZ+KGh4Cd98FpP1ZgvMmebctoHzKAO2n1Xsry1FQBSGgIw4rQJRxET31VS/dR1LIKb5md/k0UzcXXc0g== + version "3.2.1" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-3.2.1.tgz#775f8b2c86716431d83d2b13e4710815baafede0" + integrity sha512-ZXYSmx2U+bpHjljjqS5LGj2UIPcQk0EAq6japkaOzQ/OcyzMwWVD9oXMjcRZdO5W1g/pClIV70uEBOWuBMqP4g== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" rc-util "^5.0.1" -rc-table@~7.8.0: - version "7.8.6" - resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.8.6.tgz#897fb1671c62eb3a46033b53f0690fa0fd65dc61" - integrity sha512-rHRStVTO6FYlxs5Bk9S56Vo/Jn7pX3hOtHTHP+Vu++i9SF7DroOReMIi+OJ7RA9n3jVBxyT/9+NESXgTFvPbYA== +rc-table@~7.9.2: + version "7.9.6" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.9.6.tgz#e15dff9d04d933da25e3e7ac60f0e2070dea0fff" + integrity sha512-NYLGgXquZtYMaZ44GyDR2zaMCQ4ujf2YLVOtz1Fj9Xc/dg9In1kTkVNtZC2UpuXboPWbh6pP9ycD5d55Zp1jDA== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.5" raf "^3.4.1" rc-resize-observer "^0.2.0" - rc-util "^5.0.0" + rc-util "^5.0.4" shallowequal "^1.1.0" -rc-tabs@~11.5.0: - version "11.5.6" - resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.5.6.tgz#bcff03f8c8dcc08b57ca97c0debe5d9fa3373957" - integrity sha512-Q2wqnt66SFksGXxNARLqGNMYIFH3KSm48+hMc4tq6qhgpsW104dedHcM86NUyqsQcvYWWiceUNu3TSnbe+XZnw== +rc-tabs@~11.6.0: + version "11.6.1" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.6.1.tgz#a31a277b12f807cc7bdc31476c0d21124ce93e14" + integrity sha512-fJZUOmwBo2E4WTbucCSZO/N1ZK+d9K/QchgDeycTIqxl5D/xtX0Dw/vC2DFi140OFjAy2JL7H0EmsSeOFfCgzw== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -9085,16 +9243,16 @@ rc-textarea@^0.3.0, rc-textarea@~0.3.0: rc-resize-observer "^0.2.3" rc-tooltip@^4.0.0, rc-tooltip@~4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-4.2.1.tgz#c1a2d5017ee03a771a9301c0dfdb46dfdf8fef94" - integrity sha512-oykuaGsHg7RFvPUaxUpxo7ScEqtH61C66x4JUmjlFlSS8gSx2L8JFtfwM1D68SLBxUqGqJObtxj4TED75gQTiA== + version "4.2.2" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-4.2.2.tgz#b0c374a26846f285b21eb74f9d533e6049e34b22" + integrity sha512-mAs+gAngUyHVA6HdFXsELoJOHgfjAACLLc8SGtnVhovJdyqs5ZGSL9p5i+ApNaVpwjswqShw7L4DRtMl7cXCQg== dependencies: rc-trigger "^4.2.1" rc-tree-select@~4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.1.1.tgz#2d3c61f2449de72839eddf94ab876d3f6567692f" - integrity sha512-pawxt/W1chLpjtAEQe8mXI9C9DYNMGS/BR6eBmOY8cJDK6OWSa6M88S6F0jXc+A10D/CLfHAfF1ZIj7VGse+5Q== + version "4.1.2" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.1.2.tgz#bf012c3c32cf2e82fc7ffbdd60cb596163a290a0" + integrity sha512-2tRwZ4ChY+BarVKHoPR65kSZtopgwKCig6ngJiiTVgYfRdAhfdQp2j2+L8YW9TkosYGmwgTOhmlphlG3QNy7Pg== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -9102,32 +9260,21 @@ rc-tree-select@~4.1.1: rc-tree "^3.8.0" rc-util "^5.0.5" -rc-tree@^3.8.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.9.0.tgz#89de29a8ea5692447d01bbbda8931bd6b3e9b2e1" - integrity sha512-TYvIq2SKdVugS2mdOGC++CNWjj1VDBws4JZkFOAJVQfXFWg+BNW4rhuTzAs4ZY3KiE+1xG0u5cOVvIPr7qkxCA== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "2.x" - rc-motion "^1.0.0" - rc-util "^5.0.0" - rc-virtual-list "^1.1.0" - -rc-tree@~3.8.5: - version "3.8.5" - resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.8.5.tgz#1f6d8c14a4f9263d5a426f7a24703a4c7be46ea3" - integrity sha512-audXUWwxyGB/4rLI4v+KuVucbc74y5t10XYQlR5WUe1J0sQuxP19+5GTb6DgrGXPxWOC6mxmkiw/xsKissE0GA== +rc-tree@^3.8.0, rc-tree@~3.9.0: + version "3.9.4" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.9.4.tgz#aa83a2abc59d4b3b869b26ded3caab20ba237b01" + integrity sha512-uzgpQL4LLoriYE7xTro2tzb5rd6Eg9lhjWZlN/MaWn+lsFw2nnlLbMULejHd7RQXdYB7t3tTCwk7DiKSN+udrA== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" rc-motion "^1.0.0" rc-util "^5.0.0" - rc-virtual-list "^1.1.0" + rc-virtual-list "^3.0.1" rc-trigger@^4.0.0, rc-trigger@^4.2.1, rc-trigger@^4.3.0, rc-trigger@^4.4.0, rc-trigger@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-4.4.0.tgz#52be45c7b40327b297ebacff84d69ce9285606bc" - integrity sha512-09562wc5I1JUbCdWohcFYJeLTpjKjEqH+0lY7plDtyI9yFXRngrvmqsrSJyT6Nat+C35ymD7fhwCCPq3cfUI4g== + version "4.4.2" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-4.4.2.tgz#74f7ebcfdcdc191b7c82380def68fbba79ed5aec" + integrity sha512-uw2/s7j1b/RXyixa4omPuxZWv/3ln+H+p0v3trIUBxseolbdj8TTFpXYjXMZdGtMpAEAIbN1yo/K+r7wRB+xtQ== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.6" @@ -9136,29 +9283,29 @@ rc-trigger@^4.0.0, rc-trigger@^4.2.1, rc-trigger@^4.3.0, rc-trigger@^4.4.0, rc-t rc-motion "^1.0.0" rc-util "^5.0.1" -rc-upload@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-3.2.0.tgz#251fc3c9105902e808600a414f368f285d63bfba" - integrity sha512-/vyOGVxl5QVM3ZE7s+GqYPbCLC/Q/vJq0sjdwnvJw01KvAR5kVOC4jbHEaU56dMss7PFGDfNzc8zO5bWYLDzVQ== +rc-upload@~3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-3.2.1.tgz#2bd6af19061be748736624f553a67d04a49c0deb" + integrity sha512-gmIy08tco2YFTSiru9zgeTmUcDKPyUMUUBdUIjG2CcHz4jdbpaPx/RL/Wz9CMD6ppQizK0gES0rcQ1+o5frK2Q== dependencies: classnames "^2.2.5" -rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.5, rc-util@^5.0.6: - version "5.0.6" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.0.6.tgz#2b828bc87a818a66384b813f76a561ad4609e9b0" - integrity sha512-uLGxF9WjbpJSjd6iDnIjl8ZeMUglpcuh1DwO26aaXh++yAmlB6eIAJMUwwJCuqJvo4quCvsDPg1VkqHILc4U0A== +rc-util@^5.0.0, rc-util@^5.0.1, rc-util@^5.0.4, rc-util@^5.0.5, rc-util@^5.0.6, rc-util@^5.0.7, rc-util@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.2.0.tgz#c3fb107631c2cc9dbe3822128ba76819b3f84948" + integrity sha512-IkANK8S+PGKyFKt1uxxL0jnUu5cQeMqx2SiH+eClxM9jUrOg2jnBR4nNe2r/ccoiSlfMigE6USCgaTnWsdzsCQ== dependencies: react-is "^16.12.0" shallowequal "^1.1.0" -rc-virtual-list@^1.1.0, rc-virtual-list@^1.1.2: - version "1.1.6" - resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-1.1.6.tgz#b255baf9aacde149a8893324e6307214094f4c0a" - integrity sha512-u3+izqWL8p8bQy8nYH48qWpiGyxR/ye8D2k0zJlXmfYeL55/xh83YrzHqiDzO78uj0Ewag3nXDA0JTVrYO7ygQ== +rc-virtual-list@^3.0.1, rc-virtual-list@^3.0.3: + version "3.0.10" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.0.10.tgz#ff283b1bd0f7e5e2e7dc21b3ca01b17333a1af81" + integrity sha512-Sno9DTU0WW/r5iBQg0GDk2T0NX/7y4C0suIrQzM4FQtKO52757y5/CMq7iDYvQROb40tqiphSnhtrhmuiNwyUw== dependencies: classnames "^2.2.6" - raf "^3.4.1" - rc-util "^5.0.0" + rc-resize-observer "^0.2.3" + rc-util "^5.0.7" react-app-polyfill@^1.0.6: version "1.0.6" @@ -9309,7 +9456,7 @@ react-scripts@3.4.2: optionalDependencies: fsevents "2.1.2" -react@^16.0.0, react@^16.13.1: +react@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== @@ -9365,7 +9512,7 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9383,12 +9530,12 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.7" + picomatch "^2.2.1" realpath-native@^1.1.0: version "1.1.0" @@ -9420,9 +9567,9 @@ regenerate-unicode-properties@^8.2.0: regenerate "^1.4.0" regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + version "1.4.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== regenerator-runtime@^0.11.0: version "0.11.1" @@ -9430,17 +9577,16 @@ regenerator-runtime@^0.11.0: integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== regenerator-transform@^0.14.2: - version "0.14.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" - integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: "@babel/runtime" "^7.8.4" - private "^0.1.8" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -9469,9 +9615,9 @@ regexpp@^2.0.1: integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpp@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" - integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== regexpu-core@^4.7.0: version "4.7.0" @@ -9486,9 +9632,9 @@ regexpu-core@^4.7.0: unicode-match-property-value-ecmascript "^1.2.0" regjsgen@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: version "0.6.4" @@ -9528,19 +9674,19 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: - lodash "^4.17.15" + lodash "^4.17.19" request-promise-native@^1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: - request-promise-core "1.1.3" + request-promise-core "1.1.4" stealthy-require "^1.1.1" tough-cookie "^2.3.3" @@ -9641,9 +9787,9 @@ resolve@1.15.0: path-parse "^1.0.6" resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" @@ -9716,11 +9862,9 @@ rsvp@^4.8.4: integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== run-async@^2.2.0, run-async@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== - dependencies: - is-promise "^2.1.0" + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -9729,10 +9873,10 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== +rxjs@^6.5.3, rxjs@^6.6.0: + version "6.6.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" + integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== dependencies: tslib "^1.9.0" @@ -9741,10 +9885,10 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex@^1.1.0: version "1.1.0" @@ -9818,22 +9962,14 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: - version "2.6.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" - integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== - dependencies: - ajv "^6.12.0" - ajv-keywords "^3.4.1" - -schema-utils@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" screenfull@^5.0.0: version "5.0.2" @@ -9874,6 +10010,11 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -9898,6 +10039,13 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -10016,17 +10164,17 @@ shellwords@^0.1.1: integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" + integrity sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g== dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" + es-abstract "^1.18.0-next.0" + object-inspect "^1.8.0" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== simple-swizzle@^0.2.2: version "0.2.2" @@ -10139,9 +10287,9 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: urix "^0.1.0" source-map-support@^0.5.6, source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -10162,22 +10310,22 @@ source-map@^0.5.0, source-map@^0.5.6: integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" @@ -10368,21 +10516,21 @@ string.prototype.matchall@^4.0.2: regexp.prototype.flags "^1.3.0" side-channel "^1.0.2" -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -10461,9 +10609,9 @@ strip-indent@^3.0.0: min-indent "^1.0.0" strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== style-loader@0.23.1: version "0.23.1" @@ -10502,9 +10650,9 @@ supports-color@^6.1.0: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -10568,24 +10716,24 @@ terser-webpack-plugin@2.3.5: webpack-sources "^1.4.3" terser-webpack-plugin@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" - integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== dependencies: cacache "^12.0.2" find-cache-dir "^2.1.0" is-wsl "^1.1.0" schema-utils "^1.0.0" - serialize-javascript "^2.1.2" + serialize-javascript "^4.0.0" source-map "^0.6.1" terser "^4.1.2" webpack-sources "^1.4.0" worker-farm "^1.7.0" terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: - version "4.6.7" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" - integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -10725,15 +10873,20 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -ts-pnp@1.1.6, ts-pnp@^1.1.6: +ts-pnp@1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ== +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== tsutils@^3.17.1: version "3.17.1" @@ -10790,19 +10943,19 @@ type@^1.0.1: integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" - integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + version "2.1.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" + integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@~3.7.2: - version "3.7.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" - integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== +typescript@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.2.tgz#7ea7c88777c723c681e33bf7988be5d008d05ac2" + integrity sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -10895,9 +11048,9 @@ upath@^1.1.1: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== dependencies: punycode "^2.1.0" @@ -10989,9 +11142,9 @@ uuid@^3.3.2, uuid@^3.4.0: integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -11060,14 +11213,23 @@ warning@^4.0.1, warning@^4.0.3: dependencies: loose-envify "^1.0.0" +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + version "1.7.4" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" + integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== dependencies: - chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.0" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -11194,18 +11356,18 @@ websocket-driver@0.6.5: websocket-extensions ">=0.1.1" websocket-driver@>=0.5.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" - integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: - http-parser-js ">=0.4.0 <0.4.11" + http-parser-js ">=0.5.1" safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: version "1.0.5" @@ -11215,9 +11377,9 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: iconv-lite "0.4.24" whatwg-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + version "3.4.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.0.tgz#e11de14f4878f773fbebcde8871b2c0699af8b30" + integrity sha512-rsum2ulz2iuZH08mJkT0Yi6JnKhwdw4oeyMjokgxd+mmqYSd9cPpOQf01TIWgjxG/U4+QR+AwKq6lSbXVxkyoQ== whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" @@ -11496,18 +11658,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0: +yaml@^1.10.0, yaml@^1.7.2: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yaml@^1.7.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.2.tgz#a29c03f578faafd57dcb27055f9a5d569cb0c3d9" - integrity sha512-omakb0d7FjMo3R1D2EbTKVIk6dAVLRxFXdLZMEUToeAvuqgG/YuHMuQOZ5fgk+vQ8cx+cnGKwyg+8g8PNT0xQg== - dependencies: - "@babel/runtime" "^7.8.7" - yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" From 960d9a1d77df12871bbbf7bca1889746c66f93e0 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 16:33:47 +0800 Subject: [PATCH 081/126] refine --- web-ui/src/hooks/useComps.ts | 3 ++- web-ui/src/pages/Clusters/ClusterDetail.tsx | 7 ++++--- web-ui/src/pages/Clusters/ClusterScaleOut.tsx | 1 + web-ui/src/pages/Clusters/index.tsx | 5 +++-- web-ui/src/pages/Deployment/CompsManager.tsx | 13 ++++++++----- web-ui/src/pages/Deployment/DeploymentTable.tsx | 5 +++-- web-ui/src/pages/Deployment/EditCompForm.tsx | 2 +- web-ui/src/pages/Deployment/TopoPreview.tsx | 5 +++-- web-ui/src/pages/Home/index.tsx | 3 ++- web-ui/src/pages/Machines/MachineForm.tsx | 1 + web-ui/src/pages/Machines/index.tsx | 5 +++-- web-ui/src/pages/Status/index.tsx | 4 ++-- web-ui/src/types/misc.ts | 10 +++++++++- web-ui/tsconfig.paths.json | 8 ++++++-- 14 files changed, 48 insertions(+), 24 deletions(-) diff --git a/web-ui/src/hooks/useComps.ts b/web-ui/src/hooks/useComps.ts index e5f653156a..bb0fba34c0 100644 --- a/web-ui/src/hooks/useComps.ts +++ b/web-ui/src/hooks/useComps.ts @@ -1,7 +1,8 @@ import { useLocalStorageState } from 'ahooks' -import { BaseComp, CompMap } from '../types/comps' import { useMemo } from 'react' +import { BaseComp, CompMap } from '_types' + export function useComps() { const [compObjs, setCompObjs] = useLocalStorageState( 'components', diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index b74e63a157..22387f3daf 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -10,10 +10,11 @@ import { startCluster, stopCluster, scaleInCluster, -} from '../../utils/api' -import { Root } from '../../components' +} from '_utils' +import { Root } from '_components' +import { useComps } from '_hooks' + import { ICluster } from '.' -import { useComps } from '../../hooks' export interface IClusterInstInfo { id: string diff --git a/web-ui/src/pages/Clusters/ClusterScaleOut.tsx b/web-ui/src/pages/Clusters/ClusterScaleOut.tsx index a772f0561e..b9a3c5a47e 100644 --- a/web-ui/src/pages/Clusters/ClusterScaleOut.tsx +++ b/web-ui/src/pages/Clusters/ClusterScaleOut.tsx @@ -1,5 +1,6 @@ import React from 'react' import { useParams } from 'react-router-dom' + import CompsManager from '../Deployment/CompsManager' export default function ClusterScaleOutPage() { diff --git a/web-ui/src/pages/Clusters/index.tsx b/web-ui/src/pages/Clusters/index.tsx index 3f2b9914fa..0e243420bb 100644 --- a/web-ui/src/pages/Clusters/index.tsx +++ b/web-ui/src/pages/Clusters/index.tsx @@ -2,8 +2,9 @@ import React, { useEffect, useState } from 'react' import { Layout, Menu, Space } from 'antd' import { NavLink, Outlet, useNavigate, Link } from 'react-router-dom' import { useSessionStorageState } from 'ahooks' -import { getClusterList } from '../../utils' -import { Root } from '../../components' + +import { getClusterList } from '_utils' +import { Root } from '_components' export interface ICluster { name: string diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/web-ui/src/pages/Deployment/CompsManager.tsx index 26106e3181..40cff0323e 100644 --- a/web-ui/src/pages/Deployment/CompsManager.tsx +++ b/web-ui/src/pages/Deployment/CompsManager.tsx @@ -2,20 +2,23 @@ import React, { useCallback, useState } from 'react' import { useLocalStorageState } from 'ahooks' import { Drawer, Button, Modal, Form, Input, Select } from 'antd' import yaml from 'yaml' +import { useNavigate } from 'react-router-dom' + +import { Root } from '_components' +import { BaseComp, CompTypes } from '_types' +import { useComps } from '_hooks' +import { deployCluster, scaleOutCluster } from '_utils' import { IMachine } from '../Machines/MachineForm' import DeploymentTable from './DeploymentTable' import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' -import { Root } from '../../components' -import { deployCluster, scaleOutCluster } from '../../utils/api' import { IGlobalLoginOptions } from '../Machines/GlobalLoginOptionsForm' -import { useNavigate } from 'react-router-dom' -import { BaseComp, CompTypes } from '../../types/comps' -import { useComps } from '../../hooks/useComps' // TODO: fetch from API const TIDB_VERSIONS = [ + 'nightly', + 'v4.0.5', 'v4.0.4', 'v4.0.3', 'v4.0.2', diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index 7e86860ae9..0a9c891adc 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -1,14 +1,15 @@ import React, { useMemo } from 'react' import { Tag, Table, Menu, Dropdown, Space, Divider, Popconfirm } from 'antd' import { DownOutlined } from '@ant-design/icons' +import { useLocalStorageState } from 'ahooks' + +import { BaseComp, COMP_TYPES_ARR, CompTypes } from '_types' import { IMachine, DEF_SSH_PORT } from '../Machines/MachineForm' -import { useLocalStorageState } from 'ahooks' import { IGlobalLoginOptions, DEF_UESRNAME, } from '../Machines/GlobalLoginOptionsForm' -import { BaseComp, COMP_TYPES_ARR, CompTypes } from '../../types/comps' interface IDeploymentTableProps { forScaleOut: boolean // deploy or scale out diff --git a/web-ui/src/pages/Deployment/EditCompForm.tsx b/web-ui/src/pages/Deployment/EditCompForm.tsx index 28d1a43e71..be44fa464a 100644 --- a/web-ui/src/pages/Deployment/EditCompForm.tsx +++ b/web-ui/src/pages/Deployment/EditCompForm.tsx @@ -21,7 +21,7 @@ import { DEF_PROM_PORT, DEF_ALERT_WEB_PORT, DEF_ALERT_CLUSTER_PORT, -} from '../../types/comps' +} from '_types' interface IEditCompFormProps { comp?: BaseComp diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index 8b1499ed2a..d0c2426187 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -1,13 +1,14 @@ import React, { useMemo } from 'react' import yaml from 'yaml' -import { IMachine } from '../Machines/MachineForm' import { DEF_DEPLOY_DIR_PREFIX, DEF_DATA_DIR_PREFIX, COMP_TYPES_ARR, CompMap, -} from '../../types/comps' +} from '_types' + +import { IMachine } from '../Machines/MachineForm' interface ITopoPreviewProps { forScaleOut: boolean diff --git a/web-ui/src/pages/Home/index.tsx b/web-ui/src/pages/Home/index.tsx index 1203a61912..b340bb352c 100644 --- a/web-ui/src/pages/Home/index.tsx +++ b/web-ui/src/pages/Home/index.tsx @@ -6,7 +6,8 @@ import { DeploymentUnitOutlined, ClusterOutlined, } from '@ant-design/icons' -import { getStatus } from '../../utils/api' + +import { getStatus } from '_utils' const { Sider, Content } = Layout diff --git a/web-ui/src/pages/Machines/MachineForm.tsx b/web-ui/src/pages/Machines/MachineForm.tsx index 3111eacd86..a02d23ed04 100644 --- a/web-ui/src/pages/Machines/MachineForm.tsx +++ b/web-ui/src/pages/Machines/MachineForm.tsx @@ -10,6 +10,7 @@ import { Typography, } from 'antd' import uniqid from 'uniqid' + import { IGlobalLoginOptions, DEF_UESRNAME } from './GlobalLoginOptionsForm' export interface IMachine { diff --git a/web-ui/src/pages/Machines/index.tsx b/web-ui/src/pages/Machines/index.tsx index 71150804fa..c37920c4cd 100644 --- a/web-ui/src/pages/Machines/index.tsx +++ b/web-ui/src/pages/Machines/index.tsx @@ -2,13 +2,14 @@ import React, { useState, useCallback } from 'react' import { Button, Drawer, Modal, Space } from 'antd' import { useLocalStorageState } from 'ahooks' +import { Root } from '_components' +import { useComps } from '_hooks' + import MachineForm, { IMachine } from './MachineForm' import MachinesTable from './MachinesTable' -import { Root } from '../../components' import GlobalLoginOptionsForm, { IGlobalLoginOptions, } from './GlobalLoginOptionsForm' -import { useComps } from '../../hooks' export default function MachinesPage() { const [showForm, setShowForm] = useState(false) diff --git a/web-ui/src/pages/Status/index.tsx b/web-ui/src/pages/Status/index.tsx index 3c3686ca99..e04fcd5c32 100644 --- a/web-ui/src/pages/Status/index.tsx +++ b/web-ui/src/pages/Status/index.tsx @@ -1,8 +1,8 @@ import React, { useState, useEffect } from 'react' import { Link } from 'react-router-dom' -import { Root } from '../../components' -import { getStatus } from '../../utils' +import { Root } from '_components' +import { getStatus } from '_utils' import { IOperationStatus } from '_types' import OperationStatus from './OperationStatus' diff --git a/web-ui/src/types/misc.ts b/web-ui/src/types/misc.ts index 6b5391e34a..a97149424e 100644 --- a/web-ui/src/types/misc.ts +++ b/web-ui/src/types/misc.ts @@ -1,5 +1,13 @@ +export type OperationType = + | 'deploy' + | 'start' + | 'stop' + | 'scaleIn' + | 'scaleOut' + | 'destroy' + export interface IOperationStatus { - operation_type: string // deploy | start | stop | scaleIn | scaleOut | destroy + operation_type: OperationType cluster_name: string total_progress: number steps: string[] diff --git a/web-ui/tsconfig.paths.json b/web-ui/tsconfig.paths.json index f7d9abf66a..e9b9f1cfa2 100644 --- a/web-ui/tsconfig.paths.json +++ b/web-ui/tsconfig.paths.json @@ -1,8 +1,12 @@ { "compilerOptions": { - "baseUrl": "./src", + "baseUrl": ".", "paths": { - "_types": ["types"] + "_types": ["src/types"], + "_utils": ["src/utils"], + "_hooks": ["src/hooks"], + "_components": ["src/components"], + "_pages/*": ["src/pages/*"] } } } From af8b247ecf6cb0dad64982655c29d3db2020ff86 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 16:42:08 +0800 Subject: [PATCH 082/126] rename utils to apis --- web-ui/src/{utils => apis}/api.ts | 0 web-ui/src/{utils => apis}/index.ts | 0 web-ui/src/{utils => apis}/request.ts | 0 web-ui/src/pages/Clusters/ClusterDetail.tsx | 2 +- web-ui/src/pages/Clusters/index.tsx | 2 +- web-ui/src/pages/Deployment/CompsManager.tsx | 2 +- web-ui/src/pages/Home/index.tsx | 2 +- web-ui/src/pages/Status/index.tsx | 2 +- web-ui/tsconfig.paths.json | 2 +- 9 files changed, 6 insertions(+), 6 deletions(-) rename web-ui/src/{utils => apis}/api.ts (100%) rename web-ui/src/{utils => apis}/index.ts (100%) rename web-ui/src/{utils => apis}/request.ts (100%) diff --git a/web-ui/src/utils/api.ts b/web-ui/src/apis/api.ts similarity index 100% rename from web-ui/src/utils/api.ts rename to web-ui/src/apis/api.ts diff --git a/web-ui/src/utils/index.ts b/web-ui/src/apis/index.ts similarity index 100% rename from web-ui/src/utils/index.ts rename to web-ui/src/apis/index.ts diff --git a/web-ui/src/utils/request.ts b/web-ui/src/apis/request.ts similarity index 100% rename from web-ui/src/utils/request.ts rename to web-ui/src/apis/request.ts diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index 22387f3daf..d1518afea5 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -10,7 +10,7 @@ import { startCluster, stopCluster, scaleInCluster, -} from '_utils' +} from '_apis' import { Root } from '_components' import { useComps } from '_hooks' diff --git a/web-ui/src/pages/Clusters/index.tsx b/web-ui/src/pages/Clusters/index.tsx index 0e243420bb..d6ba4ce401 100644 --- a/web-ui/src/pages/Clusters/index.tsx +++ b/web-ui/src/pages/Clusters/index.tsx @@ -3,7 +3,7 @@ import { Layout, Menu, Space } from 'antd' import { NavLink, Outlet, useNavigate, Link } from 'react-router-dom' import { useSessionStorageState } from 'ahooks' -import { getClusterList } from '_utils' +import { getClusterList } from '_apis' import { Root } from '_components' export interface ICluster { diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/web-ui/src/pages/Deployment/CompsManager.tsx index 40cff0323e..7b6d12ede4 100644 --- a/web-ui/src/pages/Deployment/CompsManager.tsx +++ b/web-ui/src/pages/Deployment/CompsManager.tsx @@ -7,7 +7,7 @@ import { useNavigate } from 'react-router-dom' import { Root } from '_components' import { BaseComp, CompTypes } from '_types' import { useComps } from '_hooks' -import { deployCluster, scaleOutCluster } from '_utils' +import { deployCluster, scaleOutCluster } from '_apis' import { IMachine } from '../Machines/MachineForm' import DeploymentTable from './DeploymentTable' diff --git a/web-ui/src/pages/Home/index.tsx b/web-ui/src/pages/Home/index.tsx index b340bb352c..13de9914b2 100644 --- a/web-ui/src/pages/Home/index.tsx +++ b/web-ui/src/pages/Home/index.tsx @@ -7,7 +7,7 @@ import { ClusterOutlined, } from '@ant-design/icons' -import { getStatus } from '_utils' +import { getStatus } from '_apis' const { Sider, Content } = Layout diff --git a/web-ui/src/pages/Status/index.tsx b/web-ui/src/pages/Status/index.tsx index e04fcd5c32..3b08254ea2 100644 --- a/web-ui/src/pages/Status/index.tsx +++ b/web-ui/src/pages/Status/index.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react' import { Link } from 'react-router-dom' import { Root } from '_components' -import { getStatus } from '_utils' +import { getStatus } from '_apis' import { IOperationStatus } from '_types' import OperationStatus from './OperationStatus' diff --git a/web-ui/tsconfig.paths.json b/web-ui/tsconfig.paths.json index e9b9f1cfa2..41b62fe6bb 100644 --- a/web-ui/tsconfig.paths.json +++ b/web-ui/tsconfig.paths.json @@ -3,7 +3,7 @@ "baseUrl": ".", "paths": { "_types": ["src/types"], - "_utils": ["src/utils"], + "_apis": ["src/apis"], "_hooks": ["src/hooks"], "_components": ["src/components"], "_pages/*": ["src/pages/*"] From 94294434cb74da1d26e284b53cd7dcd68aaff980 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 18:01:25 +0800 Subject: [PATCH 083/126] refine --- web-ui/src/hooks/index.ts | 2 + web-ui/src/hooks/useGlobalLoginOptions.ts | 14 ++ web-ui/src/hooks/useMachines.ts | 21 +++ web-ui/src/pages/Deployment/CompsManager.tsx | 27 ++-- .../src/pages/Deployment/DeploymentTable.tsx | 30 ++--- web-ui/src/pages/Deployment/EditCompForm.tsx | 50 +++---- web-ui/src/pages/Deployment/TopoPreview.tsx | 22 ++-- .../pages/Machines/GlobalLoginOptionsForm.tsx | 9 +- web-ui/src/pages/Machines/MachineForm.tsx | 124 +++++------------- web-ui/src/pages/Machines/MachinesTable.tsx | 14 +- web-ui/src/pages/Machines/index.tsx | 77 +++++------ web-ui/src/types/index.ts | 1 + web-ui/src/types/machine.ts | 52 ++++++++ 13 files changed, 225 insertions(+), 218 deletions(-) create mode 100644 web-ui/src/hooks/useGlobalLoginOptions.ts create mode 100644 web-ui/src/hooks/useMachines.ts create mode 100644 web-ui/src/types/machine.ts diff --git a/web-ui/src/hooks/index.ts b/web-ui/src/hooks/index.ts index 5e36bb69b0..4f70f517f9 100644 --- a/web-ui/src/hooks/index.ts +++ b/web-ui/src/hooks/index.ts @@ -1 +1,3 @@ +export * from './useMachines' export * from './useComps' +export * from './useGlobalLoginOptions' diff --git a/web-ui/src/hooks/useGlobalLoginOptions.ts b/web-ui/src/hooks/useGlobalLoginOptions.ts new file mode 100644 index 0000000000..751792ff12 --- /dev/null +++ b/web-ui/src/hooks/useGlobalLoginOptions.ts @@ -0,0 +1,14 @@ +import { useLocalStorageState } from 'ahooks' + +import { IGlobalLoginOptions } from '_types' + +export function useGlobalLoginOptions() { + const [globalLoginOptions, setGlobalLoginOptions] = useLocalStorageState< + IGlobalLoginOptions + >('global_login_options', {}) + + return { + globalLoginOptions, + setGlobalLoginOptions, + } +} diff --git a/web-ui/src/hooks/useMachines.ts b/web-ui/src/hooks/useMachines.ts new file mode 100644 index 0000000000..fa40f6c6f4 --- /dev/null +++ b/web-ui/src/hooks/useMachines.ts @@ -0,0 +1,21 @@ +import { useLocalStorageState } from 'ahooks' +import { useMemo } from 'react' + +import { MachineMap, Machine } from '_types' + +export function useMachines() { + const [machineObjs, setMachineObjs] = useLocalStorageState( + 'machines', + {} + ) + + const machines = useMemo(() => { + let _machines: MachineMap = {} + Object.keys(machineObjs).forEach((k) => { + _machines[k] = Machine.deSerial(machineObjs[k]) + }) + return _machines + }, [machineObjs]) + + return { machines, setMachineObjs } +} diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/web-ui/src/pages/Deployment/CompsManager.tsx index 7b6d12ede4..f012b8665b 100644 --- a/web-ui/src/pages/Deployment/CompsManager.tsx +++ b/web-ui/src/pages/Deployment/CompsManager.tsx @@ -5,15 +5,13 @@ import yaml from 'yaml' import { useNavigate } from 'react-router-dom' import { Root } from '_components' -import { BaseComp, CompTypes } from '_types' -import { useComps } from '_hooks' +import { BaseComp, CompTypes, Machine } from '_types' +import { useComps, useGlobalLoginOptions, useMachines } from '_hooks' import { deployCluster, scaleOutCluster } from '_apis' -import { IMachine } from '../Machines/MachineForm' import DeploymentTable from './DeploymentTable' import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' -import { IGlobalLoginOptions } from '../Machines/GlobalLoginOptionsForm' // TODO: fetch from API const TIDB_VERSIONS = [ @@ -43,9 +41,7 @@ export default function CompsManager({ clusterName, forScaleOut, }: ICompsManagerProps) { - const [machines] = useLocalStorageState<{ - [key: string]: IMachine - }>('machines', {}) + const { machines } = useMachines() const { comps, setCompObjs } = useComps() const [curComp, setCurComp] = useState(undefined) @@ -56,10 +52,7 @@ export default function CompsManager({ { cluster_name: '', tidb_version: '' } ) - const [globalLoginOptions] = useLocalStorageState( - 'global_login_options', - {} - ) + const { globalLoginOptions } = useGlobalLoginOptions() const [, setCurScaleOutNodes] = useLocalStorageState( 'cur_scale_out_nodes', @@ -71,7 +64,7 @@ export default function CompsManager({ const [form] = Form.useForm() const handleAddComponent = useCallback( - (machine: IMachine, componentType: CompTypes, forScaleOut: boolean) => { + (machine: Machine, componentType: CompTypes, forScaleOut: boolean) => { let comp = BaseComp.create(componentType, machine.id, forScaleOut) const existedSameComps = Object.values(comps).filter( (comp) => comp.type === componentType && comp.machineID === machine.id @@ -110,7 +103,7 @@ export default function CompsManager({ ) const handleDeleteComponents = useCallback( - (machine: IMachine, forScaleOut: boolean) => { + (machine: Machine, forScaleOut: boolean) => { const newComps = { ...comps } const belongedComps = Object.values(comps).filter( (c) => c.machineID === machine.id @@ -126,9 +119,7 @@ export default function CompsManager({ ) function handleDeploy(values: any) { - const topoYaml = yaml.stringify( - genTopo({ machines, components: comps, forScaleOut }) - ) + const topoYaml = yaml.stringify(genTopo(machines, comps, forScaleOut)) deployCluster({ ...values, topo_yaml: topoYaml, @@ -163,9 +154,7 @@ export default function CompsManager({ }) // scale out - const topoYaml = yaml.stringify( - genTopo({ machines, components: comps, forScaleOut }) - ) + const topoYaml = yaml.stringify(genTopo(machines, comps, forScaleOut)) scaleOutCluster(clusterName!, { topo_yaml: topoYaml, global_login_options: globalLoginOptions, diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index 0a9c891adc..6c424220ef 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -1,28 +1,31 @@ import React, { useMemo } from 'react' import { Tag, Table, Menu, Dropdown, Space, Divider, Popconfirm } from 'antd' import { DownOutlined } from '@ant-design/icons' -import { useLocalStorageState } from 'ahooks' -import { BaseComp, COMP_TYPES_ARR, CompTypes } from '_types' - -import { IMachine, DEF_SSH_PORT } from '../Machines/MachineForm' import { - IGlobalLoginOptions, + BaseComp, + COMP_TYPES_ARR, + CompTypes, DEF_UESRNAME, -} from '../Machines/GlobalLoginOptionsForm' + Machine, + DEF_SSH_PORT, + MachineMap, + CompMap, +} from '_types' +import { useGlobalLoginOptions } from '_hooks' interface IDeploymentTableProps { forScaleOut: boolean // deploy or scale out - machines: { [key: string]: IMachine } - components: { [key: string]: BaseComp } + machines: MachineMap + components: CompMap onAddComponent?: ( - machine: IMachine, + machine: Machine, componentType: CompTypes, forScaleOut: boolean ) => void onEditComponent?: (comp: BaseComp) => void onDeleteComponent?: (comp: BaseComp) => void - onDeleteComponents?: (machine: IMachine, forScaleOut: boolean) => void + onDeleteComponents?: (machine: Machine, forScaleOut: boolean) => void } export default function DeploymentTable({ @@ -34,13 +37,10 @@ export default function DeploymentTable({ onDeleteComponent, onDeleteComponents, }: IDeploymentTableProps) { - const [globalLoginOptions] = useLocalStorageState( - 'global_login_options', - {} - ) + const { globalLoginOptions } = useGlobalLoginOptions() const dataSource = useMemo(() => { - let machinesAndComps: (IMachine | BaseComp)[] = [] + let machinesAndComps: (Machine | BaseComp)[] = [] const sortedMachines = Object.values(machines).sort((a, b) => a.host > b.host ? 1 : -1 ) diff --git a/web-ui/src/pages/Deployment/EditCompForm.tsx b/web-ui/src/pages/Deployment/EditCompForm.tsx index be44fa464a..65e461693b 100644 --- a/web-ui/src/pages/Deployment/EditCompForm.tsx +++ b/web-ui/src/pages/Deployment/EditCompForm.tsx @@ -23,6 +23,32 @@ import { DEF_ALERT_CLUSTER_PORT, } from '_types' +function correctFormValues(values: any) { + for (const key of Object.keys(values)) { + let v = values[key] + if (v === undefined) { + continue + } + if (typeof v !== 'string') { + continue + } + if (typeof v === 'string') { + v = v.trim() + } + if (v === '') { + values[key] = undefined + continue + } + if (key === 'deploy_dir_prefix' || key === 'data_dir_prefix') { + continue + } + values[key] = parseInt(v) + if (values[key] <= 0) { + values[key] = undefined + } + } +} + interface IEditCompFormProps { comp?: BaseComp onUpdateComp: (comp: BaseComp) => void @@ -33,29 +59,7 @@ export default function EditCompForm({ onUpdateComp, }: IEditCompFormProps) { function handleFinish(values: any) { - for (const key of Object.keys(values)) { - let v = values[key] - if (v === undefined) { - continue - } - if (typeof v !== 'string') { - continue - } - if (typeof v === 'string') { - v = v.trim() - } - if (v === '') { - values[key] = undefined - continue - } - if (key === 'deploy_dir_prefix' || key === 'data_dir_prefix') { - continue - } - values[key] = parseInt(v) - if (values[key] <= 0) { - values[key] = undefined - } - } + correctFormValues(values) onUpdateComp({ ...comp, ...values, diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index d0c2426187..1a4b1edbb3 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -6,22 +6,20 @@ import { DEF_DATA_DIR_PREFIX, COMP_TYPES_ARR, CompMap, + MachineMap, } from '_types' -import { IMachine } from '../Machines/MachineForm' - interface ITopoPreviewProps { - forScaleOut: boolean - machines: { [key: string]: IMachine } + machines: MachineMap components: CompMap + forScaleOut: boolean } -// TODO: split into 2 methods: genDeployTopo, genScaleOutTopo -export function genTopo({ - machines, - components, - forScaleOut, -}: ITopoPreviewProps) { +export function genTopo( + machines: MachineMap, + components: CompMap, + forScaleOut: boolean +) { const componentsArr = Object.values(components) let topo = {} as any @@ -93,11 +91,11 @@ export function genTopo({ } export default function TopoPreview({ - forScaleOut, machines, components, + forScaleOut, }: ITopoPreviewProps) { - const topo = useMemo(() => genTopo({ machines, components, forScaleOut }), [ + const topo = useMemo(() => genTopo(machines, components, forScaleOut), [ machines, components, forScaleOut, diff --git a/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx b/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx index d7cb64065b..9789745dad 100644 --- a/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx +++ b/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx @@ -1,14 +1,7 @@ import React, { useState } from 'react' import { Form, Input, Button, message } from 'antd' -export interface IGlobalLoginOptions { - username?: string - password?: string - privateKey?: string - privateKeyPassword?: string -} - -export const DEF_UESRNAME = 'root' +import { IGlobalLoginOptions, DEF_UESRNAME } from '_types' export interface IGlobalLoginOptionsFormProps { globalLoginOptions: IGlobalLoginOptions diff --git a/web-ui/src/pages/Machines/MachineForm.tsx b/web-ui/src/pages/Machines/MachineForm.tsx index a02d23ed04..8efffa0046 100644 --- a/web-ui/src/pages/Machines/MachineForm.tsx +++ b/web-ui/src/pages/Machines/MachineForm.tsx @@ -9,52 +9,22 @@ import { Select, Typography, } from 'antd' -import uniqid from 'uniqid' -import { IGlobalLoginOptions, DEF_UESRNAME } from './GlobalLoginOptionsForm' - -export interface IMachine { - id: string - name: string - host: string - ssh_port?: number - - isPubKeyAuth: boolean - privateKey: string - privateKeyPassword: string - - username: string - password: string - - dc: string - rack: string -} -export const DEF_SSH_PORT = 22 - -const defMachine: IMachine = { - id: '', - name: '', - host: '', - ssh_port: undefined, - - isPubKeyAuth: true, - privateKey: '', - privateKeyPassword: '', - - username: '', - password: '', - - dc: '', - rack: '', -} - -function correctFormValues( - values: any, - globalLoginOptions: IGlobalLoginOptions -) { +import { + IGlobalLoginOptions, + DEF_UESRNAME, + Machine, + MachineMap, + DEF_SSH_PORT, +} from '_types' + +function correctFormValues(values: any) { for (const key of Object.keys(values)) { - if (key !== 'ssh_port' && key !== 'isPubKeyAuth') { + if (key !== 'isPubKeyAuth') { values[key] = values[key].trim() + if (values[key] === '') { + values[key] = undefined + } } if (key === 'ssh_port' && values[key] !== undefined) { values[key] = parseInt(values[key]) @@ -63,28 +33,25 @@ function correctFormValues( } } } - if (values.name === '') { - values.name = `${ - values.username || globalLoginOptions.username || DEF_UESRNAME - }@${values.host}` - } } -interface IMachineFormProps { +interface MachineFormProps { globalLoginOptions: IGlobalLoginOptions - machine?: IMachine - machines: { [key: string]: IMachine } - onAdd?: (machine: IMachine, close: boolean) => boolean - onUpdate?: (machine: IMachine) => boolean + machine?: Machine + machines: MachineMap + onAdd?: (machine: Machine, close: boolean) => boolean + onUpdate?: (machine: Machine) => boolean } +const defMachine = new Machine() + export default function MachineForm({ globalLoginOptions, machine, machines, onAdd, onUpdate, -}: IMachineFormProps) { +}: MachineFormProps) { const [form] = Form.useForm() const addNew: boolean = machine === undefined @@ -97,17 +64,9 @@ export default function MachineForm({ form .validateFields() .then((values) => { - correctFormValues(values, globalLoginOptions) - const ok = - onAdd && - onAdd( - { - ...defMachine, - ...(values as IMachine), - id: uniqid(), - }, - false - ) + correctFormValues(values) + let m = Machine.deSerial(values) + const ok = onAdd && onAdd(m, false) if (ok) { form.resetFields() } @@ -116,24 +75,13 @@ export default function MachineForm({ } function handleFinish(values: any) { - correctFormValues(values, globalLoginOptions) + correctFormValues(values) + let m = Machine.deSerial(values) if (addNew) { - onAdd && - onAdd( - { - ...defMachine, - ...(values as IMachine), - id: uniqid(), - }, - true - ) + onAdd && onAdd(m, true) } else { - onUpdate && - onUpdate({ - ...defMachine, - ...(values as IMachine), - id: machine!.id, - }) + m.id = machine!.id + onUpdate && onUpdate(m) } } @@ -144,18 +92,8 @@ export default function MachineForm({ const m = machines[machineID] form.setFieldsValue({ - host: m.host, - ssh_port: m.ssh_port, - - isPubKeyAuth: m.isPubKeyAuth, - privateKey: m.privateKey, - privateKeyPassword: m.privateKeyPassword, - - username: m.username, - password: m.password, - - dc: m.dc, - rack: m.rack, + ...m, + name: undefined, }) } diff --git a/web-ui/src/pages/Machines/MachinesTable.tsx b/web-ui/src/pages/Machines/MachinesTable.tsx index f6e72e9846..e0e8d8172c 100644 --- a/web-ui/src/pages/Machines/MachinesTable.tsx +++ b/web-ui/src/pages/Machines/MachinesTable.tsx @@ -1,14 +1,18 @@ import React, { useMemo } from 'react' import { Table, Space, Divider, Popconfirm } from 'antd' -import { IMachine, DEF_SSH_PORT } from './MachineForm' -import { IGlobalLoginOptions, DEF_UESRNAME } from './GlobalLoginOptionsForm' +import { + IGlobalLoginOptions, + DEF_UESRNAME, + Machine, + DEF_SSH_PORT, +} from '_types' interface IMachinesTableProps { globalLoginOptions: IGlobalLoginOptions - machines: { [key: string]: IMachine } - onEdit?: (m: IMachine) => void - onDelete?: (m: IMachine) => void + machines: { [key: string]: Machine } + onEdit?: (m: Machine) => void + onDelete?: (m: Machine) => void } export default function MachinesTable({ diff --git a/web-ui/src/pages/Machines/index.tsx b/web-ui/src/pages/Machines/index.tsx index c37920c4cd..40fb766dbd 100644 --- a/web-ui/src/pages/Machines/index.tsx +++ b/web-ui/src/pages/Machines/index.tsx @@ -1,32 +1,25 @@ import React, { useState, useCallback } from 'react' import { Button, Drawer, Modal, Space } from 'antd' -import { useLocalStorageState } from 'ahooks' import { Root } from '_components' -import { useComps } from '_hooks' +import { useMachines, useComps, useGlobalLoginOptions } from '_hooks' +import { Machine } from '_types' -import MachineForm, { IMachine } from './MachineForm' +import MachineForm from './MachineForm' import MachinesTable from './MachinesTable' -import GlobalLoginOptionsForm, { - IGlobalLoginOptions, -} from './GlobalLoginOptionsForm' +import GlobalLoginOptionsForm from './GlobalLoginOptionsForm' export default function MachinesPage() { const [showForm, setShowForm] = useState(false) - const [curMachine, setCurMachine] = useState(undefined) + const [curMachine, setCurMachine] = useState(undefined) - const [machines, setMachines] = useLocalStorageState<{ - [key: string]: IMachine - }>('machines', {}) + const { machines, setMachineObjs } = useMachines() const { comps, setCompObjs } = useComps() + const { globalLoginOptions, setGlobalLoginOptions } = useGlobalLoginOptions() - const [globalLoginOptions, setGlobalLoginOptions] = useLocalStorageState< - IGlobalLoginOptions - >('global_login_options', {}) - - function handleAddMachine(machine: IMachine, close: boolean) { + function addOrUpdateMachine(machine: Machine): boolean { let dup = Object.values(machines).find((m) => m.host === machine.host) - if (dup !== undefined) { + if (dup && dup.id !== machine.id) { Modal.error({ title: '添加失败', content: `该主机 ${machine.host} 已存在`, @@ -34,8 +27,11 @@ export default function MachinesPage() { return false } - dup = Object.values(machines).find((m) => m.name === machine.name) - if (dup !== undefined) { + dup = Object.values(machines).find( + (m) => + m.fullName(globalLoginOptions) === machine.fullName(globalLoginOptions) + ) + if (dup && dup.id !== machine.id) { Modal.error({ title: '添加失败', content: `该主机 name ${machine.name} 已被使用`, @@ -43,36 +39,31 @@ export default function MachinesPage() { return false } - setMachines({ ...machines, [machine.id]: machine }) + setMachineObjs({ + ...machines, + [machine.id]: machine, + }) + return true + } + + function handleAddMachine(machine: Machine, close: boolean): boolean { + let ret = addOrUpdateMachine(machine) + if (!ret) { + return false + } + if (close) { setShowForm(false) } return true } - function handleUpdateMachine(machine: IMachine) { - // TODO: duplicated with above code - let dup = Object.values(machines).find((m) => m.host === machine.host) - if (dup && dup.id !== machine.id) { - Modal.error({ - title: '添加失败', - content: `该主机 ${machine.host} 已存在`, - }) + function handleUpdateMachine(machine: Machine): boolean { + let ret = addOrUpdateMachine(machine) + if (!ret) { return false } - dup = Object.values(machines).find((m) => m.name === machine.name) - if (dup && dup.id !== machine.id) { - Modal.error({ - title: '添加失败', - content: `该主机 name ${machine.name} 已被使用`, - }) - return false - } - setMachines({ - ...machines, - [machine.id]: machine, - }) setShowForm(false) return true } @@ -82,16 +73,16 @@ export default function MachinesPage() { setShowForm(true) }, []) - const editMachine = useCallback((m: IMachine) => { + const editMachine = useCallback((m: Machine) => { setCurMachine(m) setShowForm(true) }, []) const deleteMachine = useCallback( - (m: IMachine) => { + (m: Machine) => { const newMachines = { ...machines } delete newMachines[m.id] - setMachines(newMachines) + setMachineObjs(newMachines) // delete related component const newComps = { ...comps } @@ -103,7 +94,7 @@ export default function MachinesPage() { } setCompObjs(newComps) }, - [machines, setMachines, comps, setCompObjs] + [machines, setMachineObjs, comps, setCompObjs] ) return ( diff --git a/web-ui/src/types/index.ts b/web-ui/src/types/index.ts index 78c4331f76..1e2e420b63 100644 --- a/web-ui/src/types/index.ts +++ b/web-ui/src/types/index.ts @@ -1,2 +1,3 @@ +export * from './machine' export * from './comps' export * from './misc' diff --git a/web-ui/src/types/machine.ts b/web-ui/src/types/machine.ts new file mode 100644 index 0000000000..bf6268c865 --- /dev/null +++ b/web-ui/src/types/machine.ts @@ -0,0 +1,52 @@ +import uniqid from 'uniqid' + +export const DEF_UESRNAME = 'root' +export interface IGlobalLoginOptions { + username?: string + password?: string + privateKey?: string + privateKeyPassword?: string +} + +////////////////////////// + +export type MachineMap = { + [key: string]: Machine +} + +export const DEF_SSH_PORT = 22 +export class Machine { + id: string + host: string = '' + ssh_port?: number + name?: string + + isPubKeyAuth: boolean = true + privateKey?: string + privateKeyPassword?: string + + username?: string + password?: string + + dc?: string + rack?: string + + constructor() { + this.id = uniqid() + } + + static deSerial(obj: any): Machine { + let m = new Machine() + Object.assign(m, obj) + return m + } + + public fullName(globalLoginOptions: IGlobalLoginOptions): string { + if (this.name) { + return this.name + } + return `${this.username || globalLoginOptions.username || DEF_UESRNAME}@${ + this.host + }` + } +} From 07647861157845638af3a63b5c9cfe6dba12041f Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 18:31:07 +0800 Subject: [PATCH 084/126] refine --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 14 +------- web-ui/src/pages/Clusters/index.tsx | 9 +---- .../src/pages/Deployment/DeploymentTable.tsx | 36 +++++++++---------- web-ui/src/pages/Machines/MachinesTable.tsx | 15 +++----- web-ui/src/pages/Machines/index.tsx | 2 +- web-ui/src/types/comps.ts | 2 +- web-ui/src/types/machine.ts | 18 +++++++--- web-ui/src/types/misc.ts | 19 ++++++++++ 8 files changed, 59 insertions(+), 56 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index d1518afea5..ba1798a4b7 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -13,19 +13,7 @@ import { } from '_apis' import { Root } from '_components' import { useComps } from '_hooks' - -import { ICluster } from '.' - -export interface IClusterInstInfo { - id: string - role: string - host: string - ports: string - os_arch: string - status: string - data_dir: string - deploy_dir: string -} +import { ICluster, IClusterInstInfo } from '_types' export default function ClusterDetailPage() { const navigate = useNavigate() diff --git a/web-ui/src/pages/Clusters/index.tsx b/web-ui/src/pages/Clusters/index.tsx index d6ba4ce401..056f0eaa72 100644 --- a/web-ui/src/pages/Clusters/index.tsx +++ b/web-ui/src/pages/Clusters/index.tsx @@ -5,14 +5,7 @@ import { useSessionStorageState } from 'ahooks' import { getClusterList } from '_apis' import { Root } from '_components' - -export interface ICluster { - name: string - user: string - version: string - path: string - private_key: string -} +import { ICluster } from '_types' export default function ClustersPage() { const [clustersList, setClustersList] = useSessionStorageState( diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index 6c424220ef..94d22e61fd 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -6,18 +6,19 @@ import { BaseComp, COMP_TYPES_ARR, CompTypes, - DEF_UESRNAME, Machine, - DEF_SSH_PORT, MachineMap, CompMap, } from '_types' import { useGlobalLoginOptions } from '_hooks' +type MachineOrComp = Machine | BaseComp + interface IDeploymentTableProps { forScaleOut: boolean // deploy or scale out machines: MachineMap components: CompMap + onAddComponent?: ( machine: Machine, componentType: CompTypes, @@ -32,6 +33,7 @@ export default function DeploymentTable({ forScaleOut, machines, components, + onAddComponent, onEditComponent, onDeleteComponent, @@ -40,7 +42,7 @@ export default function DeploymentTable({ const { globalLoginOptions } = useGlobalLoginOptions() const dataSource = useMemo(() => { - let machinesAndComps: (Machine | BaseComp)[] = [] + let machinesAndComps: MachineOrComp[] = [] const sortedMachines = Object.values(machines).sort((a, b) => a.host > b.host ? 1 : -1 ) @@ -54,13 +56,11 @@ export default function DeploymentTable({ } }) if (respondComps.length > 0) { - respondComps.sort((a: any, b: any) => { + respondComps.sort((a, b) => { let delta delta = a.priority - b.priority if (delta === 0) { - delta = - (a.port || a.tcp_port || a.client_port || a.web_port || 0) - - (b.port || b.tcp_port || b.client_port || b.web_port || 0) + delta = a.symbolPort() - b.symbolPort() } return delta }) @@ -75,9 +75,9 @@ export default function DeploymentTable({ { title: '目标机器 / 组件', key: 'target_machine_component', - render: (text: any, rec: any) => { - if (rec.host) { - return `${rec.name} (${rec.host})` + render: (text: any, rec: MachineOrComp) => { + if (rec instanceof Machine) { + return `${rec.fullMachineName(globalLoginOptions)} (${rec.host})` } return (
@@ -93,11 +93,11 @@ export default function DeploymentTable({ { title: '信息', key: 'information', - render: (text: any, rec: any) => { - if (rec.host) { - return `SSH Port=${rec.ssh_port || DEF_SSH_PORT}, User=${ - rec.username || globalLoginOptions.username || DEF_UESRNAME - }, DC=${rec.dc}, Rack=${rec.rack}` + render: (text: any, rec: MachineOrComp) => { + if (rec instanceof Machine) { + return `SSH Port=${rec.port()}, User=${rec.userName( + globalLoginOptions + )}, DC=${rec.dc}, Rack=${rec.rack}` } return `Port=${rec.ports()}, Path=${rec.allPathsPrefix()}` }, @@ -105,8 +105,8 @@ export default function DeploymentTable({ { title: '操作', key: 'action', - render: (text: any, rec: any) => { - if (rec.host) { + render: (text: any, rec: MachineOrComp) => { + if (rec instanceof Machine) { return ( - `${rec.host}:${rec.ssh_port || DEF_SSH_PORT}`, + render: (text: any, rec: Machine) => rec.address(), }, { title: '登录用户', key: 'username', - render: (text: any, rec: any) => - `${rec.username || globalLoginOptions.username || DEF_UESRNAME}`, + render: (text: any, rec: Machine) => rec.userName(globalLoginOptions), }, { title: '使用公钥登录', @@ -78,7 +71,7 @@ export default function MachinesTable({ ), }, ] - }, [onEdit, onDelete, globalLoginOptions.username]) + }, [onEdit, onDelete, globalLoginOptions]) return (
- m.fullName(globalLoginOptions) === machine.fullName(globalLoginOptions) + m.fullMachineName(globalLoginOptions) === machine.fullMachineName(globalLoginOptions) ) if (dup && dup.id !== machine.id) { Modal.error({ diff --git a/web-ui/src/types/comps.ts b/web-ui/src/types/comps.ts index 0481be98ea..0db99b11e3 100644 --- a/web-ui/src/types/comps.ts +++ b/web-ui/src/types/comps.ts @@ -304,7 +304,7 @@ export class GrafanaComp extends BaseComp { } public ports() { - return `${this.port || DEF_PROM_PORT}` + return `${this.port || DEF_GRAFANA_PORT}` } public increasePorts(comp: BaseComp) { diff --git a/web-ui/src/types/machine.ts b/web-ui/src/types/machine.ts index bf6268c865..52e5c276d2 100644 --- a/web-ui/src/types/machine.ts +++ b/web-ui/src/types/machine.ts @@ -41,12 +41,22 @@ export class Machine { return m } - public fullName(globalLoginOptions: IGlobalLoginOptions): string { + public userName(globalLoginOptions: IGlobalLoginOptions) { + return `${this.username || globalLoginOptions.username || DEF_UESRNAME}` + } + + public port() { + return this.ssh_port || DEF_SSH_PORT + } + + public address() { + return `${this.host}:${this.port()}` + } + + public fullMachineName(globalLoginOptions: IGlobalLoginOptions): string { if (this.name) { return this.name } - return `${this.username || globalLoginOptions.username || DEF_UESRNAME}@${ - this.host - }` + return `${this.userName(globalLoginOptions)}@${this.host}` } } diff --git a/web-ui/src/types/misc.ts b/web-ui/src/types/misc.ts index a97149424e..f5269472f8 100644 --- a/web-ui/src/types/misc.ts +++ b/web-ui/src/types/misc.ts @@ -13,3 +13,22 @@ export interface IOperationStatus { steps: string[] err_msg: string } + +export interface ICluster { + name: string + user: string + version: string + path: string + private_key: string +} + +export interface IClusterInstInfo { + id: string + role: string + host: string + ports: string + os_arch: string + status: string + data_dir: string + deploy_dir: string +} From f010f10fbf771c52e63f8315a478ee50991d7e75 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 19:32:52 +0800 Subject: [PATCH 085/126] refine --- web-ui/src/pages/Clusters/ClusterDetail.tsx | 20 ++++++------- web-ui/src/pages/Deployment/CompsManager.tsx | 6 ++-- .../src/pages/Deployment/DeploymentTable.tsx | 2 +- .../pages/Machines/GlobalLoginOptionsForm.tsx | 4 +-- web-ui/src/pages/Machines/MachineForm.tsx | 29 ++++++++++--------- web-ui/src/pages/Machines/MachinesTable.tsx | 3 +- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/web-ui/src/pages/Clusters/ClusterDetail.tsx index ba1798a4b7..aa31617127 100644 --- a/web-ui/src/pages/Clusters/ClusterDetail.tsx +++ b/web-ui/src/pages/Clusters/ClusterDetail.tsx @@ -149,10 +149,6 @@ export default function ClusterDetailPage() { navigate(`/clusters/${clusterName}/scaleout`) } - if (cluster === undefined) { - return - } - return (
@@ -179,13 +175,15 @@ export default function ClusterDetailPage() { 销毁集群
-
-

Name: {cluster.name}

-

User: {cluster.user}

-

Version: {cluster.version}

-

Path: {cluster.path}

-

PrivateKey: {cluster.private_key}

-
+ {cluster && ( +
+

Name: {cluster.name}

+

User: {cluster.user}

+

Version: {cluster.version}

+

Path: {cluster.path}

+

PrivateKey: {cluster.private_key}

+
+ )}
(undefined) + const [curComp, setCurComp] = useState(undefined) const [previewYaml, setPreviewYaml] = useState(false) const [deployReq, setDeployReq] = useLocalStorageState( 'deploy_req', { cluster_name: '', tidb_version: '' } ) - - const { globalLoginOptions } = useGlobalLoginOptions() - const [, setCurScaleOutNodes] = useLocalStorageState( 'cur_scale_out_nodes', {} diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/web-ui/src/pages/Deployment/DeploymentTable.tsx index 94d22e61fd..aada2ed05d 100644 --- a/web-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/web-ui/src/pages/Deployment/DeploymentTable.tsx @@ -97,7 +97,7 @@ export default function DeploymentTable({ if (rec instanceof Machine) { return `SSH Port=${rec.port()}, User=${rec.userName( globalLoginOptions - )}, DC=${rec.dc}, Rack=${rec.rack}` + )}, DC=${rec.dc || ''}, Rack=${rec.rack || ''}` } return `Port=${rec.ports()}, Path=${rec.allPathsPrefix()}` }, diff --git a/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx b/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx index 9789745dad..a9a1c570a6 100644 --- a/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx +++ b/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx @@ -29,10 +29,10 @@ export default function GlobalLoginOptionsForm({ initialValues={globalLoginOptions} > - + - + diff --git a/web-ui/src/pages/Machines/MachineForm.tsx b/web-ui/src/pages/Machines/MachineForm.tsx index 8efffa0046..04db87c6ec 100644 --- a/web-ui/src/pages/Machines/MachineForm.tsx +++ b/web-ui/src/pages/Machines/MachineForm.tsx @@ -20,18 +20,20 @@ import { function correctFormValues(values: any) { for (const key of Object.keys(values)) { - if (key !== 'isPubKeyAuth') { - values[key] = values[key].trim() - if (values[key] === '') { - values[key] = undefined + let v = values[key] + if (key !== 'isPubKeyAuth' && v !== undefined) { + v = v.trim() + if (v === '') { + v = undefined } } - if (key === 'ssh_port' && values[key] !== undefined) { - values[key] = parseInt(values[key]) - if (values[key] === 0) { - values[key] = undefined + if (key === 'ssh_port' && v !== undefined) { + v = parseInt(v) + if (v <= 0) { + v = undefined } } + values[key] = v } } @@ -115,18 +117,19 @@ export default function MachineForm({ showSearch filterOption={(input, option) => { const m = machines[option?.key!] - const v = `${m.name} ${m.username}@${m.host}:${m.ssh_port}` + const v = `${m.name} ${m.userName( + globalLoginOptions + )}@${m.address()}` return v.indexOf(input) > -1 }} - optionLabelProp="label" > {Object.values(machines).map((m) => { return ( - -
{m.name}
+ +
{m.fullMachineName(globalLoginOptions)}
- {m.username}@{m.host}:{m.ssh_port} + {m.userName(globalLoginOptions)}@{m.address()}
diff --git a/web-ui/src/pages/Machines/MachinesTable.tsx b/web-ui/src/pages/Machines/MachinesTable.tsx index f002017aca..47cbfac99d 100644 --- a/web-ui/src/pages/Machines/MachinesTable.tsx +++ b/web-ui/src/pages/Machines/MachinesTable.tsx @@ -24,8 +24,9 @@ export default function MachinesTable({ return [ { title: '机器名字', - dataIndex: 'name', key: 'name', + render: (text: any, rec: Machine) => + rec.fullMachineName(globalLoginOptions), }, { title: '地址', From c3b82a158e97452c7030ee0e5d049fad80fd692c Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 22:17:02 +0800 Subject: [PATCH 086/126] refine --- web-ui/src/pages/Deployment/EditCompForm.tsx | 12 +- web-ui/src/pages/Deployment/TopoPreview.tsx | 16 ++- web-ui/src/pages/Machines/MachineForm.tsx | 121 +++++++++++-------- web-ui/src/pages/Machines/MachinesTable.tsx | 20 +-- 4 files changed, 100 insertions(+), 69 deletions(-) diff --git a/web-ui/src/pages/Deployment/EditCompForm.tsx b/web-ui/src/pages/Deployment/EditCompForm.tsx index 65e461693b..c25c2663b1 100644 --- a/web-ui/src/pages/Deployment/EditCompForm.tsx +++ b/web-ui/src/pages/Deployment/EditCompForm.tsx @@ -32,9 +32,7 @@ function correctFormValues(values: any) { if (typeof v !== 'string') { continue } - if (typeof v === 'string') { - v = v.trim() - } + v = v.trim() if (v === '') { values[key] = undefined continue @@ -42,10 +40,12 @@ function correctFormValues(values: any) { if (key === 'deploy_dir_prefix' || key === 'data_dir_prefix') { continue } - values[key] = parseInt(v) - if (values[key] <= 0) { - values[key] = undefined + // kinds of port, number + v = parseInt(v) + if (v <= 0) { + v = undefined } + values[key] = v } } diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index 1a4b1edbb3..46b4c97de9 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -69,10 +69,10 @@ export function genTopo( m[key] = (comp as any)[key] } if (key === 'deploy_dir_prefix' && comp[key] !== undefined) { - m[key] = comp.deployPathFull() + m['deploy_dir'] = comp.deployPathFull() } if (key === 'data_dir_prefix' && comp[key] !== undefined) { - m[key] = comp.dataPathFull() + m['data_dir'] = comp.dataPathFull() } } @@ -84,7 +84,17 @@ export function genTopo( } topo[topoKey].push(m) - topo[topoKey].sort((a: any, b: any) => (a.host > b.host ? 1 : -1)) + topo[topoKey].sort((a: any, b: any) => { + if (a.host > b.host) { + return 1 + } + if (a.host < b.host) { + return -1 + } + const aPort = a.port || a.tcp_port || a.client_port || a.web_port || 0 + const bPort = b.port || b.tcp_port || b.client_port || b.web_port || 0 + return aPort - bPort + }) } } return topo diff --git a/web-ui/src/pages/Machines/MachineForm.tsx b/web-ui/src/pages/Machines/MachineForm.tsx index 04db87c6ec..271695f9a6 100644 --- a/web-ui/src/pages/Machines/MachineForm.tsx +++ b/web-ui/src/pages/Machines/MachineForm.tsx @@ -18,14 +18,21 @@ import { DEF_SSH_PORT, } from '_types' -function correctFormValues(values: any) { +function correctFormValues(values: any): any { + let newValues = {} as any for (const key of Object.keys(values)) { let v = values[key] - if (key !== 'isPubKeyAuth' && v !== undefined) { - v = v.trim() - if (v === '') { - v = undefined - } + newValues[key] = v + + if (v === undefined) { + continue + } + if (typeof v !== 'string') { + continue + } + v = v.trim() + if (v === '') { + v = undefined } if (key === 'ssh_port' && v !== undefined) { v = parseInt(v) @@ -33,8 +40,9 @@ function correctFormValues(values: any) { v = undefined } } - values[key] = v + newValues[key] = v } + return newValues } interface MachineFormProps { @@ -73,12 +81,20 @@ export default function MachineForm({ form.resetFields() } }) - .catch((_err) => {}) + .catch((_err) => { + console.log(_err) + }) } function handleFinish(values: any) { - correctFormValues(values) - let m = Machine.deSerial(values) + let newValues + if (addNew) { + newValues = correctFormValues(values) + } else { + newValues = correctFormValues({ ...machine, ...values }) + } + + let m = Machine.deSerial(newValues) if (addNew) { onAdd && onAdd(m, true) } else { @@ -159,46 +175,51 @@ export default function MachineForm({ - - - - - 使用私钥登录 - - - prevValues.isPubKeyAuth !== currentValues.isPubKeyAuth - } - > - {({ getFieldValue }) => { - return getFieldValue('isPubKeyAuth') ? ( - <> - - - - - - - - ) : ( - - - - ) - }} - + + {false && ( + <> + + + + + 使用私钥登录 + + + prevValues.isPubKeyAuth !== currentValues.isPubKeyAuth + } + > + {({ getFieldValue }) => { + return getFieldValue('isPubKeyAuth') ? ( + <> + + + + + + + + ) : ( + + + + ) + }} + + + )} diff --git a/web-ui/src/pages/Machines/MachinesTable.tsx b/web-ui/src/pages/Machines/MachinesTable.tsx index 47cbfac99d..20ccbf1cf4 100644 --- a/web-ui/src/pages/Machines/MachinesTable.tsx +++ b/web-ui/src/pages/Machines/MachinesTable.tsx @@ -33,16 +33,16 @@ export default function MachinesTable({ key: 'address', render: (text: any, rec: Machine) => rec.address(), }, - { - title: '登录用户', - key: 'username', - render: (text: any, rec: Machine) => rec.userName(globalLoginOptions), - }, - { - title: '使用公钥登录', - key: 'isPubKeyAuth', - render: (text: any, rec: any) => (rec.isPubKeyAuth ? '是' : '否'), - }, + // { + // title: '登录用户', + // key: 'username', + // render: (text: any, rec: Machine) => rec.userName(globalLoginOptions), + // }, + // { + // title: '使用公钥登录', + // key: 'isPubKeyAuth', + // render: (text: any, rec: any) => (rec.isPubKeyAuth ? '是' : '否'), + // }, { title: '标签: DC', key: 'label_dc', From 5af2a181e0ac56ceca0fa1d3af7dfe2653d5c4dd Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 23:01:54 +0800 Subject: [PATCH 087/126] refine ListCluster --- components/cluster/command/list.go | 2 +- components/dm/command/list.go | 2 +- components/web/main.go | 2 +- pkg/cluster/manager.go | 41 +++++++++++++++++++----------- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/components/cluster/command/list.go b/components/cluster/command/list.go index 0c0fcdc533..3f587eb84f 100644 --- a/components/cluster/command/list.go +++ b/components/cluster/command/list.go @@ -22,7 +22,7 @@ func newListCmd() *cobra.Command { Use: "list", Short: "List all clusters", RunE: func(cmd *cobra.Command, args []string) error { - _, err := manager.ListCluster() + err := manager.ListCluster() return err }, } diff --git a/components/dm/command/list.go b/components/dm/command/list.go index 0c0fcdc533..3f587eb84f 100644 --- a/components/dm/command/list.go +++ b/components/dm/command/list.go @@ -22,7 +22,7 @@ func newListCmd() *cobra.Command { Use: "list", Short: "List all clusters", RunE: func(cmd *cobra.Command, args []string) error { - _, err := manager.ListCluster() + err := manager.ListCluster() return err }, } diff --git a/components/web/main.go b/components/web/main.go index 815eae6838..6f8413fb04 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -127,7 +127,7 @@ func statusHandler(c *gin.Context) { } func clustersHandler(c *gin.Context) { - clusters, err := manager.ListCluster() + clusters, err := manager.GetClusterList() if err != nil { _ = c.Error(err) return diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 58c9ad34a6..212afaa26b 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -270,35 +270,47 @@ type Cluster struct { } // ListCluster list the clusters. -func (m *Manager) ListCluster() ([]Cluster, error) { - names, err := m.specManager.List() +func (m *Manager) ListCluster() error { + clusters, err := m.GetClusterList() if err != nil { - return nil, perrs.AddStack(err) + return err } - var clusters []Cluster = []Cluster{} - clusterTable := [][]string{ // Header {"Name", "User", "Version", "Path", "PrivateKey"}, } + for _, v := range clusters { + clusterTable = append(clusterTable, []string{ + v.Name, + v.User, + v.Version, + v.Path, + v.PrivateKey, + }) + } + + cliutil.PrintTable(clusterTable, true) + return nil +} + +// GetClusterList get the clusters list. +func (m *Manager) GetClusterList() ([]Cluster, error) { + names, err := m.specManager.List() + if err != nil { + return nil, perrs.AddStack(err) + } + + var clusters = []Cluster{} for _, name := range names { metadata, err := m.meta(name) if err != nil && !errors.Is(perrs.Cause(err), meta.ErrValidate) { - return clusters, perrs.Trace(err) + return nil, perrs.Trace(err) } base := metadata.GetBaseMeta() - clusterTable = append(clusterTable, []string{ - name, - base.User, - base.Version, - m.specManager.Path(name), - m.specManager.Path(name, "ssh", "id_rsa"), - }) - clusters = append(clusters, Cluster{ Name: name, User: base.User, @@ -308,7 +320,6 @@ func (m *Manager) ListCluster() ([]Cluster, error) { }) } - cliutil.PrintTable(clusterTable, true) return clusters, nil } From ee6ea25529fe256669e0d7d351a62dbef9d8d742 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 23:12:27 +0800 Subject: [PATCH 088/126] refine Display --- components/cluster/command/display.go | 2 +- components/dm/command/display.go | 2 +- components/web/main.go | 2 +- pkg/cluster/manager.go | 62 ++++++++++++++------------- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/components/cluster/command/display.go b/components/cluster/command/display.go index 9cb4ec0651..fa0aacd6f3 100644 --- a/components/cluster/command/display.go +++ b/components/cluster/command/display.go @@ -58,7 +58,7 @@ func newDisplayCmd() *cobra.Command { return displayDashboardInfo(clusterName) } - _, err = manager.Display(clusterName, gOpt) + err = manager.Display(clusterName, gOpt) if err != nil { return perrs.AddStack(err) } diff --git a/components/dm/command/display.go b/components/dm/command/display.go index e1a120020c..faeebf97b8 100644 --- a/components/dm/command/display.go +++ b/components/dm/command/display.go @@ -40,7 +40,7 @@ func newDisplayCmd() *cobra.Command { clusterName = args[0] - _, err := manager.Display(clusterName, gOpt) + err := manager.Display(clusterName, gOpt) if err != nil { return perrs.AddStack(err) } diff --git a/components/web/main.go b/components/web/main.go index 6f8413fb04..acd2411cd7 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -137,7 +137,7 @@ func clustersHandler(c *gin.Context) { func clusterHandler(c *gin.Context) { clusterName := c.Param("clusterName") - instInfos, err := manager.Display(clusterName, operator.Options{ + instInfos, err := manager.GetClusterTopology(clusterName, operator.Options{ SSHTimeout: 5, OptTimeout: 120, APITimeout: 300, diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 212afaa26b..43b632aa4e 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -535,14 +535,13 @@ type InstInfo struct { } // Display cluster meta and topology. -func (m *Manager) Display(clusterName string, opt operator.Options) ([]InstInfo, error) { - metadata, err := m.meta(clusterName) - if err != nil && !errors.Is(perrs.Cause(err), meta.ErrValidate) && - !errors.Is(perrs.Cause(err), spec.ErrNoTiSparkMaster) { - return nil, perrs.AddStack(err) +func (m *Manager) Display(clusterName string, opt operator.Options) error { + clusterInstInfos, err := m.GetClusterTopology(clusterName, opt) + if err != nil { + return err } - topo := metadata.GetTopology() + metadata, _ := m.meta(clusterName) base := metadata.GetBaseMeta() // display cluster meta @@ -555,6 +554,33 @@ func (m *Manager) Display(clusterName string, opt operator.Options) ([]InstInfo, // Header {"ID", "Role", "Host", "Ports", "OS/Arch", "Status", "Data Dir", "Deploy Dir"}, } + for _, v := range clusterInstInfos { + clusterTable = append(clusterTable, []string{ + color.CyanString(v.ID), + v.Role, + v.Host, + v.Ports, + v.OsArch, + formatInstanceStatus(v.Status), + v.DataDir, + v.DeployDir, + }) + } + + cliutil.PrintTable(clusterTable, true) + return nil +} + +// GetClusterTopology get the topology of the cluster. +func (m *Manager) GetClusterTopology(clusterName string, opt operator.Options) ([]InstInfo, error) { + metadata, err := m.meta(clusterName) + if err != nil && !errors.Is(perrs.Cause(err), meta.ErrValidate) && + !errors.Is(perrs.Cause(err), spec.ErrNoTiSparkMaster) { + return nil, perrs.AddStack(err) + } + + topo := metadata.GetTopology() + base := metadata.GetBaseMeta() ctx := task.NewContext() err = ctx.SetSSHKeySet(m.specManager.Path(clusterName, "ssh", "id_rsa"), @@ -606,16 +632,6 @@ func (m *Manager) Display(clusterName string, opt operator.Options) ([]InstInfo, } } } - clusterTable = append(clusterTable, []string{ - color.CyanString(ins.ID()), - ins.Role(), - ins.GetHost(), - utils.JoinInt(ins.UsedPorts(), "/"), - cliutil.OsArch(ins.OS(), ins.Arch()), - formatInstanceStatus(status), - dataDir, - deployDir, - }) clusterInstInfos = append(clusterInstInfos, InstInfo{ ID: ins.ID(), @@ -630,18 +646,6 @@ func (m *Manager) Display(clusterName string, opt operator.Options) ([]InstInfo, } } - // Sort by role,host,ports - sort.Slice(clusterTable[1:], func(i, j int) bool { - lhs, rhs := clusterTable[i+1], clusterTable[j+1] - // column: 1 => role, 2 => host, 3 => ports - for _, col := range []int{1, 2} { - if lhs[col] != rhs[col] { - return lhs[col] < rhs[col] - } - } - return lhs[3] < rhs[3] - }) - sort.Slice(clusterInstInfos, func(i, j int) bool { lhs, rhs := clusterInstInfos[i], clusterInstInfos[j] if lhs.Role != rhs.Role { @@ -653,8 +657,6 @@ func (m *Manager) Display(clusterName string, opt operator.Options) ([]InstInfo, return lhs.Ports < rhs.Ports }) - cliutil.PrintTable(clusterTable, true) - return clusterInstInfos, nil } From e713d2edd59558b1ad6d5f8408af0fa1b020150e Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Tue, 1 Sep 2020 23:50:35 +0800 Subject: [PATCH 089/126] fix deploy progress --- pkg/cluster/task/step.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/cluster/task/step.go b/pkg/cluster/task/step.go index 8f43b040e0..dfedf7bc0e 100644 --- a/pkg/cluster/task/step.go +++ b/pkg/cluster/task/step.go @@ -77,7 +77,12 @@ func (s *StepDisplay) resetAsMultiBarItem(b *progress.MultiBar) { // Execute implements the Task interface func (s *StepDisplay) Execute(ctx *Context) error { if s.hidden { - return s.inner.Execute(ctx) + s.progress = 10 + err := s.inner.Execute(ctx) + if err == nil { + s.progress = 100 + } + return err } if singleBar, ok := s.progressBar.(*progress.SingleBar); ok { From d9eb614bb39bed212a9ddbcca16bb79d95a2cdcc Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Wed, 2 Sep 2020 00:22:52 +0800 Subject: [PATCH 090/126] refine --- components/cluster/command/list.go | 3 +-- components/dm/command/list.go | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/components/cluster/command/list.go b/components/cluster/command/list.go index 3f587eb84f..363badb33e 100644 --- a/components/cluster/command/list.go +++ b/components/cluster/command/list.go @@ -22,8 +22,7 @@ func newListCmd() *cobra.Command { Use: "list", Short: "List all clusters", RunE: func(cmd *cobra.Command, args []string) error { - err := manager.ListCluster() - return err + return manager.ListCluster() }, } return cmd diff --git a/components/dm/command/list.go b/components/dm/command/list.go index 3f587eb84f..363badb33e 100644 --- a/components/dm/command/list.go +++ b/components/dm/command/list.go @@ -22,8 +22,7 @@ func newListCmd() *cobra.Command { Use: "list", Short: "List all clusters", RunE: func(cmd *cobra.Command, args []string) error { - err := manager.ListCluster() - return err + return manager.ListCluster() }, } return cmd From 0f5e2e33beeb9e0e9f30da417faea98c3a9b465e Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Wed, 2 Sep 2020 22:57:04 +0800 Subject: [PATCH 091/126] support global dir --- web-ui/src/hooks/index.ts | 1 + web-ui/src/hooks/useGlobalDir.ts | 20 +++++ web-ui/src/pages/Deployment/CompsManager.tsx | 32 +++++++- .../src/pages/Deployment/DeploymentTable.tsx | 7 +- web-ui/src/pages/Deployment/EditCompForm.tsx | 13 +-- web-ui/src/pages/Deployment/GlobalDirForm.tsx | 62 ++++++++++++++ web-ui/src/pages/Deployment/TopoPreview.tsx | 33 ++++---- web-ui/src/types/comps.ts | 81 ++++++++++++++----- 8 files changed, 203 insertions(+), 46 deletions(-) create mode 100644 web-ui/src/hooks/useGlobalDir.ts create mode 100644 web-ui/src/pages/Deployment/GlobalDirForm.tsx diff --git a/web-ui/src/hooks/index.ts b/web-ui/src/hooks/index.ts index 4f70f517f9..880bda015a 100644 --- a/web-ui/src/hooks/index.ts +++ b/web-ui/src/hooks/index.ts @@ -1,3 +1,4 @@ export * from './useMachines' export * from './useComps' export * from './useGlobalLoginOptions' +export * from './useGlobalDir' diff --git a/web-ui/src/hooks/useGlobalDir.ts b/web-ui/src/hooks/useGlobalDir.ts new file mode 100644 index 0000000000..b283085ffd --- /dev/null +++ b/web-ui/src/hooks/useGlobalDir.ts @@ -0,0 +1,20 @@ +import { useLocalStorageState } from 'ahooks' + +import { GlobalDir, IGlobalDir } from '_types' +import { useMemo } from 'react' + +export function useGlobalDir() { + const [globalDirObj, setGlobalDirObj] = useLocalStorageState( + 'global_dir', + {} + ) + + const globalDir = useMemo(() => { + return GlobalDir.deSerial(globalDirObj) + }, [globalDirObj]) + + return { + globalDir, + setGlobalDirObj, + } +} diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/web-ui/src/pages/Deployment/CompsManager.tsx index a060fddeb9..ad56707e4f 100644 --- a/web-ui/src/pages/Deployment/CompsManager.tsx +++ b/web-ui/src/pages/Deployment/CompsManager.tsx @@ -6,12 +6,18 @@ import { useNavigate } from 'react-router-dom' import { Root } from '_components' import { BaseComp, CompTypes, Machine } from '_types' -import { useComps, useGlobalLoginOptions, useMachines } from '_hooks' +import { + useComps, + useGlobalLoginOptions, + useMachines, + useGlobalDir, +} from '_hooks' import { deployCluster, scaleOutCluster } from '_apis' import DeploymentTable from './DeploymentTable' import EditCompForm from './EditCompForm' import TopoPreview, { genTopo } from './TopoPreview' +import GlobalDirForm from './GlobalDirForm' // TODO: fetch from API const TIDB_VERSIONS = [ @@ -56,6 +62,7 @@ export default function CompsManager({ 'cur_scale_out_nodes', {} ) + const { globalDir, setGlobalDirObj } = useGlobalDir() const navigate = useNavigate() @@ -117,7 +124,9 @@ export default function CompsManager({ ) function handleDeploy(values: any) { - const topoYaml = yaml.stringify(genTopo(machines, comps, forScaleOut)) + const topoYaml = yaml.stringify( + genTopo(globalDir, machines, comps, forScaleOut) + ) deployCluster({ ...values, topo_yaml: topoYaml, @@ -152,7 +161,9 @@ export default function CompsManager({ }) // scale out - const topoYaml = yaml.stringify(genTopo(machines, comps, forScaleOut)) + const topoYaml = yaml.stringify( + genTopo(globalDir, machines, comps, forScaleOut) + ) scaleOutCluster(clusterName!, { topo_yaml: topoYaml, global_login_options: globalLoginOptions, @@ -209,11 +220,19 @@ export default function CompsManager({ )} +
+ +
+
setCurComp(rec)} onDeleteComponent={handleDeleteComponent} @@ -229,7 +248,11 @@ export default function CompsManager({ onClose={() => setCurComp(undefined)} destroyOnClose={true} > - + setPreviewYaml(false)} > void } export default function EditCompForm({ + globalDir, comp, onUpdateComp, }: IEditCompFormProps) { @@ -80,9 +81,9 @@ export default function EditCompForm({ name="deploy_dir_prefix" style={{ marginBottom: 0 }} > - + -

{comp.deployPathFull()}

+

{comp.deployPathFull(globalDir)}

{['TiDB', 'Grafana'].indexOf(componentType) === -1 && ( @@ -91,9 +92,9 @@ export default function EditCompForm({ name="data_dir_prefix" style={{ marginBottom: 0 }} > - + -

{comp.dataPathFull()}

+

{comp.dataPathFull(globalDir)}

)} {componentType === 'TiDB' && ( diff --git a/web-ui/src/pages/Deployment/GlobalDirForm.tsx b/web-ui/src/pages/Deployment/GlobalDirForm.tsx new file mode 100644 index 0000000000..e2d155a691 --- /dev/null +++ b/web-ui/src/pages/Deployment/GlobalDirForm.tsx @@ -0,0 +1,62 @@ +import React, { useState } from 'react' +import { Form, Input, Button, message, Space } from 'antd' + +import { GlobalDir, DEF_DEPLOY_DIR_PREFIX, DEF_DATA_DIR_PREFIX } from '_types' + +export interface IGlobalDirFormProps { + globalDir: GlobalDir + onUpdateGlobalDir: (dirs: GlobalDir) => void +} + +export default function GlobalDirForm({ + globalDir, + onUpdateGlobalDir, +}: IGlobalDirFormProps) { + const [btnEnable, setBtnEnable] = useState(false) + + function handleFinish(values: any) { + onUpdateGlobalDir(values) + setBtnEnable(false) + message.success('全局默认目录已修改') + } + + return ( +
setBtnEnable(true)} + onFinish={handleFinish} + layout="inline" + title="全局默认目录" + initialValues={globalDir} + > + + + + + + {globalDir.deployPathFull()} + + + + + + + + {globalDir.dataPathFull()} + + + + + + + ) +} diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/web-ui/src/pages/Deployment/TopoPreview.tsx index 46b4c97de9..8472548d3c 100644 --- a/web-ui/src/pages/Deployment/TopoPreview.tsx +++ b/web-ui/src/pages/Deployment/TopoPreview.tsx @@ -1,21 +1,17 @@ import React, { useMemo } from 'react' import yaml from 'yaml' -import { - DEF_DEPLOY_DIR_PREFIX, - DEF_DATA_DIR_PREFIX, - COMP_TYPES_ARR, - CompMap, - MachineMap, -} from '_types' +import { COMP_TYPES_ARR, CompMap, MachineMap, GlobalDir } from '_types' interface ITopoPreviewProps { + globalDir: GlobalDir machines: MachineMap components: CompMap forScaleOut: boolean } export function genTopo( + globalDir: GlobalDir, machines: MachineMap, components: CompMap, forScaleOut: boolean @@ -28,8 +24,8 @@ export function genTopo( topo = { global: { user: 'tidb', - deploy_dir: DEF_DEPLOY_DIR_PREFIX, - data_dir: DEF_DATA_DIR_PREFIX, + deploy_dir: globalDir.deployPathPrefix(), + data_dir: globalDir.dataPathPrefix(), }, server_configs: { // tidb: { @@ -69,17 +65,20 @@ export function genTopo( m[key] = (comp as any)[key] } if (key === 'deploy_dir_prefix' && comp[key] !== undefined) { - m['deploy_dir'] = comp.deployPathFull() + m['deploy_dir'] = comp.deployPathFull(globalDir) } if (key === 'data_dir_prefix' && comp[key] !== undefined) { - m['data_dir'] = comp.dataPathFull() + m['data_dir'] = comp.dataPathFull(globalDir) } } // location labels if (compType === 'TiKV' && (targetMachine.dc || targetMachine.rack)) { m.config = { - 'server.labels': { dc: targetMachine.dc, rack: targetMachine.rack }, + 'server.labels': { + dc: targetMachine.dc || '', + rack: targetMachine.rack || '', + }, } } @@ -101,15 +100,15 @@ export function genTopo( } export default function TopoPreview({ + globalDir, machines, components, forScaleOut, }: ITopoPreviewProps) { - const topo = useMemo(() => genTopo(machines, components, forScaleOut), [ - machines, - components, - forScaleOut, - ]) + const topo = useMemo( + () => genTopo(globalDir, machines, components, forScaleOut), + [globalDir, machines, components, forScaleOut] + ) return (
Date: Wed, 9 Sep 2020 17:53:04 +0800 Subject: [PATCH 092/126] fix compile --- components/web/main.go | 39 +++++++++++++++++++++++++++++---------- pkg/cluster/manager.go | 17 +++++++++-------- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/components/web/main.go b/components/web/main.go index acd2411cd7..1f1d1e7c1a 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -1,6 +1,7 @@ package main import ( + "crypto/tls" "io/ioutil" "net/http" "strings" @@ -10,6 +11,7 @@ import ( "github.com/pingcap/tiup/components/web/uiserver" "github.com/pingcap/tiup/pkg/cluster" + "github.com/pingcap/tiup/pkg/cluster/executor" operator "github.com/pingcap/tiup/pkg/cluster/operation" "github.com/pingcap/tiup/pkg/cluster/spec" "github.com/pingcap/tiup/pkg/cluster/task" @@ -114,7 +116,7 @@ func deployHandler(c *gin.Context) { true, 120, 5, - false, + executor.SSHTypeBuiltin, ) }() @@ -171,8 +173,12 @@ func startClusterHandler(c *gin.Context) { OptTimeout: 120, APITimeout: 300, }, func(b *task.Builder, metadata spec.Metadata) { - tidbMeta := metadata.(*spec.ClusterMeta) - b.UpdateTopology(clusterName, tidbMeta, nil) + b.UpdateTopology( + clusterName, + tidbSpec.Path(clusterName), + metadata.(*spec.ClusterMeta), + nil, /* deleteNodeIds */ + ) }) }() @@ -215,20 +221,33 @@ func scaleInClusterHandler(c *gin.Context) { NativeSSH: false, Force: req.Force, Nodes: req.Nodes} - scale := func(b *task.Builder, imetadata spec.Metadata) { + + // TODO + scale := func(b *task.Builder, imetadata spec.Metadata, tlsCfg *tls.Config) { metadata := imetadata.(*spec.ClusterMeta) + if !gOpt.Force { - b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt). + b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt, tlsCfg). UpdateMeta(clusterName, metadata, operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false)). - UpdateTopology(clusterName, metadata, operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false)) + UpdateTopology( + clusterName, + tidbSpec.Path(clusterName), + metadata, + operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false), /* deleteNodeIds */ + ) } else { - b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt). + b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt, tlsCfg). UpdateMeta(clusterName, metadata, gOpt.Nodes). - UpdateTopology(clusterName, metadata, gOpt.Nodes) + UpdateTopology( + clusterName, + tidbSpec.Path(clusterName), + metadata, + gOpt.Nodes, + ) } } - manager.DoScaleIn(clusterName, true, gOpt.OptTimeout, gOpt.SSHTimeout, gOpt.NativeSSH, gOpt.Force, gOpt.Nodes, scale) + manager.DoScaleIn(clusterName, true, gOpt.OptTimeout, gOpt.SSHTimeout, executor.SSHTypeBuiltin, gOpt.Force, gOpt.Nodes, scale) }() c.Status(http.StatusNoContent) @@ -291,7 +310,7 @@ func scaleOutClusterHandler(c *gin.Context) { true, 120, 5, - false, + executor.SSHTypeBuiltin, ) }() diff --git a/pkg/cluster/manager.go b/pkg/cluster/manager.go index 79eeebcd39..1578c746e7 100644 --- a/pkg/cluster/manager.go +++ b/pkg/cluster/manager.go @@ -573,6 +573,7 @@ func (m *Manager) Display(clusterName string, opt operator.Options) error { } metadata, _ := m.meta(clusterName) + topo := metadata.GetTopology() base := metadata.GetBaseMeta() // display cluster meta cyan := color.New(color.FgCyan, color.Bold) @@ -666,7 +667,7 @@ func (m *Manager) GetClusterTopology(clusterName string, opt operator.Options) ( tlsCfg, err := topo.TLSConfig(m.specManager.Path(clusterName, spec.TLSCertKeyDir)) if err != nil { - return perrs.AddStack(err) + return nil, perrs.AddStack(err) } status := ins.Status(tlsCfg, pdList...) // Query the service status @@ -1140,7 +1141,7 @@ func (m *Manager) DoDeploy( skipConfirm bool, optTimeout int64, sshTimeout int64, - nativeSSH bool, + sshType executor.SSHType, ) { operationInfo = OperationInfo{operationType: operationDeploy, clusterName: clusterName} operationInfo.err = m.Deploy( @@ -1152,7 +1153,7 @@ func (m *Manager) DoDeploy( skipConfirm, optTimeout, sshTimeout, - nativeSSH, + sshType, ) } @@ -1474,10 +1475,10 @@ func (m *Manager) DoScaleIn( skipConfirm bool, optTimeout int64, sshTimeout int64, - nativeSSH bool, + sshType executor.SSHType, force bool, nodes []string, - scale func(builer *task.Builder, metadata spec.Metadata), + scale func(builer *task.Builder, metadata spec.Metadata, tlsCfg *tls.Config), ) { operationInfo = OperationInfo{operationType: operationScaleIn, clusterName: clusterName} operationInfo.err = m.ScaleIn( @@ -1485,7 +1486,7 @@ func (m *Manager) DoScaleIn( skipConfirm, optTimeout, sshTimeout, - nativeSSH, + sshType, force, nodes, scale, @@ -1631,7 +1632,7 @@ func (m *Manager) DoScaleOut( skipConfirm bool, optTimeout int64, sshTimeout int64, - nativeSSH bool, + sshType executor.SSHType, ) { operationInfo = OperationInfo{operationType: operationScaleOut, clusterName: clusterName} operationInfo.err = m.ScaleOut( @@ -1643,7 +1644,7 @@ func (m *Manager) DoScaleOut( skipConfirm, optTimeout, sshTimeout, - nativeSSH, + sshType, ) } From 1d8b1e89ab731006189a85e1c12ccf63832940f0 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 10 Sep 2020 11:45:05 +0800 Subject: [PATCH 093/126] fix pd and alertmanger increasePorts method --- web-ui/src/types/comps.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web-ui/src/types/comps.ts b/web-ui/src/types/comps.ts index 43aa80d253..c3c0c10f04 100644 --- a/web-ui/src/types/comps.ts +++ b/web-ui/src/types/comps.ts @@ -297,8 +297,8 @@ export class PDComp extends BaseComp { public increasePorts(comp: BaseComp) { const c = comp as PDComp - this.client_port = (c.client_port || DEF_PD_CLIENT_PORT) + 1 - this.peer_port = (c.peer_port || DEF_PD_PEER_PORT) + 1 + this.client_port = (c.client_port || DEF_PD_CLIENT_PORT) + 2 + this.peer_port = (c.peer_port || DEF_PD_PEER_PORT) + 2 } } @@ -383,7 +383,7 @@ export class AlertManagerComp extends BaseComp { public increasePorts(comp: BaseComp) { const c = comp as AlertManagerComp - this.web_port = (c.web_port || DEF_ALERT_WEB_PORT) + 1 - this.cluster_port = (c.cluster_port || DEF_ALERT_CLUSTER_PORT) + 1 + this.web_port = (c.web_port || DEF_ALERT_WEB_PORT) + 2 + this.cluster_port = (c.cluster_port || DEF_ALERT_CLUSTER_PORT) + 2 } } From 62f136efd6064c57a47e58f3098ee9f5fa19d814 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 10 Sep 2020 12:02:57 +0800 Subject: [PATCH 094/126] fix crash when scale out --- components/cluster/command/scale_out.go | 5 ++--- components/web/main.go | 10 +++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/components/cluster/command/scale_out.go b/components/cluster/command/scale_out.go index 9a1bf778ea..75ed0ef9bf 100644 --- a/components/cluster/command/scale_out.go +++ b/components/cluster/command/scale_out.go @@ -59,7 +59,7 @@ func newScaleOutCmd() *cobra.Command { clusterName, topoFile, PostScaleOutHook, - Final, + final, opt, skipConfirm, gOpt.OptTimeout, @@ -86,8 +86,7 @@ func convertStepDisplaysToTasks(t []*task.StepDisplay) []task.Task { return tasks } -// Final do things after scale out -func Final(builder *task.Builder, name string, meta spec.Metadata) { +func final(builder *task.Builder, name string, meta spec.Metadata) { builder.UpdateTopology(name, tidbSpec.Path(name), meta.(*spec.ClusterMeta), diff --git a/components/web/main.go b/components/web/main.go index 1f1d1e7c1a..92d5427f12 100644 --- a/components/web/main.go +++ b/components/web/main.go @@ -300,12 +300,20 @@ func scaleOutClusterHandler(c *gin.Context) { opt.Pass = &req.GlobalLoginOptions.PrivateKeyPassword } + final := func(builder *task.Builder, name string, meta spec.Metadata) { + builder.UpdateTopology(name, + tidbSpec.Path(name), + meta.(*spec.ClusterMeta), + nil, /* deleteNodeIds */ + ) + } + go func() { manager.DoScaleOut( clusterName, topoFilePath, command.PostScaleOutHook, - command.Final, + final, opt, true, 120, From 13c741894aae3fe5c486e99f30946cd7cc29d743 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Thu, 10 Sep 2020 22:46:11 +0800 Subject: [PATCH 095/126] run cluster web ui by `tiup-cluster --ui` --- Makefile | 14 +- components/cluster/command/deploy.go | 5 +- components/cluster/command/root.go | 12 ++ components/cluster/command/scale_out.go | 5 +- .../{ => cluster}/web/uiserver/.gitignore | 0 .../web/uiserver/empty_assets_handler.go | 0 .../{ => cluster}/web/uiserver/uiserver.go | 0 .../{web/main.go => cluster/web/web.go} | 171 +++++++++++------- 8 files changed, 125 insertions(+), 82 deletions(-) rename components/{ => cluster}/web/uiserver/.gitignore (100%) rename components/{ => cluster}/web/uiserver/empty_assets_handler.go (100%) rename components/{ => cluster}/web/uiserver/uiserver.go (100%) rename components/{web/main.go => cluster/web/web.go} (65%) diff --git a/Makefile b/Makefile index 15fcd3f1e6..908cc5bcca 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ include ./tests/Makefile # Build TiUP and all components build: tiup components -components: playground client cluster dm bench web server +components: playground client cluster dm bench server tiup: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup @@ -62,12 +62,12 @@ embed_ui: cd web-ui && yarn && yarn build scripts/embed_ui_assets.sh -web: -ifeq ($(UI),1) - $(GOBUILD) -ldflags '$(LDFLAGS)' -tags ui_server -o bin/tiup-web ./components/web -else - $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-web ./components/web -endif +# web: +# ifeq ($(UI),1) +# $(GOBUILD) -ldflags '$(LDFLAGS)' -tags ui_server -o bin/tiup-web ./components/web +# else +# $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-web ./components/web +# endif server: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-server ./server diff --git a/components/cluster/command/deploy.go b/components/cluster/command/deploy.go index addfd1eaa8..1db8a5df3b 100644 --- a/components/cluster/command/deploy.go +++ b/components/cluster/command/deploy.go @@ -83,7 +83,7 @@ func newDeploy() *cobra.Command { version, topoFile, opt, - PostDeployHook, + postDeployHook, skipConfirm, gOpt.OptTimeout, gOpt.SSHTimeout, @@ -101,8 +101,7 @@ func newDeploy() *cobra.Command { return cmd } -// PostDeployHook do things after deploy -func PostDeployHook(builder *task.Builder, topo spec.Topology) { +func postDeployHook(builder *task.Builder, topo spec.Topology) { nodeInfoTask := task.NewBuilder().Func("Check status", func(ctx *task.Context) error { var err error teleNodeInfos, err = operator.GetNodeInfo(context.Background(), ctx, topo) diff --git a/components/cluster/command/root.go b/components/cluster/command/root.go index 57ec011db0..63ba658fdf 100644 --- a/components/cluster/command/root.go +++ b/components/cluster/command/root.go @@ -24,6 +24,7 @@ import ( "github.com/fatih/color" "github.com/google/uuid" "github.com/joomcode/errorx" + "github.com/pingcap/tiup/components/cluster/web" "github.com/pingcap/tiup/pkg/cliutil" "github.com/pingcap/tiup/pkg/cluster" "github.com/pingcap/tiup/pkg/cluster/executor" @@ -86,6 +87,7 @@ func init() { gOpt.NativeSSH = true } + var runUI bool rootCmd = &cobra.Command{ Use: cliutil.OsArgs0(), Short: "Deploy a TiDB cluster for production", @@ -124,6 +126,14 @@ func init() { return nil }, + Run: func(cmd *cobra.Command, args []string) { + if runUI { + fmt.Println("Start to run cluster web ui") + web.Run(tidbSpec, manager, gOpt) + return + } + _ = cmd.Help() + }, PersistentPostRunE: func(cmd *cobra.Command, args []string) error { return tiupmeta.GlobalEnv().V1Repository().Mirror().Close() }, @@ -140,6 +150,8 @@ func init() { rootCmd.PersistentFlags().StringVar((*string)(&gOpt.SSHType), "ssh", "", "(experimental) The executor type: 'builtin', 'system', 'none'.") _ = rootCmd.PersistentFlags().MarkHidden("native-ssh") + rootCmd.Flags().BoolVar(&runUI, "ui", false, "Run web ui for cluster") + rootCmd.AddCommand( newCheckCmd(), newDeploy(), diff --git a/components/cluster/command/scale_out.go b/components/cluster/command/scale_out.go index 75ed0ef9bf..2965085268 100644 --- a/components/cluster/command/scale_out.go +++ b/components/cluster/command/scale_out.go @@ -58,7 +58,7 @@ func newScaleOutCmd() *cobra.Command { return manager.ScaleOut( clusterName, topoFile, - PostScaleOutHook, + postScaleOutHook, final, opt, skipConfirm, @@ -94,8 +94,7 @@ func final(builder *task.Builder, name string, meta spec.Metadata) { ) } -// PostScaleOutHook do things after scale out -func PostScaleOutHook(builder *task.Builder, newPart spec.Topology) { +func postScaleOutHook(builder *task.Builder, newPart spec.Topology) { nodeInfoTask := task.NewBuilder().Func("Check status", func(ctx *task.Context) error { var err error teleNodeInfos, err = operator.GetNodeInfo(context.Background(), ctx, newPart) diff --git a/components/web/uiserver/.gitignore b/components/cluster/web/uiserver/.gitignore similarity index 100% rename from components/web/uiserver/.gitignore rename to components/cluster/web/uiserver/.gitignore diff --git a/components/web/uiserver/empty_assets_handler.go b/components/cluster/web/uiserver/empty_assets_handler.go similarity index 100% rename from components/web/uiserver/empty_assets_handler.go rename to components/cluster/web/uiserver/empty_assets_handler.go diff --git a/components/web/uiserver/uiserver.go b/components/cluster/web/uiserver/uiserver.go similarity index 100% rename from components/web/uiserver/uiserver.go rename to components/cluster/web/uiserver/uiserver.go diff --git a/components/web/main.go b/components/cluster/web/web.go similarity index 65% rename from components/web/main.go rename to components/cluster/web/web.go index 92d5427f12..b47e104dc3 100644 --- a/components/web/main.go +++ b/components/cluster/web/web.go @@ -1,40 +1,44 @@ -package main +package web import ( + "context" "crypto/tls" "io/ioutil" "net/http" "strings" "github.com/gin-gonic/gin" - "github.com/pingcap/tiup/components/cluster/command" - "github.com/pingcap/tiup/components/web/uiserver" + "github.com/pingcap/tiup/components/cluster/web/uiserver" "github.com/pingcap/tiup/pkg/cluster" - "github.com/pingcap/tiup/pkg/cluster/executor" operator "github.com/pingcap/tiup/pkg/cluster/operation" + "github.com/pingcap/tiup/pkg/cluster/report" "github.com/pingcap/tiup/pkg/cluster/spec" "github.com/pingcap/tiup/pkg/cluster/task" cors "github.com/rs/cors/wrapper/gin" ) -var tidbSpec *spec.SpecManager -var manager *cluster.Manager +var ( + tidbSpec *spec.SpecManager + manager *cluster.Manager + gOpt operator.Options + skipConfirm = true +) -func main() { - if err := spec.Initialize("cluster"); err != nil { - panic("initialize spec failed") - } - tidbSpec = spec.GetSpecManager() - manager = cluster.NewManager("tidb", tidbSpec, spec.TiDBComponentVersion) +// Run starts web ui for cluster +func Run(_tidbSpec *spec.SpecManager, _manager *cluster.Manager, _gOpt operator.Options) { + tidbSpec = _tidbSpec + manager = _manager + gOpt = _gOpt router := gin.Default() router.Use(cors.AllowAll()) + // Backend API api := router.Group("/api") { - api.POST("/deploy", deployHandler) api.GET("/status", statusHandler) + api.POST("/deploy", deployHandler) api.GET("/clusters", clustersHandler) api.GET("/clusters/:clusterName", clusterHandler) api.DELETE("/clusters/:clusterName", destroyClusterHandler) @@ -43,16 +47,18 @@ func main() { api.POST("/clusters/:clusterName/scale_in", scaleInClusterHandler) api.POST("/clusters/:clusterName/scale_out", scaleOutClusterHandler) } + // Frontend assets router.StaticFS("/tiup", uiserver.Assets) router.GET("/", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "/tiup") c.Abort() }) + _ = router.Run() } -// DeployGlobalLoginOptions represents the global options for deploy -type DeployGlobalLoginOptions struct { +// GlobalLoginOptions represents the global options for deploy +type GlobalLoginOptions struct { Username string `json:"username"` Password string `json:"password"` PrivateKey string `json:"privateKey"` // TODO: refine naming style @@ -61,10 +67,15 @@ type DeployGlobalLoginOptions struct { // DeployReq represents for the request of deploy API type DeployReq struct { - ClusterName string `json:"cluster_name"` - TiDBVersion string `json:"tidb_version"` - TopoYaml string `json:"topo_yaml"` - GlobalLoginOptions DeployGlobalLoginOptions `json:"global_login_options"` + ClusterName string `json:"cluster_name"` + TiDBVersion string `json:"tidb_version"` + TopoYaml string `json:"topo_yaml"` + GlobalLoginOptions GlobalLoginOptions `json:"global_login_options"` +} + +func statusHandler(c *gin.Context) { + status := manager.GetOperationStatus() + c.JSON(http.StatusOK, status) } func deployHandler(c *gin.Context) { @@ -112,22 +123,17 @@ func deployHandler(c *gin.Context) { req.TiDBVersion, topoFilePath, opt, - command.PostDeployHook, - true, - 120, - 5, - executor.SSHTypeBuiltin, + postDeployHook, + skipConfirm, + gOpt.OptTimeout, + gOpt.SSHTimeout, + gOpt.SSHType, ) }() c.Status(http.StatusNoContent) } -func statusHandler(c *gin.Context) { - status := manager.GetOperationStatus() - c.JSON(http.StatusOK, status) -} - func clustersHandler(c *gin.Context) { clusters, err := manager.GetClusterList() if err != nil { @@ -139,11 +145,7 @@ func clustersHandler(c *gin.Context) { func clusterHandler(c *gin.Context) { clusterName := c.Param("clusterName") - instInfos, err := manager.GetClusterTopology(clusterName, operator.Options{ - SSHTimeout: 5, - OptTimeout: 120, - APITimeout: 300, - }) + instInfos, err := manager.GetClusterTopology(clusterName, gOpt) if err != nil { _ = c.Error(err) return @@ -154,11 +156,7 @@ func clusterHandler(c *gin.Context) { func destroyClusterHandler(c *gin.Context) { clusterName := c.Param("clusterName") go func() { - manager.DoDestroyCluster(clusterName, operator.Options{ - SSHTimeout: 5, - OptTimeout: 120, - APITimeout: 300, - }, operator.Options{}, true) + manager.DoDestroyCluster(clusterName, gOpt, operator.Options{}, skipConfirm) }() c.Status(http.StatusNoContent) @@ -168,11 +166,7 @@ func startClusterHandler(c *gin.Context) { clusterName := c.Param("clusterName") go func() { - manager.DoStartCluster(clusterName, operator.Options{ - SSHTimeout: 5, - OptTimeout: 120, - APITimeout: 300, - }, func(b *task.Builder, metadata spec.Metadata) { + manager.DoStartCluster(clusterName, gOpt, func(b *task.Builder, metadata spec.Metadata) { b.UpdateTopology( clusterName, tidbSpec.Path(clusterName), @@ -188,11 +182,7 @@ func startClusterHandler(c *gin.Context) { func stopClusterHandler(c *gin.Context) { clusterName := c.Param("clusterName") go func() { - manager.DoStopCluster(clusterName, operator.Options{ - SSHTimeout: 5, - OptTimeout: 120, - APITimeout: 300, - }) + manager.DoStopCluster(clusterName, gOpt) }() c.Status(http.StatusNoContent) @@ -214,40 +204,41 @@ func scaleInClusterHandler(c *gin.Context) { } go func() { - gOpt := operator.Options{ - SSHTimeout: 5, - OptTimeout: 120, - APITimeout: 300, - NativeSSH: false, - Force: req.Force, - Nodes: req.Nodes} - // TODO scale := func(b *task.Builder, imetadata spec.Metadata, tlsCfg *tls.Config) { metadata := imetadata.(*spec.ClusterMeta) if !gOpt.Force { b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt, tlsCfg). - UpdateMeta(clusterName, metadata, operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false)). + UpdateMeta(clusterName, metadata, operator.AsyncNodes(metadata.Topology, req.Nodes, false)). UpdateTopology( clusterName, tidbSpec.Path(clusterName), metadata, - operator.AsyncNodes(metadata.Topology, gOpt.Nodes, false), /* deleteNodeIds */ + operator.AsyncNodes(metadata.Topology, req.Nodes, false), /* deleteNodeIds */ ) } else { b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt, tlsCfg). - UpdateMeta(clusterName, metadata, gOpt.Nodes). + UpdateMeta(clusterName, metadata, req.Nodes). UpdateTopology( clusterName, tidbSpec.Path(clusterName), metadata, - gOpt.Nodes, + req.Nodes, ) } } - manager.DoScaleIn(clusterName, true, gOpt.OptTimeout, gOpt.SSHTimeout, executor.SSHTypeBuiltin, gOpt.Force, gOpt.Nodes, scale) + manager.DoScaleIn( + clusterName, + skipConfirm, + gOpt.OptTimeout, + gOpt.SSHTimeout, + gOpt.SSHType, + req.Force, + req.Nodes, + scale, + ) }() c.Status(http.StatusNoContent) @@ -255,8 +246,8 @@ func scaleInClusterHandler(c *gin.Context) { // ScaleOutReq represents the request for scale out type ScaleOutReq struct { - TopoYaml string `json:"topo_yaml"` - GlobalLoginOptions DeployGlobalLoginOptions `json:"global_login_options"` + TopoYaml string `json:"topo_yaml"` + GlobalLoginOptions GlobalLoginOptions `json:"global_login_options"` } func scaleOutClusterHandler(c *gin.Context) { @@ -312,15 +303,57 @@ func scaleOutClusterHandler(c *gin.Context) { manager.DoScaleOut( clusterName, topoFilePath, - command.PostScaleOutHook, + postScaleOutHook, final, opt, - true, - 120, - 5, - executor.SSHTypeBuiltin, + skipConfirm, + gOpt.OptTimeout, + gOpt.SSHTimeout, + gOpt.SSHType, ) }() c.Status(http.StatusNoContent) } + +////////////////////////////////////// +// The following code are copied from command package to avoid cycle import + +// Deprecated +func convertStepDisplaysToTasks(t []*task.StepDisplay) []task.Task { + tasks := make([]task.Task, 0, len(t)) + for _, sd := range t { + tasks = append(tasks, sd) + } + return tasks +} + +func postDeployHook(builder *task.Builder, topo spec.Topology) { + nodeInfoTask := task.NewBuilder().Func("Check status", func(ctx *task.Context) error { + _, _ = operator.GetNodeInfo(context.Background(), ctx, topo) + // intend to never return error + return nil + }).BuildAsStep("Check status").SetHidden(true) + + if report.Enable() { + builder.ParallelStep("+ Check status", nodeInfoTask) + } + + enableTask := task.NewBuilder().Func("Enable cluster", func(ctx *task.Context) error { + return operator.Enable(ctx, topo, operator.Options{}, true) + }).BuildAsStep("Enable cluster").SetHidden(true) + + builder.ParallelStep("+ Enable cluster", enableTask) +} + +func postScaleOutHook(builder *task.Builder, newPart spec.Topology) { + nodeInfoTask := task.NewBuilder().Func("Check status", func(ctx *task.Context) error { + _, _ = operator.GetNodeInfo(context.Background(), ctx, newPart) + // intend to never return error + return nil + }).BuildAsStep("Check status").SetHidden(true) + + if report.Enable() { + builder.Parallel(convertStepDisplaysToTasks([]*task.StepDisplay{nodeInfoTask})...) + } +} From 31900e38649b577b329ebf1166aa9ccd1fc60b71 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 11 Sep 2020 09:07:10 +0800 Subject: [PATCH 096/126] fix --- components/cluster/web/web.go | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/components/cluster/web/web.go b/components/cluster/web/web.go index b47e104dc3..da1be218bc 100644 --- a/components/cluster/web/web.go +++ b/components/cluster/web/web.go @@ -204,27 +204,36 @@ func scaleInClusterHandler(c *gin.Context) { } go func() { - // TODO + opt := operator.Options{ + SSHTimeout: gOpt.SSHTimeout, + OptTimeout: gOpt.OptTimeout, + APITimeout: gOpt.APITimeout, + NativeSSH: gOpt.NativeSSH, + SSHType: gOpt.SSHType, + Force: req.Force, + Nodes: req.Nodes} + + // TODO, duplicated scale := func(b *task.Builder, imetadata spec.Metadata, tlsCfg *tls.Config) { metadata := imetadata.(*spec.ClusterMeta) - if !gOpt.Force { - b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt, tlsCfg). - UpdateMeta(clusterName, metadata, operator.AsyncNodes(metadata.Topology, req.Nodes, false)). + if !opt.Force { + b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, opt, tlsCfg). + UpdateMeta(clusterName, metadata, operator.AsyncNodes(metadata.Topology, opt.Nodes, false)). UpdateTopology( clusterName, tidbSpec.Path(clusterName), metadata, - operator.AsyncNodes(metadata.Topology, req.Nodes, false), /* deleteNodeIds */ + operator.AsyncNodes(metadata.Topology, opt.Nodes, false), /* deleteNodeIds */ ) } else { - b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, gOpt, tlsCfg). - UpdateMeta(clusterName, metadata, req.Nodes). + b.ClusterOperate(metadata.Topology, operator.ScaleInOperation, opt, tlsCfg). + UpdateMeta(clusterName, metadata, opt.Nodes). UpdateTopology( clusterName, tidbSpec.Path(clusterName), metadata, - req.Nodes, + opt.Nodes, ) } } @@ -232,11 +241,11 @@ func scaleInClusterHandler(c *gin.Context) { manager.DoScaleIn( clusterName, skipConfirm, - gOpt.OptTimeout, - gOpt.SSHTimeout, - gOpt.SSHType, - req.Force, - req.Nodes, + opt.OptTimeout, + opt.SSHTimeout, + opt.SSHType, + opt.Force, + opt.Nodes, scale, ) }() From a2749d0859374c81bfc31a125ea72b8ef2c4e079 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 11 Sep 2020 09:08:56 +0800 Subject: [PATCH 097/126] rename web-ui to cluster-ui --- {web-ui => cluster-ui}/.gitignore | 0 {web-ui => cluster-ui}/README.md | 0 {web-ui => cluster-ui}/config-overrides.js | 0 {web-ui => cluster-ui}/package.json | 0 {web-ui => cluster-ui}/public/favicon.ico | Bin {web-ui => cluster-ui}/public/index.html | 0 {web-ui => cluster-ui}/public/logo192.png | Bin {web-ui => cluster-ui}/public/logo512.png | Bin {web-ui => cluster-ui}/public/manifest.json | 0 {web-ui => cluster-ui}/public/robots.txt | 0 {web-ui => cluster-ui}/src/App.less | 0 {web-ui => cluster-ui}/src/App.tsx | 0 {web-ui => cluster-ui}/src/apis/api.ts | 0 {web-ui => cluster-ui}/src/apis/index.ts | 0 {web-ui => cluster-ui}/src/apis/request.ts | 0 {web-ui => cluster-ui}/src/components/Root.tsx | 0 {web-ui => cluster-ui}/src/components/index.ts | 0 {web-ui => cluster-ui}/src/hooks/index.ts | 0 {web-ui => cluster-ui}/src/hooks/useComps.ts | 0 {web-ui => cluster-ui}/src/hooks/useGlobalDir.ts | 0 .../src/hooks/useGlobalLoginOptions.ts | 0 {web-ui => cluster-ui}/src/hooks/useMachines.ts | 0 {web-ui => cluster-ui}/src/index.css | 0 {web-ui => cluster-ui}/src/index.tsx | 0 .../src/pages/Clusters/ClusterDetail.tsx | 0 .../src/pages/Clusters/ClusterScaleOut.tsx | 0 {web-ui => cluster-ui}/src/pages/Clusters/index.tsx | 0 .../src/pages/Deployment/CompsManager.tsx | 0 .../src/pages/Deployment/DeploymentTable.tsx | 0 .../src/pages/Deployment/EditCompForm.tsx | 0 .../src/pages/Deployment/GlobalDirForm.tsx | 0 .../src/pages/Deployment/TopoPreview.tsx | 0 .../src/pages/Deployment/index.tsx | 0 {web-ui => cluster-ui}/src/pages/Home/index.tsx | 0 .../src/pages/Machines/GlobalLoginOptionsForm.tsx | 0 .../src/pages/Machines/MachineForm.tsx | 0 .../src/pages/Machines/MachinesTable.tsx | 0 {web-ui => cluster-ui}/src/pages/Machines/index.tsx | 0 .../src/pages/Status/OperationStatus.tsx | 0 {web-ui => cluster-ui}/src/pages/Status/index.tsx | 0 {web-ui => cluster-ui}/src/react-app-env.d.ts | 0 {web-ui => cluster-ui}/src/types/comps.ts | 0 {web-ui => cluster-ui}/src/types/index.ts | 0 {web-ui => cluster-ui}/src/types/machine.ts | 0 {web-ui => cluster-ui}/src/types/misc.ts | 0 {web-ui => cluster-ui}/tsconfig.json | 0 {web-ui => cluster-ui}/tsconfig.paths.json | 0 {web-ui => cluster-ui}/yarn.lock | 0 48 files changed, 0 insertions(+), 0 deletions(-) rename {web-ui => cluster-ui}/.gitignore (100%) rename {web-ui => cluster-ui}/README.md (100%) rename {web-ui => cluster-ui}/config-overrides.js (100%) rename {web-ui => cluster-ui}/package.json (100%) rename {web-ui => cluster-ui}/public/favicon.ico (100%) rename {web-ui => cluster-ui}/public/index.html (100%) rename {web-ui => cluster-ui}/public/logo192.png (100%) rename {web-ui => cluster-ui}/public/logo512.png (100%) rename {web-ui => cluster-ui}/public/manifest.json (100%) rename {web-ui => cluster-ui}/public/robots.txt (100%) rename {web-ui => cluster-ui}/src/App.less (100%) rename {web-ui => cluster-ui}/src/App.tsx (100%) rename {web-ui => cluster-ui}/src/apis/api.ts (100%) rename {web-ui => cluster-ui}/src/apis/index.ts (100%) rename {web-ui => cluster-ui}/src/apis/request.ts (100%) rename {web-ui => cluster-ui}/src/components/Root.tsx (100%) rename {web-ui => cluster-ui}/src/components/index.ts (100%) rename {web-ui => cluster-ui}/src/hooks/index.ts (100%) rename {web-ui => cluster-ui}/src/hooks/useComps.ts (100%) rename {web-ui => cluster-ui}/src/hooks/useGlobalDir.ts (100%) rename {web-ui => cluster-ui}/src/hooks/useGlobalLoginOptions.ts (100%) rename {web-ui => cluster-ui}/src/hooks/useMachines.ts (100%) rename {web-ui => cluster-ui}/src/index.css (100%) rename {web-ui => cluster-ui}/src/index.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Clusters/ClusterDetail.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Clusters/ClusterScaleOut.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Clusters/index.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Deployment/CompsManager.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Deployment/DeploymentTable.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Deployment/EditCompForm.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Deployment/GlobalDirForm.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Deployment/TopoPreview.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Deployment/index.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Home/index.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Machines/GlobalLoginOptionsForm.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Machines/MachineForm.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Machines/MachinesTable.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Machines/index.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Status/OperationStatus.tsx (100%) rename {web-ui => cluster-ui}/src/pages/Status/index.tsx (100%) rename {web-ui => cluster-ui}/src/react-app-env.d.ts (100%) rename {web-ui => cluster-ui}/src/types/comps.ts (100%) rename {web-ui => cluster-ui}/src/types/index.ts (100%) rename {web-ui => cluster-ui}/src/types/machine.ts (100%) rename {web-ui => cluster-ui}/src/types/misc.ts (100%) rename {web-ui => cluster-ui}/tsconfig.json (100%) rename {web-ui => cluster-ui}/tsconfig.paths.json (100%) rename {web-ui => cluster-ui}/yarn.lock (100%) diff --git a/web-ui/.gitignore b/cluster-ui/.gitignore similarity index 100% rename from web-ui/.gitignore rename to cluster-ui/.gitignore diff --git a/web-ui/README.md b/cluster-ui/README.md similarity index 100% rename from web-ui/README.md rename to cluster-ui/README.md diff --git a/web-ui/config-overrides.js b/cluster-ui/config-overrides.js similarity index 100% rename from web-ui/config-overrides.js rename to cluster-ui/config-overrides.js diff --git a/web-ui/package.json b/cluster-ui/package.json similarity index 100% rename from web-ui/package.json rename to cluster-ui/package.json diff --git a/web-ui/public/favicon.ico b/cluster-ui/public/favicon.ico similarity index 100% rename from web-ui/public/favicon.ico rename to cluster-ui/public/favicon.ico diff --git a/web-ui/public/index.html b/cluster-ui/public/index.html similarity index 100% rename from web-ui/public/index.html rename to cluster-ui/public/index.html diff --git a/web-ui/public/logo192.png b/cluster-ui/public/logo192.png similarity index 100% rename from web-ui/public/logo192.png rename to cluster-ui/public/logo192.png diff --git a/web-ui/public/logo512.png b/cluster-ui/public/logo512.png similarity index 100% rename from web-ui/public/logo512.png rename to cluster-ui/public/logo512.png diff --git a/web-ui/public/manifest.json b/cluster-ui/public/manifest.json similarity index 100% rename from web-ui/public/manifest.json rename to cluster-ui/public/manifest.json diff --git a/web-ui/public/robots.txt b/cluster-ui/public/robots.txt similarity index 100% rename from web-ui/public/robots.txt rename to cluster-ui/public/robots.txt diff --git a/web-ui/src/App.less b/cluster-ui/src/App.less similarity index 100% rename from web-ui/src/App.less rename to cluster-ui/src/App.less diff --git a/web-ui/src/App.tsx b/cluster-ui/src/App.tsx similarity index 100% rename from web-ui/src/App.tsx rename to cluster-ui/src/App.tsx diff --git a/web-ui/src/apis/api.ts b/cluster-ui/src/apis/api.ts similarity index 100% rename from web-ui/src/apis/api.ts rename to cluster-ui/src/apis/api.ts diff --git a/web-ui/src/apis/index.ts b/cluster-ui/src/apis/index.ts similarity index 100% rename from web-ui/src/apis/index.ts rename to cluster-ui/src/apis/index.ts diff --git a/web-ui/src/apis/request.ts b/cluster-ui/src/apis/request.ts similarity index 100% rename from web-ui/src/apis/request.ts rename to cluster-ui/src/apis/request.ts diff --git a/web-ui/src/components/Root.tsx b/cluster-ui/src/components/Root.tsx similarity index 100% rename from web-ui/src/components/Root.tsx rename to cluster-ui/src/components/Root.tsx diff --git a/web-ui/src/components/index.ts b/cluster-ui/src/components/index.ts similarity index 100% rename from web-ui/src/components/index.ts rename to cluster-ui/src/components/index.ts diff --git a/web-ui/src/hooks/index.ts b/cluster-ui/src/hooks/index.ts similarity index 100% rename from web-ui/src/hooks/index.ts rename to cluster-ui/src/hooks/index.ts diff --git a/web-ui/src/hooks/useComps.ts b/cluster-ui/src/hooks/useComps.ts similarity index 100% rename from web-ui/src/hooks/useComps.ts rename to cluster-ui/src/hooks/useComps.ts diff --git a/web-ui/src/hooks/useGlobalDir.ts b/cluster-ui/src/hooks/useGlobalDir.ts similarity index 100% rename from web-ui/src/hooks/useGlobalDir.ts rename to cluster-ui/src/hooks/useGlobalDir.ts diff --git a/web-ui/src/hooks/useGlobalLoginOptions.ts b/cluster-ui/src/hooks/useGlobalLoginOptions.ts similarity index 100% rename from web-ui/src/hooks/useGlobalLoginOptions.ts rename to cluster-ui/src/hooks/useGlobalLoginOptions.ts diff --git a/web-ui/src/hooks/useMachines.ts b/cluster-ui/src/hooks/useMachines.ts similarity index 100% rename from web-ui/src/hooks/useMachines.ts rename to cluster-ui/src/hooks/useMachines.ts diff --git a/web-ui/src/index.css b/cluster-ui/src/index.css similarity index 100% rename from web-ui/src/index.css rename to cluster-ui/src/index.css diff --git a/web-ui/src/index.tsx b/cluster-ui/src/index.tsx similarity index 100% rename from web-ui/src/index.tsx rename to cluster-ui/src/index.tsx diff --git a/web-ui/src/pages/Clusters/ClusterDetail.tsx b/cluster-ui/src/pages/Clusters/ClusterDetail.tsx similarity index 100% rename from web-ui/src/pages/Clusters/ClusterDetail.tsx rename to cluster-ui/src/pages/Clusters/ClusterDetail.tsx diff --git a/web-ui/src/pages/Clusters/ClusterScaleOut.tsx b/cluster-ui/src/pages/Clusters/ClusterScaleOut.tsx similarity index 100% rename from web-ui/src/pages/Clusters/ClusterScaleOut.tsx rename to cluster-ui/src/pages/Clusters/ClusterScaleOut.tsx diff --git a/web-ui/src/pages/Clusters/index.tsx b/cluster-ui/src/pages/Clusters/index.tsx similarity index 100% rename from web-ui/src/pages/Clusters/index.tsx rename to cluster-ui/src/pages/Clusters/index.tsx diff --git a/web-ui/src/pages/Deployment/CompsManager.tsx b/cluster-ui/src/pages/Deployment/CompsManager.tsx similarity index 100% rename from web-ui/src/pages/Deployment/CompsManager.tsx rename to cluster-ui/src/pages/Deployment/CompsManager.tsx diff --git a/web-ui/src/pages/Deployment/DeploymentTable.tsx b/cluster-ui/src/pages/Deployment/DeploymentTable.tsx similarity index 100% rename from web-ui/src/pages/Deployment/DeploymentTable.tsx rename to cluster-ui/src/pages/Deployment/DeploymentTable.tsx diff --git a/web-ui/src/pages/Deployment/EditCompForm.tsx b/cluster-ui/src/pages/Deployment/EditCompForm.tsx similarity index 100% rename from web-ui/src/pages/Deployment/EditCompForm.tsx rename to cluster-ui/src/pages/Deployment/EditCompForm.tsx diff --git a/web-ui/src/pages/Deployment/GlobalDirForm.tsx b/cluster-ui/src/pages/Deployment/GlobalDirForm.tsx similarity index 100% rename from web-ui/src/pages/Deployment/GlobalDirForm.tsx rename to cluster-ui/src/pages/Deployment/GlobalDirForm.tsx diff --git a/web-ui/src/pages/Deployment/TopoPreview.tsx b/cluster-ui/src/pages/Deployment/TopoPreview.tsx similarity index 100% rename from web-ui/src/pages/Deployment/TopoPreview.tsx rename to cluster-ui/src/pages/Deployment/TopoPreview.tsx diff --git a/web-ui/src/pages/Deployment/index.tsx b/cluster-ui/src/pages/Deployment/index.tsx similarity index 100% rename from web-ui/src/pages/Deployment/index.tsx rename to cluster-ui/src/pages/Deployment/index.tsx diff --git a/web-ui/src/pages/Home/index.tsx b/cluster-ui/src/pages/Home/index.tsx similarity index 100% rename from web-ui/src/pages/Home/index.tsx rename to cluster-ui/src/pages/Home/index.tsx diff --git a/web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx b/cluster-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx similarity index 100% rename from web-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx rename to cluster-ui/src/pages/Machines/GlobalLoginOptionsForm.tsx diff --git a/web-ui/src/pages/Machines/MachineForm.tsx b/cluster-ui/src/pages/Machines/MachineForm.tsx similarity index 100% rename from web-ui/src/pages/Machines/MachineForm.tsx rename to cluster-ui/src/pages/Machines/MachineForm.tsx diff --git a/web-ui/src/pages/Machines/MachinesTable.tsx b/cluster-ui/src/pages/Machines/MachinesTable.tsx similarity index 100% rename from web-ui/src/pages/Machines/MachinesTable.tsx rename to cluster-ui/src/pages/Machines/MachinesTable.tsx diff --git a/web-ui/src/pages/Machines/index.tsx b/cluster-ui/src/pages/Machines/index.tsx similarity index 100% rename from web-ui/src/pages/Machines/index.tsx rename to cluster-ui/src/pages/Machines/index.tsx diff --git a/web-ui/src/pages/Status/OperationStatus.tsx b/cluster-ui/src/pages/Status/OperationStatus.tsx similarity index 100% rename from web-ui/src/pages/Status/OperationStatus.tsx rename to cluster-ui/src/pages/Status/OperationStatus.tsx diff --git a/web-ui/src/pages/Status/index.tsx b/cluster-ui/src/pages/Status/index.tsx similarity index 100% rename from web-ui/src/pages/Status/index.tsx rename to cluster-ui/src/pages/Status/index.tsx diff --git a/web-ui/src/react-app-env.d.ts b/cluster-ui/src/react-app-env.d.ts similarity index 100% rename from web-ui/src/react-app-env.d.ts rename to cluster-ui/src/react-app-env.d.ts diff --git a/web-ui/src/types/comps.ts b/cluster-ui/src/types/comps.ts similarity index 100% rename from web-ui/src/types/comps.ts rename to cluster-ui/src/types/comps.ts diff --git a/web-ui/src/types/index.ts b/cluster-ui/src/types/index.ts similarity index 100% rename from web-ui/src/types/index.ts rename to cluster-ui/src/types/index.ts diff --git a/web-ui/src/types/machine.ts b/cluster-ui/src/types/machine.ts similarity index 100% rename from web-ui/src/types/machine.ts rename to cluster-ui/src/types/machine.ts diff --git a/web-ui/src/types/misc.ts b/cluster-ui/src/types/misc.ts similarity index 100% rename from web-ui/src/types/misc.ts rename to cluster-ui/src/types/misc.ts diff --git a/web-ui/tsconfig.json b/cluster-ui/tsconfig.json similarity index 100% rename from web-ui/tsconfig.json rename to cluster-ui/tsconfig.json diff --git a/web-ui/tsconfig.paths.json b/cluster-ui/tsconfig.paths.json similarity index 100% rename from web-ui/tsconfig.paths.json rename to cluster-ui/tsconfig.paths.json diff --git a/web-ui/yarn.lock b/cluster-ui/yarn.lock similarity index 100% rename from web-ui/yarn.lock rename to cluster-ui/yarn.lock From fd4a1648c8d0cb7d9d04690161edf0a7b438e59f Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 11 Sep 2020 09:22:35 +0800 Subject: [PATCH 098/126] update embed assets --- Makefile | 17 +++--- cluster-ui/README.md | 57 +++++++------------ .../embed_assets/embed_cluster_ui_assets.sh | 11 ++-- .../main.go | 2 +- 4 files changed, 33 insertions(+), 54 deletions(-) rename scripts/embed_ui_assets.sh => tools/embed_assets/embed_cluster_ui_assets.sh (78%) rename tools/{assets_generate => gen_cluster_ui_assets}/main.go (85%) diff --git a/Makefile b/Makefile index 908cc5bcca..326027bbc0 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,11 @@ client: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-client ./components/client cluster: +ifeq ($(UI),1) + $(GOBUILD) -ldflags '$(LDFLAGS)' -tags ui_server -o bin/tiup-cluster ./components/cluster +else $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-cluster ./components/cluster +endif dm: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-dm ./components/dm @@ -58,16 +62,9 @@ doc: err: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-err ./components/err -embed_ui: - cd web-ui && yarn && yarn build - scripts/embed_ui_assets.sh - -# web: -# ifeq ($(UI),1) -# $(GOBUILD) -ldflags '$(LDFLAGS)' -tags ui_server -o bin/tiup-web ./components/web -# else -# $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-web ./components/web -# endif +embed_cluster_ui: + cd cluster-ui && yarn && yarn build + tools/embed_assets/embed_cluster_ui_assets.sh server: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/tiup-server ./server diff --git a/cluster-ui/README.md b/cluster-ui/README.md index 64e343e184..f1dd478f83 100644 --- a/cluster-ui/README.md +++ b/cluster-ui/README.md @@ -1,44 +1,29 @@ -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). +# Cluster Web UI -## Available Scripts +This is the web ui for tiup-cluster command. -In the project directory, you can run: +## How to Run -### `yarn start` +### Release Mode -Runs the app in the development mode.
-Open [http://localhost:3000](http://localhost:3000) to view it in the browser. +```shell +$ cd tiup +$ make embed_cluster_ui +$ UI=1 make +$ bin/tiup-cluster --ui +``` -The page will reload if you make edits.
-You will also see any lint errors in the console. +Then access `http://127.0.0.1:8080` in the browser. -### `yarn test` +### Develop Mode -Launches the test runner in the interactive watch mode.
-See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. +```shell +$ cd tiup +$ make +$ bin/tiup-cluster --ui +# a new tab +$ cd cluster-ui +$ yarn && yarn start +``` -### `yarn build` - -Builds the app for production to the `build` folder.
-It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.
-Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `yarn eject` - -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** - -If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. - -You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). +It will auto open `http://127.0.0.1:3000/tiup` in the browser. diff --git a/scripts/embed_ui_assets.sh b/tools/embed_assets/embed_cluster_ui_assets.sh similarity index 78% rename from scripts/embed_ui_assets.sh rename to tools/embed_assets/embed_cluster_ui_assets.sh index 4e90a85dab..67c95196a4 100755 --- a/scripts/embed_ui_assets.sh +++ b/tools/embed_assets/embed_cluster_ui_assets.sh @@ -12,17 +12,14 @@ set -euo pipefail DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -PROJECT_DIR="$(dirname "$DIR")" +PROJECT_DIR="$( dirname "$(dirname "$DIR")" )" # See https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module cd "$PROJECT_DIR" -export GOBIN=$PROJECT_DIR/bin -export PATH=$GOBIN:$PATH - echo "+ Preflight check" -if [ ! -d "web-ui/build" ]; then +if [ ! -d "cluster-ui/build" ]; then echo " - Error: UI assets must be built first" exit 1 fi @@ -35,8 +32,8 @@ fi echo "+ Embed UI assets" -go run tools/assets_generate/main.go $BUILD_TAG_PARAMETER +go run tools/gen_cluster_ui_assets/main.go $BUILD_TAG_PARAMETER -HANDLER_PATH=components/web/uiserver/embedded_assets_handler.go +HANDLER_PATH=components/cluster/web/uiserver/embedded_assets_handler.go mv assets_vfsdata.go $HANDLER_PATH echo " - Assets handler written to $HANDLER_PATH" diff --git a/tools/assets_generate/main.go b/tools/gen_cluster_ui_assets/main.go similarity index 85% rename from tools/assets_generate/main.go rename to tools/gen_cluster_ui_assets/main.go index 010fc94e7b..ff6af5d39e 100644 --- a/tools/assets_generate/main.go +++ b/tools/gen_cluster_ui_assets/main.go @@ -13,7 +13,7 @@ func main() { if len(os.Args) > 1 { buildTag = os.Args[1] } - var fs http.FileSystem = http.Dir("web-ui/build") + var fs http.FileSystem = http.Dir("cluster-ui/build") err := vfsgen.Generate(fs, vfsgen.Options{ BuildTags: buildTag, PackageName: "uiserver", From 42b82b842385c168957854370453247352e0f129 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 11 Sep 2020 11:52:14 +0800 Subject: [PATCH 099/126] add missed react hook dependency --- cluster-ui/src/pages/Deployment/DeploymentTable.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/cluster-ui/src/pages/Deployment/DeploymentTable.tsx b/cluster-ui/src/pages/Deployment/DeploymentTable.tsx index 3609463d18..dbfd9048f6 100644 --- a/cluster-ui/src/pages/Deployment/DeploymentTable.tsx +++ b/cluster-ui/src/pages/Deployment/DeploymentTable.tsx @@ -178,6 +178,7 @@ export default function DeploymentTable({ onDeleteComponents, globalLoginOptions, forScaleOut, + globalDir, ]) return ( From 7dc97c9b882245e7e80927305c160a9170951040 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 11 Sep 2020 12:02:58 +0800 Subject: [PATCH 100/126] close eslint href check --- cluster-ui/config-overrides.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/cluster-ui/config-overrides.js b/cluster-ui/config-overrides.js index 4a72ee2d66..97b1433cdf 100644 --- a/cluster-ui/config-overrides.js +++ b/cluster-ui/config-overrides.js @@ -8,6 +8,22 @@ const addAlias = () => (config) => { return config } +const configEslint = () => (config) => { + const eslintRule = config.module.rules.filter( + (r) => + r.use && r.use.some((u) => u.options && u.options.useEslintrc !== void 0) + )[0] + const options = eslintRule.use[0].options + // options.ignore = true + // options.ignorePattern = 'lib/client/api/*.ts' + + // To close "The href attribute is required for an anchor to be keyboard accessible" warning + options.baseConfig.rules = { + 'jsx-a11y/anchor-is-valid': 'off', + } + return config +} + module.exports = override( addLessLoader({ lessOptions: { @@ -15,5 +31,6 @@ module.exports = override( modifyVars: { '@primary-color': '#3351ff' }, }, }), - addAlias() + addAlias(), + configEslint() ) From d57d3300799bdeeaa856a2ebdff47a5ac1f75bf6 Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Fri, 11 Sep 2020 12:02:58 +0800 Subject: [PATCH 101/126] dismiss react hook warning --- cluster-ui/src/pages/Clusters/index.tsx | 1 + cluster-ui/src/pages/Home/index.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/cluster-ui/src/pages/Clusters/index.tsx b/cluster-ui/src/pages/Clusters/index.tsx index 056f0eaa72..8bc623cd09 100644 --- a/cluster-ui/src/pages/Clusters/index.tsx +++ b/cluster-ui/src/pages/Clusters/index.tsx @@ -27,6 +27,7 @@ export default function ClustersPage() { // eslint-disable-next-line }, []) + // eslint-disable-next-line useEffect(() => { const paths = window.location.hash.split('/') // ['#', 'clusters', 'xxx'] if (paths[1] === 'clusters') { diff --git a/cluster-ui/src/pages/Home/index.tsx b/cluster-ui/src/pages/Home/index.tsx index 13de9914b2..fb7e4101cb 100644 --- a/cluster-ui/src/pages/Home/index.tsx +++ b/cluster-ui/src/pages/Home/index.tsx @@ -14,6 +14,7 @@ const { Sider, Content } = Layout function SiderMenu() { const [curMenu, setCurMenu] = useState('') + // eslint-disable-next-line useEffect(() => { const path = window.location.hash.split('/')[1] setCurMenu(path || '') From f82a7681283b644f5dd70fad647677bb4ee4b92b Mon Sep 17 00:00:00 2001 From: baurine <2008.hbl@gmail.com> Date: Wed, 16 Sep 2020 16:03:35 +0800 Subject: [PATCH 102/126] add v4.0.6 option and support input the version manually --- cluster-ui/src/pages/Deployment/CompsManager.tsx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/cluster-ui/src/pages/Deployment/CompsManager.tsx b/cluster-ui/src/pages/Deployment/CompsManager.tsx index ad56707e4f..df890ba300 100644 --- a/cluster-ui/src/pages/Deployment/CompsManager.tsx +++ b/cluster-ui/src/pages/Deployment/CompsManager.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useState } from 'react' import { useLocalStorageState } from 'ahooks' -import { Drawer, Button, Modal, Form, Input, Select } from 'antd' +import { Drawer, Button, Modal, Form, Input, AutoComplete } from 'antd' import yaml from 'yaml' import { useNavigate } from 'react-router-dom' @@ -22,6 +22,7 @@ import GlobalDirForm from './GlobalDirForm' // TODO: fetch from API const TIDB_VERSIONS = [ 'nightly', + 'v4.0.6', 'v4.0.5', 'v4.0.4', 'v4.0.3', @@ -32,6 +33,7 @@ const TIDB_VERSIONS = [ 'v3.1.1', 'v3.1.0', ] +const AUTO_COMPLETE_OPTIONS = TIDB_VERSIONS.map((v) => ({ value: v })) export interface IDeployReq { cluster_name: string @@ -204,13 +206,10 @@ export default function CompsManager({ name="tidb_version" rules={[{ required: true, message: '请选择 TiDB 版本' }]} > - + + + + + )} + +
+