From 4ec45bb0397367662f8be0ffe829bdcdbb78d9d8 Mon Sep 17 00:00:00 2001 From: Andrey Velichkevich Date: Fri, 17 May 2019 00:12:04 -0700 Subject: [PATCH] Katib UI for v1alpha2 (#486) * Init commit * Half of backend edit * Backend for v1alpha2 UI is done * Fix gopkg.toml * fix gopkg lock * Almost submit HP job by params done * Modify gitignore * Add by parameters for HP and NAS done * HP and NAS jobs functionality done * Template is done * Add new filters in job list Create a new build with frontend * Fix newlines * Review changes * Add tests for katib-ui * Delete pkg * Add pkg * Fix backend --- Gopkg.lock | 17 + Gopkg.toml | 4 + cmd/ui/v1alpha1/Dockerfile | 14 + cmd/ui/{ => v1alpha1}/main.go | 5 +- .../{ => v1alpha1}/static/css/bootstrap.css | 0 cmd/ui/{ => v1alpha1}/static/css/c3.min.css | 0 .../{ => v1alpha1}/static/css/codemirror.css | 0 cmd/ui/{ => v1alpha1}/static/css/dropmenu.css | 0 .../{ => v1alpha1}/static/css/editmodal.css | 0 .../{ => v1alpha1}/static/css/linegraph.css | 0 cmd/ui/{ => v1alpha1}/static/css/loader.css | 0 .../static/css/parallelcood.css | 0 cmd/ui/{ => v1alpha1}/static/css/profile.css | 0 cmd/ui/{ => v1alpha1}/static/img/favicon.ico | Bin cmd/ui/{ => v1alpha1}/static/img/klogo.svg | 0 .../{ => v1alpha1}/static/js/autorefresh.js | 0 cmd/ui/{ => v1alpha1}/static/js/bootstrap.js | 0 cmd/ui/{ => v1alpha1}/static/js/c3.min.js | 0 cmd/ui/{ => v1alpha1}/static/js/codemirror.js | 0 cmd/ui/{ => v1alpha1}/static/js/yaml.js | 0 cmd/ui/{ => v1alpha1}/template/index.html | 0 cmd/ui/{ => v1alpha1}/template/layout.html | 0 cmd/ui/{ => v1alpha1}/template/linegraph.js | 0 .../template/metricscollectortemplate.html | 0 .../template/metricscollectortemplate.js | 0 cmd/ui/{ => v1alpha1}/template/navbar.html | 0 .../{ => v1alpha1}/template/parallelcood.js | 0 cmd/ui/{ => v1alpha1}/template/study.html | 0 .../{ => v1alpha1}/template/studyjobgen.html | 0 cmd/ui/{ => v1alpha1}/template/studyjobgen.js | 0 cmd/ui/{ => v1alpha1}/template/trial.html | 0 cmd/ui/{ => v1alpha1}/template/worker.html | 0 .../template/workertemplate.html | 0 .../{ => v1alpha1}/template/workertemplate.js | 0 cmd/ui/{ => v1alpha2}/Dockerfile | 7 +- cmd/ui/v1alpha2/main.go | 37 + pkg/ui/{ => v1alpha1}/ui.go | 4 +- pkg/ui/v1alpha2/backend.go | 452 +++ pkg/ui/v1alpha2/frontend/.gitignore | 24 + pkg/ui/v1alpha2/frontend/README.md | 5 + .../frontend/build/asset-manifest.json | 9 + pkg/ui/v1alpha2/frontend/build/favicon.ico | Bin 0 -> 3870 bytes pkg/ui/v1alpha2/frontend/build/index.html | 1 + pkg/ui/v1alpha2/frontend/build/logo.png | Bin 0 -> 81189 bytes pkg/ui/v1alpha2/frontend/build/manifest.json | 15 + ...nifest.132ad270a2a06bc0699825b1f63d403c.js | 22 + .../v1alpha2/frontend/build/service-worker.js | 34 + .../build/static/css/2.dc94f09c.chunk.css | 9 + .../build/static/js/2.eeb558c1.chunk.js | 1 + .../build/static/js/main.f351e826.chunk.js | 1 + .../build/static/js/runtime~main.d653cc00.js | 1 + pkg/ui/v1alpha2/frontend/config/env.js | 93 + .../frontend/config/jest/cssTransform.js | 14 + .../frontend/config/jest/fileTransform.js | 31 + pkg/ui/v1alpha2/frontend/config/paths.js | 89 + .../frontend/config/webpack.config.js | 605 ++++ .../config/webpackDevServer.config.js | 104 + pkg/ui/v1alpha2/frontend/package.json | 140 + pkg/ui/v1alpha2/frontend/public/favicon.ico | Bin 0 -> 3870 bytes pkg/ui/v1alpha2/frontend/public/index.html | 55 + pkg/ui/v1alpha2/frontend/public/logo.png | Bin 0 -> 81189 bytes pkg/ui/v1alpha2/frontend/public/manifest.json | 15 + pkg/ui/v1alpha2/frontend/scripts/build.js | 192 ++ pkg/ui/v1alpha2/frontend/scripts/start.js | 132 + pkg/ui/v1alpha2/frontend/scripts/test.js | 60 + .../frontend/src/actions/generalActions.js | 47 + .../frontend/src/actions/hpCreateActions.js | 131 + .../frontend/src/actions/hpMonitorActions.js | 45 + .../frontend/src/actions/nasCreateActions.js | 187 + .../frontend/src/actions/nasMonitorActions.js | 30 + .../frontend/src/actions/templateActions.js | 63 + .../v1alpha2/frontend/src/components/App.jsx | 47 + .../frontend/src/components/HP/Create/HP.jsx | 38 + .../src/components/HP/Create/HPParameters.jsx | 185 + .../components/HP/Create/Params/Algorithm.jsx | 160 + .../HP/Create/Params/CommonMeta.jsx | 75 + .../HP/Create/Params/CommonSpec.jsx | 76 + .../components/HP/Create/Params/Objective.jsx | 134 + .../HP/Create/Params/Parameters.jsx | 214 ++ .../src/components/HP/Create/Params/Trial.jsx | 102 + .../src/components/HP/Create/YAML.jsx | 82 + .../src/components/HP/Monitor/FilterPanel.jsx | 81 + .../src/components/HP/Monitor/HPJobInfo.jsx | 71 + .../src/components/HP/Monitor/HPJobList.jsx | 92 + .../components/HP/Monitor/HPJobMonitor.jsx | 38 + .../src/components/HP/Monitor/HPJobPlot.jsx | 92 + .../src/components/HP/Monitor/HPJobTable.jsx | 86 + .../components/HP/Monitor/TrialInfoDialog.jsx | 88 + .../src/components/Menu/DeleteDialog.jsx | 58 + .../frontend/src/components/Menu/Header.jsx | 56 + .../frontend/src/components/Menu/Main.jsx | 73 + .../frontend/src/components/Menu/Menu.jsx | 186 + .../frontend/src/components/Menu/Snack.jsx | 66 + .../src/components/NAS/Create/NAS.jsx | 38 + .../components/NAS/Create/NASParameters.jsx | 202 ++ .../NAS/Create/Params/Algorithm.jsx | 160 + .../NAS/Create/Params/CommonMeta.jsx | 75 + .../NAS/Create/Params/CommonSpec.jsx | 76 + .../NAS/Create/Params/NASConfig.jsx | 421 +++ .../NAS/Create/Params/Objective.jsx | 134 + .../components/NAS/Create/Params/Trial.jsx | 102 + .../src/components/NAS/Create/YAML.jsx | 83 + .../components/NAS/Monitor/FilterPanel.jsx | 81 + .../src/components/NAS/Monitor/NASJobInfo.jsx | 90 + .../src/components/NAS/Monitor/NASJobList.jsx | 92 + .../components/NAS/Monitor/NASJobMonitor.jsx | 39 + .../components/NAS/Monitor/NASJobStepInfo.jsx | 61 + .../src/components/Templates/Collector.jsx | 53 + .../components/Templates/Common/AddDialog.jsx | 120 + .../Templates/Common/DeleteDialog.jsx | 71 + .../Templates/Common/EditDialog.jsx | 110 + .../Templates/Common/TemplateList.jsx | 65 + .../Templates/Common/TemplatePanel.jsx | 91 + .../src/components/Templates/Trial.jsx | 52 + pkg/ui/v1alpha2/frontend/src/index.js | 54 + .../v1alpha2/frontend/src/reducers/general.js | 105 + .../frontend/src/reducers/hpCreate.js | 248 ++ .../frontend/src/reducers/hpMonitor.js | 107 + .../v1alpha2/frontend/src/reducers/index.js | 18 + .../frontend/src/reducers/nasCreate.js | 562 +++ .../frontend/src/reducers/nasMonitor.js | 95 + .../frontend/src/reducers/template.js | 137 + pkg/ui/v1alpha2/frontend/src/sagas/index.js | 690 ++++ pkg/ui/v1alpha2/frontend/src/serviceWorker.js | 135 + pkg/ui/v1alpha2/frontend/src/store/index.js | 24 + pkg/ui/v1alpha2/types.go | 56 + pkg/ui/v1alpha2/util.go | 140 + prow_config.yaml | 16 +- scripts/v1alpha1/build.sh | 2 +- scripts/v1alpha2/build.sh | 5 + test/scripts/v1alpha1/build-ui.sh | 5 +- test/scripts/v1alpha2/build-ui.sh | 9 +- .../awalterschulze/gographviz/AUTHORS | 15 + .../awalterschulze/gographviz/CONTRIBUTORS | 2 + .../awalterschulze/gographviz/LICENSE | 46 + .../awalterschulze/gographviz/analyse.go | 171 + .../awalterschulze/gographviz/ast/ast.go | 680 ++++ .../awalterschulze/gographviz/attr.go | 559 +++ .../awalterschulze/gographviz/attrs.go | 99 + .../awalterschulze/gographviz/catch.go | 101 + .../awalterschulze/gographviz/edges.go | 119 + .../awalterschulze/gographviz/escape.go | 192 ++ .../awalterschulze/gographviz/gographviz.go | 58 + .../awalterschulze/gographviz/graph.go | 148 + .../gographviz/internal/errors/errors.go | 56 + .../gographviz/internal/lexer/acttab.go | 587 ++++ .../gographviz/internal/lexer/lexer.go | 328 ++ .../internal/lexer/transitiontable.go | 3017 +++++++++++++++++ .../gographviz/internal/parser/action.go | 51 + .../gographviz/internal/parser/actiontable.go | 152 + .../gographviz/internal/parser/gototable.go | 56 + .../gographviz/internal/parser/main.go | 72 + .../gographviz/internal/parser/parser.go | 212 ++ .../internal/parser/productionstable.go | 623 ++++ .../gographviz/internal/token/token.go | 104 + .../awalterschulze/gographviz/nodes.go | 61 + .../awalterschulze/gographviz/relations.go | 53 + .../awalterschulze/gographviz/subgraphs.go | 64 + .../awalterschulze/gographviz/write.go | 172 + 159 files changed, 17195 insertions(+), 22 deletions(-) create mode 100644 cmd/ui/v1alpha1/Dockerfile rename cmd/ui/{ => v1alpha1}/main.go (96%) rename cmd/ui/{ => v1alpha1}/static/css/bootstrap.css (100%) rename cmd/ui/{ => v1alpha1}/static/css/c3.min.css (100%) rename cmd/ui/{ => v1alpha1}/static/css/codemirror.css (100%) rename cmd/ui/{ => v1alpha1}/static/css/dropmenu.css (100%) rename cmd/ui/{ => v1alpha1}/static/css/editmodal.css (100%) rename cmd/ui/{ => v1alpha1}/static/css/linegraph.css (100%) rename cmd/ui/{ => v1alpha1}/static/css/loader.css (100%) rename cmd/ui/{ => v1alpha1}/static/css/parallelcood.css (100%) rename cmd/ui/{ => v1alpha1}/static/css/profile.css (100%) rename cmd/ui/{ => v1alpha1}/static/img/favicon.ico (100%) rename cmd/ui/{ => v1alpha1}/static/img/klogo.svg (100%) rename cmd/ui/{ => v1alpha1}/static/js/autorefresh.js (100%) rename cmd/ui/{ => v1alpha1}/static/js/bootstrap.js (100%) rename cmd/ui/{ => v1alpha1}/static/js/c3.min.js (100%) rename cmd/ui/{ => v1alpha1}/static/js/codemirror.js (100%) rename cmd/ui/{ => v1alpha1}/static/js/yaml.js (100%) rename cmd/ui/{ => v1alpha1}/template/index.html (100%) rename cmd/ui/{ => v1alpha1}/template/layout.html (100%) rename cmd/ui/{ => v1alpha1}/template/linegraph.js (100%) rename cmd/ui/{ => v1alpha1}/template/metricscollectortemplate.html (100%) rename cmd/ui/{ => v1alpha1}/template/metricscollectortemplate.js (100%) rename cmd/ui/{ => v1alpha1}/template/navbar.html (100%) rename cmd/ui/{ => v1alpha1}/template/parallelcood.js (100%) rename cmd/ui/{ => v1alpha1}/template/study.html (100%) rename cmd/ui/{ => v1alpha1}/template/studyjobgen.html (100%) rename cmd/ui/{ => v1alpha1}/template/studyjobgen.js (100%) rename cmd/ui/{ => v1alpha1}/template/trial.html (100%) rename cmd/ui/{ => v1alpha1}/template/worker.html (100%) rename cmd/ui/{ => v1alpha1}/template/workertemplate.html (100%) rename cmd/ui/{ => v1alpha1}/template/workertemplate.js (100%) rename cmd/ui/{ => v1alpha2}/Dockerfile (64%) create mode 100644 cmd/ui/v1alpha2/main.go rename pkg/ui/{ => v1alpha1}/ui.go (99%) create mode 100644 pkg/ui/v1alpha2/backend.go create mode 100755 pkg/ui/v1alpha2/frontend/.gitignore create mode 100755 pkg/ui/v1alpha2/frontend/README.md create mode 100644 pkg/ui/v1alpha2/frontend/build/asset-manifest.json create mode 100755 pkg/ui/v1alpha2/frontend/build/favicon.ico create mode 100644 pkg/ui/v1alpha2/frontend/build/index.html create mode 100644 pkg/ui/v1alpha2/frontend/build/logo.png create mode 100755 pkg/ui/v1alpha2/frontend/build/manifest.json create mode 100644 pkg/ui/v1alpha2/frontend/build/precache-manifest.132ad270a2a06bc0699825b1f63d403c.js create mode 100644 pkg/ui/v1alpha2/frontend/build/service-worker.js create mode 100644 pkg/ui/v1alpha2/frontend/build/static/css/2.dc94f09c.chunk.css create mode 100644 pkg/ui/v1alpha2/frontend/build/static/js/2.eeb558c1.chunk.js create mode 100644 pkg/ui/v1alpha2/frontend/build/static/js/main.f351e826.chunk.js create mode 100644 pkg/ui/v1alpha2/frontend/build/static/js/runtime~main.d653cc00.js create mode 100644 pkg/ui/v1alpha2/frontend/config/env.js create mode 100644 pkg/ui/v1alpha2/frontend/config/jest/cssTransform.js create mode 100644 pkg/ui/v1alpha2/frontend/config/jest/fileTransform.js create mode 100644 pkg/ui/v1alpha2/frontend/config/paths.js create mode 100644 pkg/ui/v1alpha2/frontend/config/webpack.config.js create mode 100644 pkg/ui/v1alpha2/frontend/config/webpackDevServer.config.js create mode 100644 pkg/ui/v1alpha2/frontend/package.json create mode 100755 pkg/ui/v1alpha2/frontend/public/favicon.ico create mode 100755 pkg/ui/v1alpha2/frontend/public/index.html create mode 100644 pkg/ui/v1alpha2/frontend/public/logo.png create mode 100755 pkg/ui/v1alpha2/frontend/public/manifest.json create mode 100644 pkg/ui/v1alpha2/frontend/scripts/build.js create mode 100644 pkg/ui/v1alpha2/frontend/scripts/start.js create mode 100644 pkg/ui/v1alpha2/frontend/scripts/test.js create mode 100644 pkg/ui/v1alpha2/frontend/src/actions/generalActions.js create mode 100644 pkg/ui/v1alpha2/frontend/src/actions/hpCreateActions.js create mode 100644 pkg/ui/v1alpha2/frontend/src/actions/hpMonitorActions.js create mode 100644 pkg/ui/v1alpha2/frontend/src/actions/nasCreateActions.js create mode 100644 pkg/ui/v1alpha2/frontend/src/actions/nasMonitorActions.js create mode 100644 pkg/ui/v1alpha2/frontend/src/actions/templateActions.js create mode 100644 pkg/ui/v1alpha2/frontend/src/components/App.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Create/HP.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Create/HPParameters.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Algorithm.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/CommonMeta.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/CommonSpec.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Objective.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Parameters.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Trial.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Create/YAML.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/FilterPanel.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobInfo.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobList.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobMonitor.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobPlot.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobTable.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Menu/DeleteDialog.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Menu/Header.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Menu/Main.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Menu/Menu.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Menu/Snack.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Create/NAS.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Create/NASParameters.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Algorithm.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/CommonMeta.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/CommonSpec.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/NASConfig.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Objective.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Trial.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Create/YAML.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/FilterPanel.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobInfo.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobList.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Templates/Collector.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Templates/Common/AddDialog.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Templates/Common/DeleteDialog.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Templates/Common/EditDialog.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Templates/Common/TemplateList.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Templates/Common/TemplatePanel.jsx create mode 100644 pkg/ui/v1alpha2/frontend/src/components/Templates/Trial.jsx create mode 100755 pkg/ui/v1alpha2/frontend/src/index.js create mode 100644 pkg/ui/v1alpha2/frontend/src/reducers/general.js create mode 100644 pkg/ui/v1alpha2/frontend/src/reducers/hpCreate.js create mode 100644 pkg/ui/v1alpha2/frontend/src/reducers/hpMonitor.js create mode 100644 pkg/ui/v1alpha2/frontend/src/reducers/index.js create mode 100644 pkg/ui/v1alpha2/frontend/src/reducers/nasCreate.js create mode 100644 pkg/ui/v1alpha2/frontend/src/reducers/nasMonitor.js create mode 100644 pkg/ui/v1alpha2/frontend/src/reducers/template.js create mode 100644 pkg/ui/v1alpha2/frontend/src/sagas/index.js create mode 100755 pkg/ui/v1alpha2/frontend/src/serviceWorker.js create mode 100644 pkg/ui/v1alpha2/frontend/src/store/index.js create mode 100644 pkg/ui/v1alpha2/types.go create mode 100644 pkg/ui/v1alpha2/util.go create mode 100644 vendor/github.com/awalterschulze/gographviz/AUTHORS create mode 100644 vendor/github.com/awalterschulze/gographviz/CONTRIBUTORS create mode 100644 vendor/github.com/awalterschulze/gographviz/LICENSE create mode 100644 vendor/github.com/awalterschulze/gographviz/analyse.go create mode 100644 vendor/github.com/awalterschulze/gographviz/ast/ast.go create mode 100644 vendor/github.com/awalterschulze/gographviz/attr.go create mode 100644 vendor/github.com/awalterschulze/gographviz/attrs.go create mode 100644 vendor/github.com/awalterschulze/gographviz/catch.go create mode 100644 vendor/github.com/awalterschulze/gographviz/edges.go create mode 100644 vendor/github.com/awalterschulze/gographviz/escape.go create mode 100644 vendor/github.com/awalterschulze/gographviz/gographviz.go create mode 100644 vendor/github.com/awalterschulze/gographviz/graph.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/errors/errors.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/lexer/acttab.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/lexer/lexer.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/lexer/transitiontable.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/parser/action.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/parser/actiontable.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/parser/gototable.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/parser/main.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/parser/parser.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/parser/productionstable.go create mode 100644 vendor/github.com/awalterschulze/gographviz/internal/token/token.go create mode 100644 vendor/github.com/awalterschulze/gographviz/nodes.go create mode 100644 vendor/github.com/awalterschulze/gographviz/relations.go create mode 100644 vendor/github.com/awalterschulze/gographviz/subgraphs.go create mode 100644 vendor/github.com/awalterschulze/gographviz/write.go diff --git a/Gopkg.lock b/Gopkg.lock index db9b9928a15..137d1d9b3de 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -33,6 +33,21 @@ pruneopts = "NUT" revision = "de5bf2ad457846296e2031421a34e2568e304e35" +[[projects]] + digest = "1:19c2dd79ebd83f79c358ed8890f7ff9f10060268f9051f39f5ea65c74045b59f" + name = "github.com/awalterschulze/gographviz" + packages = [ + ".", + "ast", + "internal/errors", + "internal/lexer", + "internal/parser", + "internal/token", + ] + pruneopts = "NUT" + revision = "c84395e536e1a1199093a4e6253d1bee99e4cd2a" + version = "v2.0" + [[projects]] digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" name = "github.com/davecgh/go-spew" @@ -1139,7 +1154,9 @@ analyzer-version = 1 input-imports = [ "git.apache.org/thrift.git/lib/go/thrift", + "github.com/awalterschulze/gographviz", "github.com/emicklei/go-restful", + "github.com/ghodss/yaml", "github.com/go-sql-driver/mysql", "github.com/golang/glog", "github.com/golang/mock/gomock", diff --git a/Gopkg.toml b/Gopkg.toml index 174c651d902..f9cf4a8bffd 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -92,6 +92,10 @@ required = [ name = "github.com/kubeflow/pytorch-operator" version = "0.5.0-rc.1" +[[constraint]] + name = "github.com/awalterschulze/gographviz" + branch = "master" + [[prune.project]] name = "github.com/kubeflow/katib" unused-packages = false diff --git a/cmd/ui/v1alpha1/Dockerfile b/cmd/ui/v1alpha1/Dockerfile new file mode 100644 index 00000000000..2bff29eed95 --- /dev/null +++ b/cmd/ui/v1alpha1/Dockerfile @@ -0,0 +1,14 @@ +FROM golang:alpine AS build-env +# The GOPATH in the image is /go. +ADD . /go/src/github.com/kubeflow/katib +WORKDIR /go/src/github.com/kubeflow/katib/cmd/ui +RUN go build -o katib-ui ./v1alpha1 + +FROM alpine:3.7 +WORKDIR /app +# v1alpha1 source code +COPY --from=build-env /go/src/github.com/kubeflow/katib/cmd/ui/katib-ui /app/ +COPY cmd/ui/v1alpha1/static /app/static +COPY cmd/ui/v1alpha1/template /app/template + +ENTRYPOINT ["./katib-ui"] \ No newline at end of file diff --git a/cmd/ui/main.go b/cmd/ui/v1alpha1/main.go similarity index 96% rename from cmd/ui/main.go rename to cmd/ui/v1alpha1/main.go index 5da500259b6..179bc1c8144 100644 --- a/cmd/ui/main.go +++ b/cmd/ui/v1alpha1/main.go @@ -1,9 +1,10 @@ package main import ( - "github.com/kubeflow/katib/pkg/ui" - "github.com/pressly/chi" "net/http" + + "github.com/kubeflow/katib/pkg/ui/v1alpha1" + "github.com/pressly/chi" ) func main() { diff --git a/cmd/ui/static/css/bootstrap.css b/cmd/ui/v1alpha1/static/css/bootstrap.css similarity index 100% rename from cmd/ui/static/css/bootstrap.css rename to cmd/ui/v1alpha1/static/css/bootstrap.css diff --git a/cmd/ui/static/css/c3.min.css b/cmd/ui/v1alpha1/static/css/c3.min.css similarity index 100% rename from cmd/ui/static/css/c3.min.css rename to cmd/ui/v1alpha1/static/css/c3.min.css diff --git a/cmd/ui/static/css/codemirror.css b/cmd/ui/v1alpha1/static/css/codemirror.css similarity index 100% rename from cmd/ui/static/css/codemirror.css rename to cmd/ui/v1alpha1/static/css/codemirror.css diff --git a/cmd/ui/static/css/dropmenu.css b/cmd/ui/v1alpha1/static/css/dropmenu.css similarity index 100% rename from cmd/ui/static/css/dropmenu.css rename to cmd/ui/v1alpha1/static/css/dropmenu.css diff --git a/cmd/ui/static/css/editmodal.css b/cmd/ui/v1alpha1/static/css/editmodal.css similarity index 100% rename from cmd/ui/static/css/editmodal.css rename to cmd/ui/v1alpha1/static/css/editmodal.css diff --git a/cmd/ui/static/css/linegraph.css b/cmd/ui/v1alpha1/static/css/linegraph.css similarity index 100% rename from cmd/ui/static/css/linegraph.css rename to cmd/ui/v1alpha1/static/css/linegraph.css diff --git a/cmd/ui/static/css/loader.css b/cmd/ui/v1alpha1/static/css/loader.css similarity index 100% rename from cmd/ui/static/css/loader.css rename to cmd/ui/v1alpha1/static/css/loader.css diff --git a/cmd/ui/static/css/parallelcood.css b/cmd/ui/v1alpha1/static/css/parallelcood.css similarity index 100% rename from cmd/ui/static/css/parallelcood.css rename to cmd/ui/v1alpha1/static/css/parallelcood.css diff --git a/cmd/ui/static/css/profile.css b/cmd/ui/v1alpha1/static/css/profile.css similarity index 100% rename from cmd/ui/static/css/profile.css rename to cmd/ui/v1alpha1/static/css/profile.css diff --git a/cmd/ui/static/img/favicon.ico b/cmd/ui/v1alpha1/static/img/favicon.ico similarity index 100% rename from cmd/ui/static/img/favicon.ico rename to cmd/ui/v1alpha1/static/img/favicon.ico diff --git a/cmd/ui/static/img/klogo.svg b/cmd/ui/v1alpha1/static/img/klogo.svg similarity index 100% rename from cmd/ui/static/img/klogo.svg rename to cmd/ui/v1alpha1/static/img/klogo.svg diff --git a/cmd/ui/static/js/autorefresh.js b/cmd/ui/v1alpha1/static/js/autorefresh.js similarity index 100% rename from cmd/ui/static/js/autorefresh.js rename to cmd/ui/v1alpha1/static/js/autorefresh.js diff --git a/cmd/ui/static/js/bootstrap.js b/cmd/ui/v1alpha1/static/js/bootstrap.js similarity index 100% rename from cmd/ui/static/js/bootstrap.js rename to cmd/ui/v1alpha1/static/js/bootstrap.js diff --git a/cmd/ui/static/js/c3.min.js b/cmd/ui/v1alpha1/static/js/c3.min.js similarity index 100% rename from cmd/ui/static/js/c3.min.js rename to cmd/ui/v1alpha1/static/js/c3.min.js diff --git a/cmd/ui/static/js/codemirror.js b/cmd/ui/v1alpha1/static/js/codemirror.js similarity index 100% rename from cmd/ui/static/js/codemirror.js rename to cmd/ui/v1alpha1/static/js/codemirror.js diff --git a/cmd/ui/static/js/yaml.js b/cmd/ui/v1alpha1/static/js/yaml.js similarity index 100% rename from cmd/ui/static/js/yaml.js rename to cmd/ui/v1alpha1/static/js/yaml.js diff --git a/cmd/ui/template/index.html b/cmd/ui/v1alpha1/template/index.html similarity index 100% rename from cmd/ui/template/index.html rename to cmd/ui/v1alpha1/template/index.html diff --git a/cmd/ui/template/layout.html b/cmd/ui/v1alpha1/template/layout.html similarity index 100% rename from cmd/ui/template/layout.html rename to cmd/ui/v1alpha1/template/layout.html diff --git a/cmd/ui/template/linegraph.js b/cmd/ui/v1alpha1/template/linegraph.js similarity index 100% rename from cmd/ui/template/linegraph.js rename to cmd/ui/v1alpha1/template/linegraph.js diff --git a/cmd/ui/template/metricscollectortemplate.html b/cmd/ui/v1alpha1/template/metricscollectortemplate.html similarity index 100% rename from cmd/ui/template/metricscollectortemplate.html rename to cmd/ui/v1alpha1/template/metricscollectortemplate.html diff --git a/cmd/ui/template/metricscollectortemplate.js b/cmd/ui/v1alpha1/template/metricscollectortemplate.js similarity index 100% rename from cmd/ui/template/metricscollectortemplate.js rename to cmd/ui/v1alpha1/template/metricscollectortemplate.js diff --git a/cmd/ui/template/navbar.html b/cmd/ui/v1alpha1/template/navbar.html similarity index 100% rename from cmd/ui/template/navbar.html rename to cmd/ui/v1alpha1/template/navbar.html diff --git a/cmd/ui/template/parallelcood.js b/cmd/ui/v1alpha1/template/parallelcood.js similarity index 100% rename from cmd/ui/template/parallelcood.js rename to cmd/ui/v1alpha1/template/parallelcood.js diff --git a/cmd/ui/template/study.html b/cmd/ui/v1alpha1/template/study.html similarity index 100% rename from cmd/ui/template/study.html rename to cmd/ui/v1alpha1/template/study.html diff --git a/cmd/ui/template/studyjobgen.html b/cmd/ui/v1alpha1/template/studyjobgen.html similarity index 100% rename from cmd/ui/template/studyjobgen.html rename to cmd/ui/v1alpha1/template/studyjobgen.html diff --git a/cmd/ui/template/studyjobgen.js b/cmd/ui/v1alpha1/template/studyjobgen.js similarity index 100% rename from cmd/ui/template/studyjobgen.js rename to cmd/ui/v1alpha1/template/studyjobgen.js diff --git a/cmd/ui/template/trial.html b/cmd/ui/v1alpha1/template/trial.html similarity index 100% rename from cmd/ui/template/trial.html rename to cmd/ui/v1alpha1/template/trial.html diff --git a/cmd/ui/template/worker.html b/cmd/ui/v1alpha1/template/worker.html similarity index 100% rename from cmd/ui/template/worker.html rename to cmd/ui/v1alpha1/template/worker.html diff --git a/cmd/ui/template/workertemplate.html b/cmd/ui/v1alpha1/template/workertemplate.html similarity index 100% rename from cmd/ui/template/workertemplate.html rename to cmd/ui/v1alpha1/template/workertemplate.html diff --git a/cmd/ui/template/workertemplate.js b/cmd/ui/v1alpha1/template/workertemplate.js similarity index 100% rename from cmd/ui/template/workertemplate.js rename to cmd/ui/v1alpha1/template/workertemplate.js diff --git a/cmd/ui/Dockerfile b/cmd/ui/v1alpha2/Dockerfile similarity index 64% rename from cmd/ui/Dockerfile rename to cmd/ui/v1alpha2/Dockerfile index 4c906cc8966..4dbd192f8e3 100644 --- a/cmd/ui/Dockerfile +++ b/cmd/ui/v1alpha2/Dockerfile @@ -2,11 +2,12 @@ FROM golang:alpine AS build-env # The GOPATH in the image is /go. ADD . /go/src/github.com/kubeflow/katib WORKDIR /go/src/github.com/kubeflow/katib/cmd/ui -RUN go build -o katib-ui +RUN go build -o katib-ui ./v1alpha2 FROM alpine:3.7 WORKDIR /app +# v1alpha2 source code COPY --from=build-env /go/src/github.com/kubeflow/katib/cmd/ui/katib-ui /app/ -COPY cmd/ui/static /app/static -COPY cmd/ui/template /app/template +COPY --from=build-env /go/src/github.com/kubeflow/katib/pkg/ui/v1alpha2/frontend/build/ /app/build + ENTRYPOINT ["./katib-ui"] diff --git a/cmd/ui/v1alpha2/main.go b/cmd/ui/v1alpha2/main.go new file mode 100644 index 00000000000..cf1193fd074 --- /dev/null +++ b/cmd/ui/v1alpha2/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "net/http" + + ui "github.com/kubeflow/katib/pkg/ui/v1alpha2" +) + +var ( + port = "80" +) + +func main() { + kuh := ui.NewKatibUIHandler() + + frontend := http.FileServer(http.Dir("/app/build/")) + http.Handle("/katib/", http.StripPrefix("/katib/", frontend)) + + http.HandleFunc("/katib/fetch_hp_jobs/", kuh.FetchHPJobs) + http.HandleFunc("/katib/fetch_nas_jobs/", kuh.FetchNASJobs) + http.HandleFunc("/katib/submit_yaml/", kuh.SubmitYamlJob) + http.HandleFunc("/katib/submit_hp_job/", kuh.SubmitParamsJob) + http.HandleFunc("/katib/submit_nas_job/", kuh.SubmitParamsJob) + + //TODO: Add it in Katib client + http.HandleFunc("/katib/delete_experiment/", kuh.DeleteExperiment) + + http.HandleFunc("/katib/fetch_hp_job_info/", kuh.FetchHPJobInfo) + http.HandleFunc("/katib/fetch_hp_job_trial_info/", kuh.FetchHPJobTrialInfo) + http.HandleFunc("/katib/fetch_nas_job_info/", kuh.FetchNASJobInfo) + + http.HandleFunc("/katib/fetch_trial_templates/", kuh.FetchTrialTemplates) + http.HandleFunc("/katib/fetch_collector_templates/", kuh.FetchMetricsCollectorTemplates) + http.HandleFunc("/katib/update_template/", kuh.AddEditDeleteTemplate) + + http.ListenAndServe(":"+port, nil) +} diff --git a/pkg/ui/ui.go b/pkg/ui/v1alpha1/ui.go similarity index 99% rename from pkg/ui/ui.go rename to pkg/ui/v1alpha1/ui.go index d1fec49119a..18804affbad 100644 --- a/pkg/ui/ui.go +++ b/pkg/ui/v1alpha1/ui.go @@ -11,7 +11,7 @@ import ( common "github.com/kubeflow/katib/pkg/common/v1alpha1" studyjobv1alpha1 "github.com/kubeflow/katib/pkg/api/operators/apis/studyjob/v1alpha1" - "github.com/kubeflow/katib/pkg/api/v1alpha1" + api "github.com/kubeflow/katib/pkg/api/v1alpha1" "github.com/kubeflow/katib/pkg/manager/v1alpha1/studyjobclient" "github.com/pressly/chi" @@ -375,7 +375,7 @@ func (k *KatibUIHandler) MetricsCollectorTemplate(w http.ResponseWriter, r *http MetricsCollectorTemplate map[string]string } mtv := MetricsCollectorTemplateView{ - IDList: &IDList{}, + IDList: &IDList{}, MetricsCollectorTemplate: mt, } if err != nil { diff --git a/pkg/ui/v1alpha2/backend.go b/pkg/ui/v1alpha2/backend.go new file mode 100644 index 00000000000..fc34feabcde --- /dev/null +++ b/pkg/ui/v1alpha2/backend.go @@ -0,0 +1,452 @@ +package ui + +import ( + "context" + "encoding/json" + "log" + "net/http" + "strconv" + "strings" + "time" + + experimentv1alpha2 "github.com/kubeflow/katib/pkg/api/operators/apis/experiment/v1alpha2" + api_pb_v1alpha2 "github.com/kubeflow/katib/pkg/api/v1alpha2" + common_v1alpha2 "github.com/kubeflow/katib/pkg/common/v1alpha2" + + "github.com/kubeflow/katib/pkg/util/v1alpha2/katibclient" + "google.golang.org/grpc" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/ghodss/yaml" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func NewKatibUIHandler() *KatibUIHandler { + kclient, err := katibclient.NewClient(client.Options{}) + if err != nil { + log.Printf("NewClient for Katib failed: %v", err) + panic(err) + } + return &KatibUIHandler{ + katibClient: kclient, + } +} + +func (k *KatibUIHandler) connectManager() (*grpc.ClientConn, api_pb_v1alpha2.ManagerClient) { + conn, err := grpc.Dial(common_v1alpha2.ManagerAddr, grpc.WithInsecure()) + if err != nil { + log.Printf("Dial to GRPC failed: %v", err) + return nil, nil + } + c := api_pb_v1alpha2.NewManagerClient(conn) + return conn, c +} + +func (k *KatibUIHandler) FetchHPJobs(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + + jobs := make([]JobView, 0) + + el, err := k.katibClient.GetExperimentList() + if err != nil { + log.Printf("GetExperimentList for HP failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + for _, experiment := range el.Items { + if experiment.Spec.Parameters != nil { + experimentLastCondition, err := experiment.GetLastConditionType() + if err != nil { + log.Printf("GetLastConditionType for HP failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + jobs = append(jobs, JobView{ + Name: experiment.Name, + Status: string(experimentLastCondition), + }) + } + } + + response, err := json.Marshal(jobs) + if err != nil { + log.Printf("Marshal HP jobs failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) + +} + +func (k *KatibUIHandler) FetchNASJobs(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + + jobs := make([]JobView, 0) + + el, err := k.katibClient.GetExperimentList() + if err != nil { + log.Printf("GetExperimentList for NAS failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + for _, experiment := range el.Items { + if experiment.Spec.NasConfig != nil { + experimentLastCondition, err := experiment.GetLastConditionType() + if err != nil { + log.Printf("GetLastConditionType for HP failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + jobs = append(jobs, JobView{ + Name: experiment.Name, + Status: string(experimentLastCondition), + }) + } + } + + response, err := json.Marshal(jobs) + if err != nil { + log.Printf("Marshal NAS jobs failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) + +} + +func (k *KatibUIHandler) SubmitYamlJob(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + var data map[string]interface{} + + json.NewDecoder(r.Body).Decode(&data) + + job := experimentv1alpha2.Experiment{} + if yamlContent, ok := data["yaml"].(string); ok { + err := yaml.Unmarshal([]byte(yamlContent), &job) + if err != nil { + log.Printf("Unmarshal YAML content failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + err = k.katibClient.CreateExperiment(&job) + if err != nil { + log.Printf("CreateExperiment from YAML failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } + +} + +func (k *KatibUIHandler) SubmitParamsJob(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + var data map[string]interface{} + + json.NewDecoder(r.Body).Decode(&data) + if data, ok := data["postData"]; ok { + jsonbody, err := json.Marshal(data) + if err != nil { + log.Printf("Marshal data for HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + job := experimentv1alpha2.Experiment{} + if err := json.Unmarshal(jsonbody, &job); err != nil { + log.Printf("Unmarshal HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + dataMap := data.(map[string]interface{}) + job.TypeMeta = metav1.TypeMeta{ + APIVersion: "kubeflow.org/v1alpha2", + Kind: "Experiment", + } + job.ObjectMeta = metav1.ObjectMeta{ + Name: dataMap["metadata"].(map[string]interface{})["name"].(string), + Namespace: dataMap["metadata"].(map[string]interface{})["namespace"].(string), + } + err = k.katibClient.CreateExperiment(&job) + if err != nil { + log.Printf("CreateExperiment for HP failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } +} + +// TODO: Add delete job to Katib Client +func (k *KatibUIHandler) DeleteExperiment(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + experimentName := r.URL.Query()["experimentName"][0] + log.Printf("Experiment Name: %v", experimentName) +} + +func (k *KatibUIHandler) FetchHPJobInfo(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + experimentName := r.URL.Query()["experimentName"][0] + + conn, c := k.connectManager() + defer conn.Close() + + resultText := "trialName" + expResp, err := c.GetExperiment( + context.Background(), + &api_pb_v1alpha2.GetExperimentRequest{ + ExperimentName: experimentName, + }, + ) + if err != nil { + log.Printf("GetExperiment from HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + log.Printf("Got Experiment") + metricsList := map[string]int{} + metricsName := expResp.Experiment.Spec.Objective.ObjectiveMetricName + resultText += "," + metricsName + metricsList[metricsName] = 0 + for i, m := range expResp.Experiment.Spec.Objective.AdditionalMetricNames { + resultText += "," + m + metricsList[m] = i + 1 + } + log.Printf("Got metrics names") + paramList := map[string]int{} + for i, p := range expResp.Experiment.Spec.ParameterSpecs.Parameters { + resultText += "," + p.Name + paramList[p.Name] = i + len(metricsList) + } + log.Printf("Got Parameters names") + + trialListResp, err := c.GetTrialList( + context.Background(), + &api_pb_v1alpha2.GetTrialListRequest{ + ExperimentName: experimentName, + Filter: "", + }, + ) + if err != nil { + log.Printf("GetTrialList from HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + log.Printf("Got Trial List") + + resultText += "\n" + + for _, t := range trialListResp.Trials { + + obsLogResp, err := c.GetObservationLog( + context.Background(), + &api_pb_v1alpha2.GetObservationLogRequest{ + TrialName: t.Name, + StartTime: "", + EndTime: "", + }, + ) + if err != nil { + log.Printf("GetObservationLog from HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + trialResText := make([]string, len(metricsList)+len(paramList)) + for _, m := range obsLogResp.ObservationLog.MetricLogs { + trialResText[metricsList[m.Metric.Name]] = m.Metric.Value + + } + for _, trialParam := range t.Spec.ParameterAssignments.Assignments { + trialResText[paramList[trialParam.Name]] = trialParam.Value + } + resultText += t.Name + "," + strings.Join(trialResText, ",") + "\n" + } + log.Printf("Logs parsed, result: %v", resultText) + response, err := json.Marshal(resultText) + if err != nil { + log.Printf("Marshal result text for HP job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) + +} + +func (k *KatibUIHandler) FetchHPJobTrialInfo(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + trialName := r.URL.Query()["trialName"][0] + conn, c := k.connectManager() + defer conn.Close() + + resultText := "metricName,time,value\n" + obsLogResp, err := c.GetObservationLog( + context.Background(), + &api_pb_v1alpha2.GetObservationLogRequest{ + TrialName: trialName, + StartTime: "", + EndTime: "", + }, + ) + if err != nil { + log.Printf("GetObservationLog failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + prevTime := "" + for _, m := range obsLogResp.ObservationLog.MetricLogs { + parsedTime, _ := time.Parse(time.RFC3339Nano, m.TimeStamp) + formatTime := parsedTime.Format("2006-01-02T15:4:5") + if formatTime != prevTime { + resultText += m.Metric.Name + "," + formatTime + "," + m.Metric.Value + "\n" + prevTime = formatTime + } + } + + response, err := json.Marshal(resultText) + if err != nil { + log.Printf("Marshal result text in Trial info failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +func (k *KatibUIHandler) FetchNASJobInfo(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + experimentName := r.URL.Query()["experimentName"][0] + + responseRaw := make([]NNView, 0) + var architecture string + var decoder string + + conn, c := k.connectManager() + + defer conn.Close() + + trialListResp, err := c.GetTrialList( + context.Background(), + &api_pb_v1alpha2.GetTrialListRequest{ + ExperimentName: experimentName, + Filter: "", + }, + ) + if err != nil { + log.Printf("GetTrialList from NAS job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + log.Printf("Got Trial List") + + for i, t := range trialListResp.Trials { + + obsLogResp, err := c.GetObservationLog( + context.Background(), + &api_pb_v1alpha2.GetObservationLogRequest{ + TrialName: t.Name, + StartTime: "", + EndTime: "", + }, + ) + if err != nil { + log.Printf("GetObservationLog from NAS job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + metricsName := make([]string, 0) + metricsValue := make([]string, 0) + for _, m := range obsLogResp.ObservationLog.MetricLogs { + metricsName = append(metricsName, m.Metric.Name) + metricsValue = append(metricsValue, m.Metric.Value) + + } + for _, trialParam := range t.Spec.ParameterAssignments.Assignments { + if trialParam.Name == "architecture" { + architecture = trialParam.Value + } + if trialParam.Name == "nn_config" { + decoder = trialParam.Value + } + } + responseRaw = append(responseRaw, NNView{ + Name: "Generation " + strconv.Itoa(i), + TrialName: t.Name, + Architecture: generateNNImage(architecture, decoder), + MetricsName: metricsName, + MetricsValue: metricsValue, + }) + } + log.Printf("Logs parsed, result: %v", responseRaw) + + response, err := json.Marshal(responseRaw) + if err != nil { + log.Printf("Marshal result in NAS job failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +func (k *KatibUIHandler) FetchTrialTemplates(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + trialTemplates, err := k.katibClient.GetTrialTemplates() + if err != nil { + log.Printf("GetTrialTemplate failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + response, err := json.Marshal(getTemplatesView(trialTemplates)) + if err != nil { + log.Printf("Marshal templates failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +func (k *KatibUIHandler) FetchMetricsCollectorTemplates(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + metricsCollectorTemplates, err := k.katibClient.GetMetricsCollectorTemplates() + if err != nil { + log.Printf("GetMetricsCollectorTemplates failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + response, err := json.Marshal(getTemplatesView(metricsCollectorTemplates)) + if err != nil { + log.Printf("Marshal templates failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} + +func (k *KatibUIHandler) AddEditDeleteTemplate(w http.ResponseWriter, r *http.Request) { + //enableCors(&w) + //TODO: need to delete? + if r.Method == "OPTIONS" { + return + } + var data map[string]interface{} + var err error + var templateResponse TemplateResponse + + json.NewDecoder(r.Body).Decode(&data) + if data["action"].(string) == "delete" { + templateResponse, err = k.updateTemplates(data, true) + } else { + templateResponse, err = k.updateTemplates(data, false) + } + if err != nil { + log.Printf("updateTemplates failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + response, err := json.Marshal(templateResponse) + if err != nil { + log.Printf("Marhal failed: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Write(response) +} diff --git a/pkg/ui/v1alpha2/frontend/.gitignore b/pkg/ui/v1alpha2/frontend/.gitignore new file mode 100755 index 00000000000..13bd3e3acd0 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/.gitignore @@ -0,0 +1,24 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# package-lock +package-lock.json diff --git a/pkg/ui/v1alpha2/frontend/README.md b/pkg/ui/v1alpha2/frontend/README.md new file mode 100755 index 00000000000..d0373f0ab80 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/README.md @@ -0,0 +1,5 @@ +TODO: Add docs for Devevelopment and Production testing. + +### Development + +### Production diff --git a/pkg/ui/v1alpha2/frontend/build/asset-manifest.json b/pkg/ui/v1alpha2/frontend/build/asset-manifest.json new file mode 100644 index 00000000000..2835017cba3 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/build/asset-manifest.json @@ -0,0 +1,9 @@ +{ + "main.js": "./static/js/main.f351e826.chunk.js", + "runtime~main.js": "./static/js/runtime~main.d653cc00.js", + "static/css/2.dc94f09c.chunk.css": "./static/css/2.dc94f09c.chunk.css", + "static/js/2.eeb558c1.chunk.js": "./static/js/2.eeb558c1.chunk.js", + "index.html": "./index.html", + "precache-manifest.132ad270a2a06bc0699825b1f63d403c.js": "./precache-manifest.132ad270a2a06bc0699825b1f63d403c.js", + "service-worker.js": "./service-worker.js" +} \ No newline at end of file diff --git a/pkg/ui/v1alpha2/frontend/build/favicon.ico b/pkg/ui/v1alpha2/frontend/build/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ literal 0 HcmV?d00001 diff --git a/pkg/ui/v1alpha2/frontend/build/index.html b/pkg/ui/v1alpha2/frontend/build/index.html new file mode 100644 index 00000000000..d4048327259 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/build/index.html @@ -0,0 +1 @@ +Katib UI
\ No newline at end of file diff --git a/pkg/ui/v1alpha2/frontend/build/logo.png b/pkg/ui/v1alpha2/frontend/build/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a0120a540892c8d63fb07ce6a1bd8cc80e29b67e GIT binary patch literal 81189 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¬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:1}.anticon svg{display:inline-block}.anticon:before{display:none}.anticon .anticon-icon{display:block}.anticon[tabindex]{cursor:pointer}.anticon-spin,.anticon-spin:before{display:inline-block;-webkit-animation:loadingCircle 1s linear infinite;animation:loadingCircle 1s linear infinite}.fade-appear,.fade-enter,.fade-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.fade-appear.fade-appear-active,.fade-enter.fade-enter-active{-webkit-animation-name:antFadeIn;animation-name:antFadeIn;-webkit-animation-play-state:running;animation-play-state:running}.fade-leave.fade-leave-active{-webkit-animation-name:antFadeOut;animation-name:antFadeOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.fade-appear,.fade-enter{opacity:0}.fade-appear,.fade-enter,.fade-leave{-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes antFadeIn{0%{opacity:0}to{opacity:1}}@keyframes antFadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes antFadeOut{0%{opacity:1}to{opacity:0}}@keyframes antFadeOut{0%{opacity:1}to{opacity:0}}.move-up-appear,.move-up-enter,.move-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-up-appear.move-up-appear-active,.move-up-enter.move-up-enter-active{-webkit-animation-name:antMoveUpIn;animation-name:antMoveUpIn;-webkit-animation-play-state:running;animation-play-state:running}.move-up-leave.move-up-leave-active{-webkit-animation-name:antMoveUpOut;animation-name:antMoveUpOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-up-appear,.move-up-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-up-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-down-appear,.move-down-enter,.move-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-down-appear.move-down-appear-active,.move-down-enter.move-down-enter-active{-webkit-animation-name:antMoveDownIn;animation-name:antMoveDownIn;-webkit-animation-play-state:running;animation-play-state:running}.move-down-leave.move-down-leave-active{-webkit-animation-name:antMoveDownOut;animation-name:antMoveDownOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-down-appear,.move-down-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-down-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-left-appear,.move-left-enter,.move-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-left-appear.move-left-appear-active,.move-left-enter.move-left-enter-active{-webkit-animation-name:antMoveLeftIn;animation-name:antMoveLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.move-left-leave.move-left-leave-active{-webkit-animation-name:antMoveLeftOut;animation-name:antMoveLeftOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-left-appear,.move-left-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-left-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-right-appear,.move-right-enter,.move-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-right-appear.move-right-appear-active,.move-right-enter.move-right-enter-active{-webkit-animation-name:antMoveRightIn;animation-name:antMoveRightIn;-webkit-animation-play-state:running;animation-play-state:running}.move-right-leave.move-right-leave-active{-webkit-animation-name:antMoveRightOut;animation-name:antMoveRightOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-right-appear,.move-right-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-right-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}@-webkit-keyframes antMoveDownIn{0%{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antMoveDownIn{0%{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antMoveDownOut{0%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antMoveDownOut{0%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes antMoveLeftIn{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antMoveLeftIn{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antMoveLeftOut{0%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:translateX(-100%);transform:translateX(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antMoveLeftOut{0%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:translateX(-100%);transform:translateX(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes antMoveRightIn{0%{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antMoveRightIn{0%{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antMoveRightOut{0%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antMoveRightOut{0%{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes antMoveUpIn{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antMoveUpIn{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antMoveUpOut{0%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antMoveUpOut{0%{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes loadingCircle{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loadingCircle{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}[ant-click-animating-without-extra-node=true],[ant-click-animating=true]{position:relative}html{--antd-wave-shadow-color:#1890ff}.ant-click-animating-node,[ant-click-animating-without-extra-node=true]:after{position:absolute;top:0;right:0;bottom:0;left:0;display:block;border-radius:inherit;box-shadow:0 0 0 0 #1890ff;box-shadow:0 0 0 0 var(--antd-wave-shadow-color);opacity:.2;-webkit-animation:fadeEffect 2s cubic-bezier(.08,.82,.17,1),waveEffect .4s cubic-bezier(.08,.82,.17,1);animation:fadeEffect 2s cubic-bezier(.08,.82,.17,1),waveEffect .4s cubic-bezier(.08,.82,.17,1);-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;content:"";pointer-events:none}@-webkit-keyframes waveEffect{to{box-shadow:0 0 0 #1890ff;box-shadow:0 0 0 6px #1890ff;box-shadow:0 0 0 6px var(--antd-wave-shadow-color)}}@keyframes waveEffect{to{box-shadow:0 0 0 #1890ff;box-shadow:0 0 0 6px #1890ff;box-shadow:0 0 0 6px var(--antd-wave-shadow-color)}}@-webkit-keyframes fadeEffect{to{opacity:0}}@keyframes fadeEffect{to{opacity:0}}.slide-up-appear,.slide-up-enter,.slide-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-up-appear.slide-up-appear-active,.slide-up-enter.slide-up-enter-active{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-up-leave.slide-up-leave-active{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-up-appear,.slide-up-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-up-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-down-appear,.slide-down-enter,.slide-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-down-appear.slide-down-appear-active,.slide-down-enter.slide-down-enter-active{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-down-leave.slide-down-leave-active{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-down-appear,.slide-down-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-down-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-left-appear,.slide-left-enter,.slide-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-left-appear.slide-left-appear-active,.slide-left-enter.slide-left-enter-active{-webkit-animation-name:antSlideLeftIn;animation-name:antSlideLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-left-leave.slide-left-leave-active{-webkit-animation-name:antSlideLeftOut;animation-name:antSlideLeftOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-left-appear,.slide-left-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-left-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-right-appear,.slide-right-enter,.slide-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-right-appear.slide-right-appear-active,.slide-right-enter.slide-right-enter-active{-webkit-animation-name:antSlideRightIn;animation-name:antSlideRightIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-right-leave.slide-right-leave-active{-webkit-animation-name:antSlideRightOut;animation-name:antSlideRightOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-right-appear,.slide-right-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-right-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@-webkit-keyframes antSlideUpIn{0%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antSlideUpIn{0%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antSlideUpOut{0%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antSlideUpOut{0%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes antSlideDownIn{0%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:0}to{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:1}}@keyframes antSlideDownIn{0%{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:0}to{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:1}}@-webkit-keyframes antSlideDownOut{0%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:1}to{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:0}}@keyframes antSlideDownOut{0%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:1}to{-webkit-transform:scaleY(.8);transform:scaleY(.8);-webkit-transform-origin:100% 100%;transform-origin:100% 100%;opacity:0}}@-webkit-keyframes antSlideLeftIn{0%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antSlideLeftIn{0%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antSlideLeftOut{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antSlideLeftOut{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@-webkit-keyframes antSlideRightIn{0%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:0}to{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:1}}@keyframes antSlideRightIn{0%{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:0}to{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:1}}@-webkit-keyframes antSlideRightOut{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:1}to{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:0}}@keyframes antSlideRightOut{0%{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:1}to{-webkit-transform:scaleX(.8);transform:scaleX(.8);-webkit-transform-origin:100% 0;transform-origin:100% 0;opacity:0}}.swing-appear,.swing-enter{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.swing-appear.swing-appear-active,.swing-enter.swing-enter-active{-webkit-animation-name:antSwingIn;animation-name:antSwingIn;-webkit-animation-play-state:running;animation-play-state:running}@-webkit-keyframes antSwingIn{0%,to{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}40%{-webkit-transform:translateX(10px);transform:translateX(10px)}60%{-webkit-transform:translateX(-5px);transform:translateX(-5px)}80%{-webkit-transform:translateX(5px);transform:translateX(5px)}}@keyframes antSwingIn{0%,to{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}40%{-webkit-transform:translateX(10px);transform:translateX(10px)}60%{-webkit-transform:translateX(-5px);transform:translateX(-5px)}80%{-webkit-transform:translateX(5px);transform:translateX(5px)}}.zoom-appear,.zoom-enter,.zoom-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-appear.zoom-appear-active,.zoom-enter.zoom-enter-active{-webkit-animation-name:antZoomIn;animation-name:antZoomIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-leave.zoom-leave-active{-webkit-animation-name:antZoomOut;animation-name:antZoomOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-appear,.zoom-enter{-webkit-transform:scale(0);transform:scale(0);opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-big-appear,.zoom-big-enter,.zoom-big-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-big-appear.zoom-big-appear-active,.zoom-big-enter.zoom-big-enter-active{-webkit-animation-name:antZoomBigIn;animation-name:antZoomBigIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-big-leave.zoom-big-leave-active{-webkit-animation-name:antZoomBigOut;animation-name:antZoomBigOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-big-appear,.zoom-big-enter{-webkit-transform:scale(0);transform:scale(0);opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-big-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-big-fast-appear,.zoom-big-fast-enter,.zoom-big-fast-leave{-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-big-fast-appear.zoom-big-fast-appear-active,.zoom-big-fast-enter.zoom-big-fast-enter-active{-webkit-animation-name:antZoomBigIn;animation-name:antZoomBigIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-big-fast-leave.zoom-big-fast-leave-active{-webkit-animation-name:antZoomBigOut;animation-name:antZoomBigOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-big-fast-appear,.zoom-big-fast-enter{-webkit-transform:scale(0);transform:scale(0);opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-big-fast-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-up-appear,.zoom-up-enter,.zoom-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-up-appear.zoom-up-appear-active,.zoom-up-enter.zoom-up-enter-active{-webkit-animation-name:antZoomUpIn;animation-name:antZoomUpIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-up-leave.zoom-up-leave-active{-webkit-animation-name:antZoomUpOut;animation-name:antZoomUpOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-up-appear,.zoom-up-enter{-webkit-transform:scale(0);transform:scale(0);opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-up-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-down-appear,.zoom-down-enter,.zoom-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-down-appear.zoom-down-appear-active,.zoom-down-enter.zoom-down-enter-active{-webkit-animation-name:antZoomDownIn;animation-name:antZoomDownIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-down-leave.zoom-down-leave-active{-webkit-animation-name:antZoomDownOut;animation-name:antZoomDownOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-down-appear,.zoom-down-enter{-webkit-transform:scale(0);transform:scale(0);opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-down-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-left-appear,.zoom-left-enter,.zoom-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-left-appear.zoom-left-appear-active,.zoom-left-enter.zoom-left-enter-active{-webkit-animation-name:antZoomLeftIn;animation-name:antZoomLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-left-leave.zoom-left-leave-active{-webkit-animation-name:antZoomLeftOut;animation-name:antZoomLeftOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-left-appear,.zoom-left-enter{-webkit-transform:scale(0);transform:scale(0);opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-left-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-right-appear,.zoom-right-enter,.zoom-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-right-appear.zoom-right-appear-active,.zoom-right-enter.zoom-right-enter-active{-webkit-animation-name:antZoomRightIn;animation-name:antZoomRightIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-right-leave.zoom-right-leave-active{-webkit-animation-name:antZoomRightOut;animation-name:antZoomRightOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-right-appear,.zoom-right-enter{-webkit-transform:scale(0);transform:scale(0);opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-right-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}@-webkit-keyframes antZoomIn{0%{-webkit-transform:scale(.2);transform:scale(.2);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes antZoomIn{0%{-webkit-transform:scale(.2);transform:scale(.2);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes antZoomOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(.2);transform:scale(.2);opacity:0}}@keyframes antZoomOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(.2);transform:scale(.2);opacity:0}}@-webkit-keyframes antZoomBigIn{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes antZoomBigIn{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes antZoomBigOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}}@keyframes antZoomBigOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}}@-webkit-keyframes antZoomUpIn{0%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:50% 0;transform-origin:50% 0;opacity:0}to{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 0;transform-origin:50% 0}}@keyframes antZoomUpIn{0%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:50% 0;transform-origin:50% 0;opacity:0}to{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 0;transform-origin:50% 0}}@-webkit-keyframes antZoomUpOut{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 0;transform-origin:50% 0}to{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:50% 0;transform-origin:50% 0;opacity:0}}@keyframes antZoomUpOut{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 0;transform-origin:50% 0}to{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:50% 0;transform-origin:50% 0;opacity:0}}@-webkit-keyframes antZoomLeftIn{0%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:0 50%;transform-origin:0 50%;opacity:0}to{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:0 50%;transform-origin:0 50%}}@keyframes antZoomLeftIn{0%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:0 50%;transform-origin:0 50%;opacity:0}to{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:0 50%;transform-origin:0 50%}}@-webkit-keyframes antZoomLeftOut{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:0 50%;transform-origin:0 50%}to{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:0 50%;transform-origin:0 50%;opacity:0}}@keyframes antZoomLeftOut{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:0 50%;transform-origin:0 50%}to{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:0 50%;transform-origin:0 50%;opacity:0}}@-webkit-keyframes antZoomRightIn{0%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:100% 50%;transform-origin:100% 50%;opacity:0}to{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:100% 50%;transform-origin:100% 50%}}@keyframes antZoomRightIn{0%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:100% 50%;transform-origin:100% 50%;opacity:0}to{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:100% 50%;transform-origin:100% 50%}}@-webkit-keyframes antZoomRightOut{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:100% 50%;transform-origin:100% 50%}to{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:100% 50%;transform-origin:100% 50%;opacity:0}}@keyframes antZoomRightOut{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:100% 50%;transform-origin:100% 50%}to{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:100% 50%;transform-origin:100% 50%;opacity:0}}@-webkit-keyframes antZoomDownIn{0%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:50% 100%;transform-origin:50% 100%;opacity:0}to{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 100%;transform-origin:50% 100%}}@keyframes antZoomDownIn{0%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:50% 100%;transform-origin:50% 100%;opacity:0}to{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 100%;transform-origin:50% 100%}}@-webkit-keyframes antZoomDownOut{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 100%;transform-origin:50% 100%}to{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:50% 100%;transform-origin:50% 100%;opacity:0}}@keyframes antZoomDownOut{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 100%;transform-origin:50% 100%}to{-webkit-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:50% 100%;transform-origin:50% 100%;opacity:0}}.ant-motion-collapse-legacy{overflow:hidden}.ant-motion-collapse,.ant-motion-collapse-legacy-active{-webkit-transition:height .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1)!important;transition:height .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1)!important}.ant-motion-collapse{overflow:hidden}.ant-affix{position:fixed;z-index:10}.ant-alert{box-sizing:border-box;margin:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;padding:8px 15px 8px 37px;border-radius:4px}.ant-alert.ant-alert-no-icon{padding:8px 15px}.ant-alert.ant-alert-closable{padding-right:30px}.ant-alert-icon{position:absolute;top:11.5px;left:16px}.ant-alert-description{display:none;font-size:14px;line-height:22px}.ant-alert-success{background-color:#f6ffed;border:1px solid #b7eb8f}.ant-alert-success .ant-alert-icon{color:#52c41a}.ant-alert-info{background-color:#e6f7ff;border:1px solid #91d5ff}.ant-alert-info .ant-alert-icon{color:#1890ff}.ant-alert-warning{background-color:#fffbe6;border:1px solid #ffe58f}.ant-alert-warning .ant-alert-icon{color:#faad14}.ant-alert-error{background-color:#fff1f0;border:1px solid #ffa39e}.ant-alert-error .ant-alert-icon{color:#f5222d}.ant-alert-close-icon{position:absolute;top:8px;right:16px;overflow:hidden;font-size:12px;line-height:22px;cursor:pointer}.ant-alert-close-icon .anticon-close{color:rgba(0,0,0,.45);-webkit-transition:color .3s;transition:color .3s}.ant-alert-close-icon .anticon-close:hover{color:rgba(0,0,0,.75)}.ant-alert-close-text{position:absolute;right:16px}.ant-alert-with-description{position:relative;padding:15px 15px 15px 64px;color:rgba(0,0,0,.65);line-height:1.5;border-radius:4px}.ant-alert-with-description.ant-alert-no-icon{padding:15px}.ant-alert-with-description .ant-alert-icon{position:absolute;top:16px;left:24px;font-size:24px}.ant-alert-with-description .ant-alert-close-icon{position:absolute;top:16px;right:16px;font-size:14px;cursor:pointer}.ant-alert-with-description .ant-alert-message{display:block;margin-bottom:4px;color:rgba(0,0,0,.85);font-size:16px}.ant-alert-with-description .ant-alert-description{display:block}.ant-alert.ant-alert-close{height:0!important;margin:0;padding-top:0;padding-bottom:0;-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-alert-slide-up-leave{-webkit-animation:antAlertSlideUpOut .3s cubic-bezier(.78,.14,.15,.86);animation:antAlertSlideUpOut .3s cubic-bezier(.78,.14,.15,.86);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-alert-banner{margin-bottom:0;border:0;border-radius:0}@-webkit-keyframes antAlertSlideUpIn{0%{-webkit-transform:scaleY(0);transform:scaleY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@keyframes antAlertSlideUpIn{0%{-webkit-transform:scaleY(0);transform:scaleY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}to{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}}@-webkit-keyframes antAlertSlideUpOut{0%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:scaleY(0);transform:scaleY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}@keyframes antAlertSlideUpOut{0%{-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:1}to{-webkit-transform:scaleY(0);transform:scaleY(0);-webkit-transform-origin:0 0;transform-origin:0 0;opacity:0}}.ant-anchor{box-sizing:border-box;margin:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;padding:0 0 0 2px}.ant-anchor-wrapper{margin-left:-4px;padding-left:4px;overflow:auto;background-color:#fff}.ant-anchor-ink{position:absolute;top:0;left:0;height:100%}.ant-anchor-ink:before{position:relative;display:block;width:2px;height:100%;margin:0 auto;background-color:#e8e8e8;content:" "}.ant-anchor-ink-ball{position:absolute;left:50%;display:none;width:8px;height:8px;background-color:#fff;border:2px solid #1890ff;border-radius:8px;-webkit-transform:translateX(-50%);transform:translateX(-50%);-webkit-transition:top .3s ease-in-out;transition:top .3s ease-in-out}.ant-anchor-ink-ball.visible{display:inline-block}.ant-anchor.fixed .ant-anchor-ink .ant-anchor-ink-ball{display:none}.ant-anchor-link{padding:7px 0 7px 16px;line-height:1.143}.ant-anchor-link-title{position:relative;display:block;margin-bottom:6px;overflow:hidden;color:rgba(0,0,0,.65);white-space:nowrap;text-overflow:ellipsis;-webkit-transition:all .3s;transition:all .3s}.ant-anchor-link-title:only-child{margin-bottom:0}.ant-anchor-link-active>.ant-anchor-link-title{color:#1890ff}.ant-anchor-link .ant-anchor-link{padding-top:5px;padding-bottom:5px}.ant-select-auto-complete{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum"}.ant-select-auto-complete.ant-select .ant-select-selection{border:0;box-shadow:none}.ant-select-auto-complete.ant-select .ant-select-selection__rendered{height:100%;margin-right:0;margin-left:0;line-height:32px}.ant-select-auto-complete.ant-select .ant-select-selection__placeholder{margin-right:12px;margin-left:12px}.ant-select-auto-complete.ant-select .ant-select-selection--single{height:auto}.ant-select-auto-complete.ant-select .ant-select-search--inline{position:static;float:left}.ant-select-auto-complete.ant-select-allow-clear .ant-select-selection:hover .ant-select-selection__rendered{margin-right:0!important}.ant-select-auto-complete.ant-select .ant-input{height:32px;line-height:1.5;background:transparent;border-width:1px}.ant-select-auto-complete.ant-select .ant-input:focus,.ant-select-auto-complete.ant-select .ant-input:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-select-auto-complete.ant-select .ant-input[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1;background-color:initial}.ant-select-auto-complete.ant-select .ant-input[disabled]:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-select-auto-complete.ant-select-lg .ant-select-selection__rendered{line-height:40px}.ant-select-auto-complete.ant-select-lg .ant-input{height:40px;padding-top:6px;padding-bottom:6px}.ant-select-auto-complete.ant-select-sm .ant-select-selection__rendered{line-height:24px}.ant-select-auto-complete.ant-select-sm .ant-input{height:24px;padding-top:1px;padding-bottom:1px}.ant-input-group>.ant-select-auto-complete .ant-select-search__field.ant-input-affix-wrapper{display:inline;float:none}.ant-select{box-sizing:border-box;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;display:inline-block;outline:0}.ant-select,.ant-select ol,.ant-select ul{margin:0;padding:0;list-style:none}.ant-select>ul>li>a{padding:0;background-color:#fff}.ant-select-arrow{display:inline-block;color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;top:50%;right:11px;margin-top:-6px;color:rgba(0,0,0,.25);font-size:12px;line-height:1;-webkit-transform-origin:50% 50%;transform-origin:50% 50%}.ant-select-arrow>*{line-height:1}.ant-select-arrow svg{display:inline-block}.ant-select-arrow:before{display:none}.ant-select-arrow .ant-select-arrow-icon{display:block}.ant-select-arrow .ant-select-arrow-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-select-selection{display:block;box-sizing:border-box;background-color:#fff;border:1px solid #d9d9d9;border-top:1.02px solid #d9d9d9;border-radius:4px;outline:none;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-selection:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-select-focused .ant-select-selection,.ant-select-selection:active,.ant-select-selection:focus{border-color:#40a9ff;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-select-selection__clear{position:absolute;top:50%;right:11px;z-index:1;display:inline-block;width:12px;height:12px;margin-top:-6px;color:rgba(0,0,0,.25);font-size:12px;font-style:normal;line-height:12px;text-align:center;text-transform:none;background:#fff;cursor:pointer;opacity:0;-webkit-transition:color .3s ease,opacity .15s ease;transition:color .3s ease,opacity .15s ease;text-rendering:auto}.ant-select-selection__clear:before{display:block}.ant-select-selection__clear:hover{color:rgba(0,0,0,.45)}.ant-select-selection:hover .ant-select-selection__clear{opacity:1}.ant-select-selection-selected-value{float:left;max-width:100%;padding-right:20px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-select-no-arrow .ant-select-selection-selected-value{padding-right:0}.ant-select-disabled{color:rgba(0,0,0,.25)}.ant-select-disabled .ant-select-selection{background:#f5f5f5;cursor:not-allowed}.ant-select-disabled .ant-select-selection:active,.ant-select-disabled .ant-select-selection:focus,.ant-select-disabled .ant-select-selection:hover{border-color:#d9d9d9;box-shadow:none}.ant-select-disabled .ant-select-selection__clear{display:none;visibility:hidden;pointer-events:none}.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice{padding-right:10px;color:rgba(0,0,0,.33);background:#f5f5f5}.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice__remove{display:none}.ant-select-selection--single{position:relative;height:32px;cursor:pointer}.ant-select-selection__rendered{position:relative;display:block;margin-right:11px;margin-left:11px;line-height:30px}.ant-select-selection__rendered:after{display:inline-block;width:0;visibility:hidden;content:".";pointer-events:none}.ant-select-lg{font-size:16px}.ant-select-lg .ant-select-selection--single{height:40px}.ant-select-lg .ant-select-selection__rendered{line-height:38px}.ant-select-lg .ant-select-selection--multiple{min-height:40px}.ant-select-lg .ant-select-selection--multiple .ant-select-selection__rendered li{height:32px;line-height:32px}.ant-select-lg .ant-select-selection--multiple .ant-select-arrow,.ant-select-lg .ant-select-selection--multiple .ant-select-selection__clear{top:20px}.ant-select-sm .ant-select-selection--single{height:24px}.ant-select-sm .ant-select-selection__rendered{margin:0 7px;line-height:22px}.ant-select-sm .ant-select-selection--multiple{min-height:24px}.ant-select-sm .ant-select-selection--multiple .ant-select-selection__rendered li{height:16px;line-height:14px}.ant-select-sm .ant-select-selection--multiple .ant-select-arrow,.ant-select-sm .ant-select-selection--multiple .ant-select-selection__clear{top:12px}.ant-select-sm .ant-select-arrow,.ant-select-sm .ant-select-selection__clear{right:8px}.ant-select-disabled .ant-select-selection__choice__remove{color:rgba(0,0,0,.25);cursor:default}.ant-select-disabled .ant-select-selection__choice__remove:hover{color:rgba(0,0,0,.25)}.ant-select-search__field__wrap{position:relative;display:inline-block}.ant-select-search__field__placeholder,.ant-select-selection__placeholder{position:absolute;top:50%;right:9px;left:0;max-width:100%;height:20px;margin-top:-10px;overflow:hidden;color:#bfbfbf;line-height:20px;white-space:nowrap;text-align:left;text-overflow:ellipsis}.ant-select-search__field__placeholder{left:12px}.ant-select-search__field__mirror{position:absolute;top:0;left:0;white-space:pre;opacity:0;pointer-events:none}.ant-select-search--inline{position:absolute;width:100%;height:100%}.ant-select-search--inline .ant-select-search__field__wrap{width:100%;height:100%}.ant-select-search--inline .ant-select-search__field{width:100%;height:100%;font-size:100%;line-height:1;background:transparent;border-width:0;border-radius:4px;outline:0}.ant-select-search--inline>i{float:right}.ant-select-selection--multiple{min-height:32px;padding-bottom:3px;cursor:text;zoom:1}.ant-select-selection--multiple:after,.ant-select-selection--multiple:before{display:table;content:""}.ant-select-selection--multiple:after{clear:both}.ant-select-selection--multiple .ant-select-search--inline{position:static;float:left;width:auto;max-width:100%;padding:0}.ant-select-selection--multiple .ant-select-search--inline .ant-select-search__field{width:.75em;max-width:100%}.ant-select-selection--multiple .ant-select-selection__rendered{height:auto;margin-bottom:-3px;margin-left:5px}.ant-select-selection--multiple .ant-select-selection__placeholder{margin-left:6px}.ant-select-selection--multiple .ant-select-selection__rendered>ul>li,.ant-select-selection--multiple>ul>li{height:24px;margin-top:3px;line-height:22px}.ant-select-selection--multiple .ant-select-selection__choice{position:relative;float:left;max-width:99%;margin-right:4px;padding:0 20px 0 10px;overflow:hidden;color:rgba(0,0,0,.65);background-color:#fafafa;border:1px solid #e8e8e8;border-radius:2px;cursor:default;-webkit-transition:padding .3s cubic-bezier(.645,.045,.355,1);transition:padding .3s cubic-bezier(.645,.045,.355,1)}.ant-select-selection--multiple .ant-select-selection__choice__disabled{padding:0 10px}.ant-select-selection--multiple .ant-select-selection__choice__content{display:inline-block;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-transition:margin .3s cubic-bezier(.645,.045,.355,1);transition:margin .3s cubic-bezier(.645,.045,.355,1)}.ant-select-selection--multiple .ant-select-selection__choice__remove{color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;right:4px;color:rgba(0,0,0,.45);font-weight:700;line-height:inherit;cursor:pointer;-webkit-transition:all .3s;transition:all .3s;display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}.ant-select-selection--multiple .ant-select-selection__choice__remove>*{line-height:1}.ant-select-selection--multiple .ant-select-selection__choice__remove svg{display:inline-block}.ant-select-selection--multiple .ant-select-selection__choice__remove:before{display:none}.ant-select-selection--multiple .ant-select-selection__choice__remove .ant-select-selection--multiple .ant-select-selection__choice__remove-icon{display:block}:root .ant-select-selection--multiple .ant-select-selection__choice__remove{font-size:12px}.ant-select-selection--multiple .ant-select-selection__choice__remove:hover{color:rgba(0,0,0,.75)}.ant-select-selection--multiple .ant-select-arrow,.ant-select-selection--multiple .ant-select-selection__clear{top:16px}.ant-select-allow-clear .ant-select-selection--single .ant-select-selection-selected-value{padding-right:16px}.ant-select-allow-clear .ant-select-selection--multiple .ant-select-selection__rendered,.ant-select-show-arrow .ant-select-selection--multiple .ant-select-selection__rendered{margin-right:20px}.ant-select-open .ant-select-arrow-icon svg{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.ant-select-open .ant-select-selection{border-color:#40a9ff;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-select-combobox .ant-select-arrow{display:none}.ant-select-combobox .ant-select-search--inline{float:none;width:100%;height:100%}.ant-select-combobox .ant-select-search__field__wrap{width:100%;height:100%}.ant-select-combobox .ant-select-search__field{position:relative;z-index:1;width:100%;height:100%;box-shadow:none;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1),height 0s;transition:all .3s cubic-bezier(.645,.045,.355,1),height 0s}.ant-select-combobox.ant-select-allow-clear .ant-select-selection:hover .ant-select-selection__rendered,.ant-select-combobox.ant-select-show-arrow .ant-select-selection:hover .ant-select-selection__rendered{margin-right:20px}.ant-select-dropdown{margin:0;padding:0;color:rgba(0,0,0,.65);font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum",;position:absolute;top:-9999px;left:-9999px;z-index:1050;box-sizing:border-box;font-size:14px;font-variant:normal;background-color:#fff;border-radius:4px;outline:none;box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-bottomLeft,.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-bottomLeft{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-topLeft,.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-topLeft{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-bottomLeft{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-topLeft{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-select-dropdown-hidden{display:none}.ant-select-dropdown-menu{max-height:250px;margin-bottom:0;padding-left:0;overflow:auto;list-style:none;outline:none}.ant-select-dropdown-menu-item-group-list{margin:0;padding:0}.ant-select-dropdown-menu-item-group-list>.ant-select-dropdown-menu-item{padding-left:20px}.ant-select-dropdown-menu-item-group-title{height:32px;padding:0 12px;color:rgba(0,0,0,.45);font-size:12px;line-height:32px}.ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:first-child:not(:last-child),.ant-select-dropdown-menu-item-group:not(:last-child) .ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:last-child{border-radius:0}.ant-select-dropdown-menu-item{position:relative;display:block;padding:5px 12px;overflow:hidden;color:rgba(0,0,0,.65);font-weight:400;line-height:22px;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-select-dropdown-menu-item:hover{background-color:#e6f7ff}.ant-select-dropdown-menu-item:first-child{border-radius:4px 4px 0 0}.ant-select-dropdown-menu-item:last-child{border-radius:0 0 4px 4px}.ant-select-dropdown-menu-item-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-select-dropdown-menu-item-disabled:hover{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-select-dropdown-menu-item-selected{color:rgba(0,0,0,.65);font-weight:600;background-color:#fafafa}.ant-select-dropdown-menu-item-active{background-color:#e6f7ff}.ant-select-dropdown-menu-item-divider{height:1px;margin:1px 0;overflow:hidden;line-height:0;background-color:#e8e8e8}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item{padding-right:32px}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item .ant-select-selected-icon{position:absolute;top:50%;right:12px;color:transparent;font-weight:700;font-size:12px;text-shadow:0 .1px 0,.1px 0 0,0 -.1px 0,-.1px 0;-webkit-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s;transition:all .2s}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:hover .ant-select-selected-icon{color:rgba(0,0,0,.87)}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-disabled .ant-select-selected-icon{display:none}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected .ant-select-selected-icon,.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected:hover .ant-select-selected-icon{display:inline-block;color:#1890ff}.ant-select-dropdown--empty.ant-select-dropdown--multiple .ant-select-dropdown-menu-item{padding-right:12px}.ant-select-dropdown-container-open .ant-select-dropdown,.ant-select-dropdown-open .ant-select-dropdown{display:block}.ant-empty{margin:0 8px;font-size:14px;line-height:22px;text-align:center}.ant-empty-image{height:100px;margin-bottom:8px}.ant-empty-image img{height:100%}.ant-empty-description{margin:0}.ant-empty-footer{margin-top:16px}.ant-empty-normal{margin:32px 0;color:rgba(0,0,0,.25)}.ant-empty-normal .ant-empty-image{height:40px}.ant-empty-small{margin:8px 0;color:rgba(0,0,0,.25)}.ant-empty-small .ant-empty-image{height:35px}.ant-input{box-sizing:border-box;margin:0;font-variant:tabular-nums;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;display:inline-block;width:100%;height:32px;padding:4px 11px;color:rgba(0,0,0,.65);font-size:14px;line-height:1.5;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s}.ant-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-input:-ms-input-placeholder{color:#bfbfbf}.ant-input::-webkit-input-placeholder{color:#bfbfbf}.ant-input:focus,.ant-input:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-input:focus{outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-input-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-input-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-input[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-input[disabled]:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s}.ant-input-lg{height:40px;padding:6px 11px;font-size:16px}.ant-input-sm{height:24px;padding:1px 7px}.ant-input-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;display:table;width:100%;border-collapse:initial;border-spacing:0}.ant-input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.ant-input-group>[class*=col-]{padding-right:8px}.ant-input-group>[class*=col-]:last-child{padding-right:0}.ant-input-group-addon,.ant-input-group-wrap,.ant-input-group>.ant-input{display:table-cell}.ant-input-group-addon:not(:first-child):not(:last-child),.ant-input-group-wrap:not(:first-child):not(:last-child),.ant-input-group>.ant-input:not(:first-child):not(:last-child){border-radius:0}.ant-input-group-addon,.ant-input-group-wrap{width:1px;white-space:nowrap;vertical-align:middle}.ant-input-group-wrap>*{display:block!important}.ant-input-group .ant-input{float:left;width:100%;margin-bottom:0;text-align:inherit}.ant-input-group .ant-input:focus,.ant-input-group .ant-input:hover{z-index:1;border-right-width:1px}.ant-input-group-addon{position:relative;padding:0 11px;color:rgba(0,0,0,.65);font-weight:400;font-size:14px;line-height:1;text-align:center;background-color:#fafafa;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s}.ant-input-group-addon .ant-select{margin:-5px -11px}.ant-input-group-addon .ant-select .ant-select-selection{margin:-1px;background-color:inherit;border:1px solid transparent;box-shadow:none}.ant-input-group-addon .ant-select-focused .ant-select-selection,.ant-input-group-addon .ant-select-open .ant-select-selection{color:#1890ff}.ant-input-group-addon>i:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;content:""}.ant-input-group-addon:first-child,.ant-input-group-addon:first-child .ant-select .ant-select-selection,.ant-input-group>.ant-input:first-child,.ant-input-group>.ant-input:first-child .ant-select .ant-select-selection{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:first-child) .ant-input{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:last-child) .ant-input{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group-addon:first-child{border-right:0}.ant-input-group-addon:last-child{border-left:0}.ant-input-group-addon:last-child,.ant-input-group-addon:last-child .ant-select .ant-select-selection,.ant-input-group>.ant-input:last-child,.ant-input-group>.ant-input:last-child .ant-select .ant-select-selection{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group-lg .ant-input,.ant-input-group-lg>.ant-input-group-addon{height:40px;padding:6px 11px;font-size:16px}.ant-input-group-sm .ant-input,.ant-input-group-sm>.ant-input-group-addon{height:24px;padding:1px 7px}.ant-input-group-lg .ant-select-selection--single{height:40px}.ant-input-group-sm .ant-select-selection--single{height:24px}.ant-input-group .ant-input-affix-wrapper{display:table-cell;float:left;width:100%}.ant-input-group.ant-input-group-compact{display:block;zoom:1}.ant-input-group.ant-input-group-compact:after,.ant-input-group.ant-input-group-compact:before{display:table;content:""}.ant-input-group.ant-input-group-compact:after{clear:both}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child),.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child),.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child){border-right-width:1px}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover,.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover,.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child):hover{z-index:1}.ant-input-group.ant-input-group-compact>*{display:inline-block;float:none;vertical-align:top;border-radius:0}.ant-input-group.ant-input-group-compact>:not(:last-child){margin-right:-1px;border-right-width:1px}.ant-input-group.ant-input-group-compact .ant-input{float:none}.ant-input-group.ant-input-group-compact>.ant-calendar-picker .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input,.ant-input-group.ant-input-group-compact>.ant-mention-wrapper .ant-mention-editor,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selection,.ant-input-group.ant-input-group-compact>.ant-time-picker .ant-time-picker-input{border-right-width:1px;border-radius:0}.ant-input-group.ant-input-group-compact>.ant-calendar-picker .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-calendar-picker .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-mention-wrapper .ant-mention-editor:focus,.ant-input-group.ant-input-group-compact>.ant-mention-wrapper .ant-mention-editor:hover,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selection:focus,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selection:hover,.ant-input-group.ant-input-group-compact>.ant-time-picker .ant-time-picker-input:focus,.ant-input-group.ant-input-group-compact>.ant-time-picker .ant-time-picker-input:hover{z-index:1}.ant-input-group.ant-input-group-compact>.ant-calendar-picker:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-mention-wrapper:first-child .ant-mention-editor,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selection,.ant-input-group.ant-input-group-compact>.ant-time-picker:first-child .ant-time-picker-input,.ant-input-group.ant-input-group-compact>:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-input-group.ant-input-group-compact>.ant-calendar-picker:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker-focused:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-mention-wrapper:last-child .ant-mention-editor,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selection,.ant-input-group.ant-input-group-compact>.ant-time-picker:last-child .ant-time-picker-input,.ant-input-group.ant-input-group-compact>:last-child{border-right-width:1px;border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input{vertical-align:top}.ant-input-group-wrapper{display:inline-block;width:100%;text-align:start;vertical-align:top}.ant-input-affix-wrapper{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;display:inline-block;width:100%;text-align:start}.ant-input-affix-wrapper:hover .ant-input:not(.ant-input-disabled){border-color:#40a9ff;border-right-width:1px!important}.ant-input-affix-wrapper .ant-input{position:relative;text-align:inherit}.ant-input-affix-wrapper .ant-input-prefix,.ant-input-affix-wrapper .ant-input-suffix{position:absolute;top:50%;z-index:2;color:rgba(0,0,0,.65);line-height:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ant-input-affix-wrapper .ant-input-prefix :not(.anticon),.ant-input-affix-wrapper .ant-input-suffix :not(.anticon){line-height:1.5}.ant-input-affix-wrapper .ant-input-prefix{left:12px}.ant-input-affix-wrapper .ant-input-suffix{right:12px}.ant-input-affix-wrapper .ant-input:not(:first-child){padding-left:30px}.ant-input-affix-wrapper .ant-input:not(:last-child){padding-right:30px}.ant-input-affix-wrapper .ant-input{min-height:100%}.ant-input-password-icon{color:rgba(0,0,0,.45);cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-input-password-icon:hover{color:#333}.ant-input-clear-icon{color:rgba(0,0,0,.25);font-size:12px;vertical-align:top;cursor:pointer;-webkit-transition:color .3s;transition:color .3s}.ant-input-clear-icon:hover{color:rgba(0,0,0,.45)}.ant-input-clear-icon:active{color:rgba(0,0,0,.65)}.ant-input-clear-icon+i{margin-left:6px}.ant-input-search-icon{color:rgba(0,0,0,.45);cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-input-search-icon:hover{color:rgba(0,0,0,.8)}.ant-input-search-enter-button input{border-right:0}.ant-input-search-enter-button+.ant-input-group-addon,.ant-input-search-enter-button input+.ant-input-group-addon{padding:0;border:0}.ant-input-search-enter-button+.ant-input-group-addon .ant-input-search-button,.ant-input-search-enter-button input+.ant-input-group-addon .ant-input-search-button{width:100%;border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn{line-height:1.499;position:relative;display:inline-block;font-weight:400;white-space:nowrap;text-align:center;background-image:none;box-shadow:0 2px 0 rgba(0,0,0,.015);cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:manipulation;height:32px;padding:0 15px;font-size:14px;border-radius:4px;color:rgba(0,0,0,.65);background-color:#fff;border:1px solid #d9d9d9}.ant-btn>.anticon{line-height:1}.ant-btn,.ant-btn:active,.ant-btn:focus{outline:0}.ant-btn:not([disabled]):hover{text-decoration:none}.ant-btn:not([disabled]):active{outline:0;box-shadow:none}.ant-btn.disabled,.ant-btn[disabled]{cursor:not-allowed}.ant-btn.disabled>*,.ant-btn[disabled]>*{pointer-events:none}.ant-btn-lg{height:40px;padding:0 15px;font-size:16px;border-radius:4px}.ant-btn-sm{height:24px;padding:0 7px;font-size:14px;border-radius:4px}.ant-btn>a:only-child{color:currentColor}.ant-btn>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn:focus,.ant-btn:hover{color:#40a9ff;background-color:#fff;border-color:#40a9ff}.ant-btn:focus>a:only-child,.ant-btn:hover>a:only-child{color:currentColor}.ant-btn:focus>a:only-child:after,.ant-btn:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn.active,.ant-btn:active{color:#096dd9;background-color:#fff;border-color:#096dd9}.ant-btn.active>a:only-child,.ant-btn:active>a:only-child{color:currentColor}.ant-btn.active>a:only-child:after,.ant-btn:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-disabled,.ant-btn-disabled.active,.ant-btn-disabled:active,.ant-btn-disabled:focus,.ant-btn-disabled:hover,.ant-btn.disabled,.ant-btn.disabled.active,.ant-btn.disabled:active,.ant-btn.disabled:focus,.ant-btn.disabled:hover,.ant-btn[disabled],.ant-btn[disabled].active,.ant-btn[disabled]:active,.ant-btn[disabled]:focus,.ant-btn[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;box-shadow:none}.ant-btn-disabled.active>a:only-child,.ant-btn-disabled:active>a:only-child,.ant-btn-disabled:focus>a:only-child,.ant-btn-disabled:hover>a:only-child,.ant-btn-disabled>a:only-child,.ant-btn.disabled.active>a:only-child,.ant-btn.disabled:active>a:only-child,.ant-btn.disabled:focus>a:only-child,.ant-btn.disabled:hover>a:only-child,.ant-btn.disabled>a:only-child,.ant-btn[disabled].active>a:only-child,.ant-btn[disabled]:active>a:only-child,.ant-btn[disabled]:focus>a:only-child,.ant-btn[disabled]:hover>a:only-child,.ant-btn[disabled]>a:only-child{color:currentColor}.ant-btn-disabled.active>a:only-child:after,.ant-btn-disabled:active>a:only-child:after,.ant-btn-disabled:focus>a:only-child:after,.ant-btn-disabled:hover>a:only-child:after,.ant-btn-disabled>a:only-child:after,.ant-btn.disabled.active>a:only-child:after,.ant-btn.disabled:active>a:only-child:after,.ant-btn.disabled:focus>a:only-child:after,.ant-btn.disabled:hover>a:only-child:after,.ant-btn.disabled>a:only-child:after,.ant-btn[disabled].active>a:only-child:after,.ant-btn[disabled]:active>a:only-child:after,.ant-btn[disabled]:focus>a:only-child:after,.ant-btn[disabled]:hover>a:only-child:after,.ant-btn[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn.active,.ant-btn:active,.ant-btn:focus,.ant-btn:hover{text-decoration:none;background:#fff}.ant-btn>i,.ant-btn>span{display:inline-block;pointer-events:none}.ant-btn-primary{color:#fff;background-color:#1890ff;border-color:#1890ff;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px 0 rgba(0,0,0,.045)}.ant-btn-primary>a:only-child{color:currentColor}.ant-btn-primary>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-primary:focus,.ant-btn-primary:hover{color:#fff;background-color:#40a9ff;border-color:#40a9ff}.ant-btn-primary:focus>a:only-child,.ant-btn-primary:hover>a:only-child{color:currentColor}.ant-btn-primary:focus>a:only-child:after,.ant-btn-primary:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-primary.active,.ant-btn-primary:active{color:#fff;background-color:#096dd9;border-color:#096dd9}.ant-btn-primary.active>a:only-child,.ant-btn-primary:active>a:only-child{color:currentColor}.ant-btn-primary.active>a:only-child:after,.ant-btn-primary:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-primary-disabled,.ant-btn-primary-disabled.active,.ant-btn-primary-disabled:active,.ant-btn-primary-disabled:focus,.ant-btn-primary-disabled:hover,.ant-btn-primary.disabled,.ant-btn-primary.disabled.active,.ant-btn-primary.disabled:active,.ant-btn-primary.disabled:focus,.ant-btn-primary.disabled:hover,.ant-btn-primary[disabled],.ant-btn-primary[disabled].active,.ant-btn-primary[disabled]:active,.ant-btn-primary[disabled]:focus,.ant-btn-primary[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;box-shadow:none}.ant-btn-primary-disabled.active>a:only-child,.ant-btn-primary-disabled:active>a:only-child,.ant-btn-primary-disabled:focus>a:only-child,.ant-btn-primary-disabled:hover>a:only-child,.ant-btn-primary-disabled>a:only-child,.ant-btn-primary.disabled.active>a:only-child,.ant-btn-primary.disabled:active>a:only-child,.ant-btn-primary.disabled:focus>a:only-child,.ant-btn-primary.disabled:hover>a:only-child,.ant-btn-primary.disabled>a:only-child,.ant-btn-primary[disabled].active>a:only-child,.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-primary[disabled]>a:only-child{color:currentColor}.ant-btn-primary-disabled.active>a:only-child:after,.ant-btn-primary-disabled:active>a:only-child:after,.ant-btn-primary-disabled:focus>a:only-child:after,.ant-btn-primary-disabled:hover>a:only-child:after,.ant-btn-primary-disabled>a:only-child:after,.ant-btn-primary.disabled.active>a:only-child:after,.ant-btn-primary.disabled:active>a:only-child:after,.ant-btn-primary.disabled:focus>a:only-child:after,.ant-btn-primary.disabled:hover>a:only-child:after,.ant-btn-primary.disabled>a:only-child:after,.ant-btn-primary[disabled].active>a:only-child:after,.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-primary[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child){border-right-color:#40a9ff;border-left-color:#40a9ff}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled{border-color:#d9d9d9}.ant-btn-group .ant-btn-primary:first-child:not(:last-child){border-right-color:#40a9ff}.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled]{border-right-color:#d9d9d9}.ant-btn-group .ant-btn-primary+.ant-btn-primary,.ant-btn-group .ant-btn-primary:last-child:not(:first-child){border-left-color:#40a9ff}.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled],.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled]{border-left-color:#d9d9d9}.ant-btn-ghost{color:rgba(0,0,0,.65);background-color:initial;border-color:#d9d9d9}.ant-btn-ghost>a:only-child{color:currentColor}.ant-btn-ghost>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-ghost:focus,.ant-btn-ghost:hover{color:#40a9ff;background-color:initial;border-color:#40a9ff}.ant-btn-ghost:focus>a:only-child,.ant-btn-ghost:hover>a:only-child{color:currentColor}.ant-btn-ghost:focus>a:only-child:after,.ant-btn-ghost:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-ghost.active,.ant-btn-ghost:active{color:#096dd9;background-color:initial;border-color:#096dd9}.ant-btn-ghost.active>a:only-child,.ant-btn-ghost:active>a:only-child{color:currentColor}.ant-btn-ghost.active>a:only-child:after,.ant-btn-ghost:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-ghost-disabled,.ant-btn-ghost-disabled.active,.ant-btn-ghost-disabled:active,.ant-btn-ghost-disabled:focus,.ant-btn-ghost-disabled:hover,.ant-btn-ghost.disabled,.ant-btn-ghost.disabled.active,.ant-btn-ghost.disabled:active,.ant-btn-ghost.disabled:focus,.ant-btn-ghost.disabled:hover,.ant-btn-ghost[disabled],.ant-btn-ghost[disabled].active,.ant-btn-ghost[disabled]:active,.ant-btn-ghost[disabled]:focus,.ant-btn-ghost[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;box-shadow:none}.ant-btn-ghost-disabled.active>a:only-child,.ant-btn-ghost-disabled:active>a:only-child,.ant-btn-ghost-disabled:focus>a:only-child,.ant-btn-ghost-disabled:hover>a:only-child,.ant-btn-ghost-disabled>a:only-child,.ant-btn-ghost.disabled.active>a:only-child,.ant-btn-ghost.disabled:active>a:only-child,.ant-btn-ghost.disabled:focus>a:only-child,.ant-btn-ghost.disabled:hover>a:only-child,.ant-btn-ghost.disabled>a:only-child,.ant-btn-ghost[disabled].active>a:only-child,.ant-btn-ghost[disabled]:active>a:only-child,.ant-btn-ghost[disabled]:focus>a:only-child,.ant-btn-ghost[disabled]:hover>a:only-child,.ant-btn-ghost[disabled]>a:only-child{color:currentColor}.ant-btn-ghost-disabled.active>a:only-child:after,.ant-btn-ghost-disabled:active>a:only-child:after,.ant-btn-ghost-disabled:focus>a:only-child:after,.ant-btn-ghost-disabled:hover>a:only-child:after,.ant-btn-ghost-disabled>a:only-child:after,.ant-btn-ghost.disabled.active>a:only-child:after,.ant-btn-ghost.disabled:active>a:only-child:after,.ant-btn-ghost.disabled:focus>a:only-child:after,.ant-btn-ghost.disabled:hover>a:only-child:after,.ant-btn-ghost.disabled>a:only-child:after,.ant-btn-ghost[disabled].active>a:only-child:after,.ant-btn-ghost[disabled]:active>a:only-child:after,.ant-btn-ghost[disabled]:focus>a:only-child:after,.ant-btn-ghost[disabled]:hover>a:only-child:after,.ant-btn-ghost[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dashed{color:rgba(0,0,0,.65);background-color:#fff;border-color:#d9d9d9;border-style:dashed}.ant-btn-dashed>a:only-child{color:currentColor}.ant-btn-dashed>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dashed:focus,.ant-btn-dashed:hover{color:#40a9ff;background-color:#fff;border-color:#40a9ff}.ant-btn-dashed:focus>a:only-child,.ant-btn-dashed:hover>a:only-child{color:currentColor}.ant-btn-dashed:focus>a:only-child:after,.ant-btn-dashed:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dashed.active,.ant-btn-dashed:active{color:#096dd9;background-color:#fff;border-color:#096dd9}.ant-btn-dashed.active>a:only-child,.ant-btn-dashed:active>a:only-child{color:currentColor}.ant-btn-dashed.active>a:only-child:after,.ant-btn-dashed:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-dashed-disabled,.ant-btn-dashed-disabled.active,.ant-btn-dashed-disabled:active,.ant-btn-dashed-disabled:focus,.ant-btn-dashed-disabled:hover,.ant-btn-dashed.disabled,.ant-btn-dashed.disabled.active,.ant-btn-dashed.disabled:active,.ant-btn-dashed.disabled:focus,.ant-btn-dashed.disabled:hover,.ant-btn-dashed[disabled],.ant-btn-dashed[disabled].active,.ant-btn-dashed[disabled]:active,.ant-btn-dashed[disabled]:focus,.ant-btn-dashed[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;box-shadow:none}.ant-btn-dashed-disabled.active>a:only-child,.ant-btn-dashed-disabled:active>a:only-child,.ant-btn-dashed-disabled:focus>a:only-child,.ant-btn-dashed-disabled:hover>a:only-child,.ant-btn-dashed-disabled>a:only-child,.ant-btn-dashed.disabled.active>a:only-child,.ant-btn-dashed.disabled:active>a:only-child,.ant-btn-dashed.disabled:focus>a:only-child,.ant-btn-dashed.disabled:hover>a:only-child,.ant-btn-dashed.disabled>a:only-child,.ant-btn-dashed[disabled].active>a:only-child,.ant-btn-dashed[disabled]:active>a:only-child,.ant-btn-dashed[disabled]:focus>a:only-child,.ant-btn-dashed[disabled]:hover>a:only-child,.ant-btn-dashed[disabled]>a:only-child{color:currentColor}.ant-btn-dashed-disabled.active>a:only-child:after,.ant-btn-dashed-disabled:active>a:only-child:after,.ant-btn-dashed-disabled:focus>a:only-child:after,.ant-btn-dashed-disabled:hover>a:only-child:after,.ant-btn-dashed-disabled>a:only-child:after,.ant-btn-dashed.disabled.active>a:only-child:after,.ant-btn-dashed.disabled:active>a:only-child:after,.ant-btn-dashed.disabled:focus>a:only-child:after,.ant-btn-dashed.disabled:hover>a:only-child:after,.ant-btn-dashed.disabled>a:only-child:after,.ant-btn-dashed[disabled].active>a:only-child:after,.ant-btn-dashed[disabled]:active>a:only-child:after,.ant-btn-dashed[disabled]:focus>a:only-child:after,.ant-btn-dashed[disabled]:hover>a:only-child:after,.ant-btn-dashed[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-danger{color:#f5222d;background-color:#f5f5f5;border-color:#d9d9d9}.ant-btn-danger>a:only-child{color:currentColor}.ant-btn-danger>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-danger:hover{color:#fff;background-color:#ff4d4f;border-color:#ff4d4f}.ant-btn-danger:hover>a:only-child{color:currentColor}.ant-btn-danger:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-danger:focus{color:#ff4d4f;background-color:#fff;border-color:#ff4d4f}.ant-btn-danger:focus>a:only-child{color:currentColor}.ant-btn-danger:focus>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-danger.active,.ant-btn-danger:active{color:#fff;background-color:#cf1322;border-color:#cf1322}.ant-btn-danger.active>a:only-child,.ant-btn-danger:active>a:only-child{color:currentColor}.ant-btn-danger.active>a:only-child:after,.ant-btn-danger:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-danger-disabled,.ant-btn-danger-disabled.active,.ant-btn-danger-disabled:active,.ant-btn-danger-disabled:focus,.ant-btn-danger-disabled:hover,.ant-btn-danger.disabled,.ant-btn-danger.disabled.active,.ant-btn-danger.disabled:active,.ant-btn-danger.disabled:focus,.ant-btn-danger.disabled:hover,.ant-btn-danger[disabled],.ant-btn-danger[disabled].active,.ant-btn-danger[disabled]:active,.ant-btn-danger[disabled]:focus,.ant-btn-danger[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;box-shadow:none}.ant-btn-danger-disabled.active>a:only-child,.ant-btn-danger-disabled:active>a:only-child,.ant-btn-danger-disabled:focus>a:only-child,.ant-btn-danger-disabled:hover>a:only-child,.ant-btn-danger-disabled>a:only-child,.ant-btn-danger.disabled.active>a:only-child,.ant-btn-danger.disabled:active>a:only-child,.ant-btn-danger.disabled:focus>a:only-child,.ant-btn-danger.disabled:hover>a:only-child,.ant-btn-danger.disabled>a:only-child,.ant-btn-danger[disabled].active>a:only-child,.ant-btn-danger[disabled]:active>a:only-child,.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-danger[disabled]>a:only-child{color:currentColor}.ant-btn-danger-disabled.active>a:only-child:after,.ant-btn-danger-disabled:active>a:only-child:after,.ant-btn-danger-disabled:focus>a:only-child:after,.ant-btn-danger-disabled:hover>a:only-child:after,.ant-btn-danger-disabled>a:only-child:after,.ant-btn-danger.disabled.active>a:only-child:after,.ant-btn-danger.disabled:active>a:only-child:after,.ant-btn-danger.disabled:focus>a:only-child:after,.ant-btn-danger.disabled:hover>a:only-child:after,.ant-btn-danger.disabled>a:only-child:after,.ant-btn-danger[disabled].active>a:only-child:after,.ant-btn-danger[disabled]:active>a:only-child:after,.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-danger[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-link{color:#1890ff;background-color:initial;border-color:transparent;box-shadow:none}.ant-btn-link>a:only-child{color:currentColor}.ant-btn-link>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-link:focus,.ant-btn-link:hover{color:#40a9ff;background-color:initial;border-color:#40a9ff}.ant-btn-link:focus>a:only-child,.ant-btn-link:hover>a:only-child{color:currentColor}.ant-btn-link:focus>a:only-child:after,.ant-btn-link:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-link.active,.ant-btn-link:active{color:#096dd9;background-color:initial;border-color:#096dd9}.ant-btn-link.active>a:only-child,.ant-btn-link:active>a:only-child{color:currentColor}.ant-btn-link.active>a:only-child:after,.ant-btn-link:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-link-disabled,.ant-btn-link-disabled.active,.ant-btn-link-disabled:active,.ant-btn-link-disabled:focus,.ant-btn-link-disabled:hover,.ant-btn-link.disabled,.ant-btn-link.disabled.active,.ant-btn-link.disabled:active,.ant-btn-link.disabled:focus,.ant-btn-link.disabled:hover,.ant-btn-link[disabled],.ant-btn-link[disabled].active,.ant-btn-link[disabled]:active,.ant-btn-link[disabled]:focus,.ant-btn-link[disabled]:hover{background-color:#f5f5f5;border-color:#d9d9d9}.ant-btn-link:active,.ant-btn-link:focus,.ant-btn-link:hover{border-color:transparent}.ant-btn-link-disabled,.ant-btn-link-disabled.active,.ant-btn-link-disabled:active,.ant-btn-link-disabled:focus,.ant-btn-link-disabled:hover,.ant-btn-link.disabled,.ant-btn-link.disabled.active,.ant-btn-link.disabled:active,.ant-btn-link.disabled:focus,.ant-btn-link.disabled:hover,.ant-btn-link[disabled],.ant-btn-link[disabled].active,.ant-btn-link[disabled]:active,.ant-btn-link[disabled]:focus,.ant-btn-link[disabled]:hover{color:rgba(0,0,0,.25);background-color:initial;border-color:transparent;text-shadow:none;box-shadow:none}.ant-btn-link-disabled.active>a:only-child,.ant-btn-link-disabled:active>a:only-child,.ant-btn-link-disabled:focus>a:only-child,.ant-btn-link-disabled:hover>a:only-child,.ant-btn-link-disabled>a:only-child,.ant-btn-link.disabled.active>a:only-child,.ant-btn-link.disabled:active>a:only-child,.ant-btn-link.disabled:focus>a:only-child,.ant-btn-link.disabled:hover>a:only-child,.ant-btn-link.disabled>a:only-child,.ant-btn-link[disabled].active>a:only-child,.ant-btn-link[disabled]:active>a:only-child,.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-link[disabled]>a:only-child{color:currentColor}.ant-btn-link-disabled.active>a:only-child:after,.ant-btn-link-disabled:active>a:only-child:after,.ant-btn-link-disabled:focus>a:only-child:after,.ant-btn-link-disabled:hover>a:only-child:after,.ant-btn-link-disabled>a:only-child:after,.ant-btn-link.disabled.active>a:only-child:after,.ant-btn-link.disabled:active>a:only-child:after,.ant-btn-link.disabled:focus>a:only-child:after,.ant-btn-link.disabled:hover>a:only-child:after,.ant-btn-link.disabled>a:only-child:after,.ant-btn-link[disabled].active>a:only-child:after,.ant-btn-link[disabled]:active>a:only-child:after,.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-link[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-round{height:32px;padding:0 16px;font-size:16px;border-radius:32px}.ant-btn-round.ant-btn-lg{height:40px;padding:0 20px;font-size:18px;border-radius:40px}.ant-btn-round.ant-btn-sm{height:24px;padding:0 12px;font-size:14px;border-radius:24px}.ant-btn-circle,.ant-btn-circle-outline{width:32px;height:32px;padding:0;font-size:16px;border-radius:50%}.ant-btn-circle-outline.ant-btn-lg,.ant-btn-circle.ant-btn-lg{width:40px;height:40px;padding:0;font-size:18px;border-radius:50%}.ant-btn-circle-outline.ant-btn-sm,.ant-btn-circle.ant-btn-sm{width:24px;height:24px;padding:0;font-size:14px;border-radius:50%}.ant-btn:before{position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px;z-index:1;display:none;background:#fff;border-radius:inherit;opacity:.35;-webkit-transition:opacity .2s;transition:opacity .2s;content:"";pointer-events:none}.ant-btn .anticon{-webkit-transition:margin-left .3s cubic-bezier(.645,.045,.355,1);transition:margin-left .3s cubic-bezier(.645,.045,.355,1)}.ant-btn .anticon.anticon-minus>svg,.ant-btn .anticon.anticon-plus>svg{shape-rendering:optimizeSpeed}.ant-btn.ant-btn-loading{position:relative;pointer-events:none}.ant-btn.ant-btn-loading:before{display:block}.ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only){padding-left:29px}.ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) .anticon:not(:last-child){margin-left:-14px}.ant-btn-sm.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only){padding-left:24px}.ant-btn-sm.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) .anticon{margin-left:-17px}.ant-btn-group{display:inline-block}.ant-btn-group,.ant-btn-group>.ant-btn,.ant-btn-group>span>.ant-btn{position:relative}.ant-btn-group>.ant-btn.active,.ant-btn-group>.ant-btn:active,.ant-btn-group>.ant-btn:focus,.ant-btn-group>.ant-btn:hover,.ant-btn-group>span>.ant-btn.active,.ant-btn-group>span>.ant-btn:active,.ant-btn-group>span>.ant-btn:focus,.ant-btn-group>span>.ant-btn:hover{z-index:2}.ant-btn-group>.ant-btn:disabled,.ant-btn-group>span>.ant-btn:disabled{z-index:0}.ant-btn-group-lg>.ant-btn,.ant-btn-group-lg>span>.ant-btn{height:40px;padding:0 15px;font-size:16px;border-radius:0;line-height:38px}.ant-btn-group-sm>.ant-btn,.ant-btn-group-sm>span>.ant-btn{height:24px;padding:0 7px;font-size:14px;border-radius:0;line-height:22px}.ant-btn-group-sm>.ant-btn>.anticon,.ant-btn-group-sm>span>.ant-btn>.anticon{font-size:14px}.ant-btn+.ant-btn-group,.ant-btn-group+.ant-btn,.ant-btn-group+.ant-btn-group,.ant-btn-group .ant-btn+.ant-btn,.ant-btn-group .ant-btn+span,.ant-btn-group>span+span,.ant-btn-group span+.ant-btn{margin-left:-1px}.ant-btn-group .ant-btn-primary+.ant-btn:not(.ant-btn-primary):not([disabled]){border-left-color:transparent}.ant-btn-group .ant-btn{border-radius:0}.ant-btn-group>.ant-btn:first-child,.ant-btn-group>span:first-child>.ant-btn{margin-left:0}.ant-btn-group>.ant-btn:only-child,.ant-btn-group>span:only-child>.ant-btn{border-radius:4px}.ant-btn-group>.ant-btn:first-child:not(:last-child),.ant-btn-group>span:first-child:not(:last-child)>.ant-btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-btn-group>.ant-btn:last-child:not(:first-child),.ant-btn-group>span:last-child:not(:first-child)>.ant-btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-btn-group-sm>.ant-btn:only-child,.ant-btn-group-sm>span:only-child>.ant-btn{border-radius:4px}.ant-btn-group-sm>.ant-btn:first-child:not(:last-child),.ant-btn-group-sm>span:first-child:not(:last-child)>.ant-btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-btn-group-sm>.ant-btn:last-child:not(:first-child),.ant-btn-group-sm>span:last-child:not(:first-child)>.ant-btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-btn-group>.ant-btn-group{float:left}.ant-btn-group>.ant-btn-group:not(:first-child):not(:last-child)>.ant-btn{border-radius:0}.ant-btn-group>.ant-btn-group:first-child:not(:last-child)>.ant-btn:last-child{padding-right:8px;border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-group>.ant-btn-group:last-child:not(:first-child)>.ant-btn:first-child{padding-left:8px;border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn:not(.ant-btn-circle):not(.ant-btn-circle-outline).ant-btn-icon-only{padding-right:8px;padding-left:8px}.ant-btn:active>span,.ant-btn:focus>span{position:relative}.ant-btn>.anticon+span,.ant-btn>span+.anticon{margin-left:8px}.ant-btn-background-ghost{color:#fff;background:transparent!important;border-color:#fff}.ant-btn-background-ghost.ant-btn-primary{color:#1890ff;background-color:initial;border-color:#1890ff;text-shadow:none}.ant-btn-background-ghost.ant-btn-primary>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary:focus,.ant-btn-background-ghost.ant-btn-primary:hover{color:#40a9ff;background-color:initial;border-color:#40a9ff}.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary.active,.ant-btn-background-ghost.ant-btn-primary:active{color:#096dd9;background-color:initial;border-color:#096dd9}.ant-btn-background-ghost.ant-btn-primary.active>a:only-child,.ant-btn-background-ghost.ant-btn-primary:active>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary-disabled,.ant-btn-background-ghost.ant-btn-primary-disabled.active,.ant-btn-background-ghost.ant-btn-primary-disabled:active,.ant-btn-background-ghost.ant-btn-primary-disabled:focus,.ant-btn-background-ghost.ant-btn-primary-disabled:hover,.ant-btn-background-ghost.ant-btn-primary.disabled,.ant-btn-background-ghost.ant-btn-primary.disabled.active,.ant-btn-background-ghost.ant-btn-primary.disabled:active,.ant-btn-background-ghost.ant-btn-primary.disabled:focus,.ant-btn-background-ghost.ant-btn-primary.disabled:hover,.ant-btn-background-ghost.ant-btn-primary[disabled],.ant-btn-background-ghost.ant-btn-primary[disabled].active,.ant-btn-background-ghost.ant-btn-primary[disabled]:active,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-primary-disabled.active>a:only-child,.ant-btn-background-ghost.ant-btn-primary-disabled:active>a:only-child,.ant-btn-background-ghost.ant-btn-primary-disabled:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary-disabled:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary-disabled>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled.active>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled:active>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled].active>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary-disabled.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary-disabled:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary-disabled:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary-disabled:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary-disabled>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled].active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger{color:#f5222d;background-color:initial;border-color:#f5222d;text-shadow:none}.ant-btn-background-ghost.ant-btn-danger>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-danger>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger:focus,.ant-btn-background-ghost.ant-btn-danger:hover{color:#ff4d4f;background-color:initial;border-color:#ff4d4f}.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger.active,.ant-btn-background-ghost.ant-btn-danger:active{color:#cf1322;background-color:initial;border-color:#cf1322}.ant-btn-background-ghost.ant-btn-danger.active>a:only-child,.ant-btn-background-ghost.ant-btn-danger:active>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-danger.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger-disabled,.ant-btn-background-ghost.ant-btn-danger-disabled.active,.ant-btn-background-ghost.ant-btn-danger-disabled:active,.ant-btn-background-ghost.ant-btn-danger-disabled:focus,.ant-btn-background-ghost.ant-btn-danger-disabled:hover,.ant-btn-background-ghost.ant-btn-danger.disabled,.ant-btn-background-ghost.ant-btn-danger.disabled.active,.ant-btn-background-ghost.ant-btn-danger.disabled:active,.ant-btn-background-ghost.ant-btn-danger.disabled:focus,.ant-btn-background-ghost.ant-btn-danger.disabled:hover,.ant-btn-background-ghost.ant-btn-danger[disabled],.ant-btn-background-ghost.ant-btn-danger[disabled].active,.ant-btn-background-ghost.ant-btn-danger[disabled]:active,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-danger-disabled.active>a:only-child,.ant-btn-background-ghost.ant-btn-danger-disabled:active>a:only-child,.ant-btn-background-ghost.ant-btn-danger-disabled:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger-disabled:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger-disabled>a:only-child,.ant-btn-background-ghost.ant-btn-danger.disabled.active>a:only-child,.ant-btn-background-ghost.ant-btn-danger.disabled:active>a:only-child,.ant-btn-background-ghost.ant-btn-danger.disabled:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger.disabled:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger.disabled>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled].active>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-danger-disabled.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger-disabled:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger-disabled:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger-disabled:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger-disabled>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger.disabled.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger.disabled:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger.disabled:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger.disabled:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger.disabled>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled].active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-link{color:#1890ff;background-color:initial;border-color:transparent;text-shadow:none;color:#fff}.ant-btn-background-ghost.ant-btn-link>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-link>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-link:focus,.ant-btn-background-ghost.ant-btn-link:hover{color:#40a9ff;background-color:initial;border-color:transparent}.ant-btn-background-ghost.ant-btn-link:focus>a:only-child,.ant-btn-background-ghost.ant-btn-link:hover>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-link:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-link:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-link.active,.ant-btn-background-ghost.ant-btn-link:active{color:#096dd9;background-color:initial;border-color:transparent}.ant-btn-background-ghost.ant-btn-link.active>a:only-child,.ant-btn-background-ghost.ant-btn-link:active>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-link.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-link:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-link-disabled,.ant-btn-background-ghost.ant-btn-link-disabled.active,.ant-btn-background-ghost.ant-btn-link-disabled:active,.ant-btn-background-ghost.ant-btn-link-disabled:focus,.ant-btn-background-ghost.ant-btn-link-disabled:hover,.ant-btn-background-ghost.ant-btn-link.disabled,.ant-btn-background-ghost.ant-btn-link.disabled.active,.ant-btn-background-ghost.ant-btn-link.disabled:active,.ant-btn-background-ghost.ant-btn-link.disabled:focus,.ant-btn-background-ghost.ant-btn-link.disabled:hover,.ant-btn-background-ghost.ant-btn-link[disabled],.ant-btn-background-ghost.ant-btn-link[disabled].active,.ant-btn-background-ghost.ant-btn-link[disabled]:active,.ant-btn-background-ghost.ant-btn-link[disabled]:focus,.ant-btn-background-ghost.ant-btn-link[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-link-disabled.active>a:only-child,.ant-btn-background-ghost.ant-btn-link-disabled:active>a:only-child,.ant-btn-background-ghost.ant-btn-link-disabled:focus>a:only-child,.ant-btn-background-ghost.ant-btn-link-disabled:hover>a:only-child,.ant-btn-background-ghost.ant-btn-link-disabled>a:only-child,.ant-btn-background-ghost.ant-btn-link.disabled.active>a:only-child,.ant-btn-background-ghost.ant-btn-link.disabled:active>a:only-child,.ant-btn-background-ghost.ant-btn-link.disabled:focus>a:only-child,.ant-btn-background-ghost.ant-btn-link.disabled:hover>a:only-child,.ant-btn-background-ghost.ant-btn-link.disabled>a:only-child,.ant-btn-background-ghost.ant-btn-link[disabled].active>a:only-child,.ant-btn-background-ghost.ant-btn-link[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-link[disabled]>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-link-disabled.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-link-disabled:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-link-disabled:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-link-disabled:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-link-disabled>a:only-child:after,.ant-btn-background-ghost.ant-btn-link.disabled.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-link.disabled:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-link.disabled:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-link.disabled:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-link.disabled>a:only-child:after,.ant-btn-background-ghost.ant-btn-link[disabled].active>a:only-child:after,.ant-btn-background-ghost.ant-btn-link[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-link[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-btn-two-chinese-chars:first-letter{letter-spacing:.34em}.ant-btn-two-chinese-chars>:not(.anticon){margin-right:-.34em;letter-spacing:.34em}.ant-btn-block{width:100%}.ant-btn:empty{vertical-align:top}a.ant-btn{line-height:30px}a.ant-btn-lg{line-height:38px}a.ant-btn-sm{line-height:22px}.ant-avatar{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;display:inline-block;overflow:hidden;color:#fff;white-space:nowrap;text-align:center;vertical-align:middle;background:#ccc;width:32px;height:32px;line-height:32px;border-radius:50%}.ant-avatar-image{background:transparent}.ant-avatar-string{position:absolute;left:50%;-webkit-transform-origin:0 center;transform-origin:0 center}.ant-avatar.ant-avatar-icon{font-size:18px}.ant-avatar-lg{width:40px;height:40px;line-height:40px;border-radius:50%}.ant-avatar-lg-string{position:absolute;left:50%;-webkit-transform-origin:0 center;transform-origin:0 center}.ant-avatar-lg.ant-avatar-icon{font-size:24px}.ant-avatar-sm{width:24px;height:24px;line-height:24px;border-radius:50%}.ant-avatar-sm-string{position:absolute;left:50%;-webkit-transform-origin:0 center;transform-origin:0 center}.ant-avatar-sm.ant-avatar-icon{font-size:14px}.ant-avatar-square{border-radius:4px}.ant-avatar>img{display:block;width:100%;height:100%}.ant-back-top{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:fixed;right:100px;bottom:50px;z-index:10;width:40px;height:40px;cursor:pointer}.ant-back-top-content{width:40px;height:40px;overflow:hidden;color:#fff;text-align:center;background-color:rgba(0,0,0,.45);border-radius:20px}.ant-back-top-content,.ant-back-top-content:hover{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-back-top-content:hover{background-color:rgba(0,0,0,.65)}.ant-back-top-icon{width:14px;height:16px;margin:12px auto;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAoCAYAAACWwljjAAAABGdBTUEAALGPC/xhBQAAAbtJREFUWAntmMtKw0AUhhMvS5cuxILgQlRUpIggIoKIIoigG1eC+AA+jo+i6FIXBfeuXIgoeKVeitVWJX5HWhhDksnUpp3FDPyZk3Nm5nycmZKkXhAEOXSA3lG7muTeRzmfy6HneUvIhnYkQK+Q9NhAA0Opg0vBEhjBKHiyb8iGMyQMOYuK41BcBSypAL+MYXSKjtFAW7EAGEO3qN4uMQbbAkXiSfRQJ1H6a+yhlkKRcAoVFYiweYNjtCVQJJpBz2GCiPt7fBOZQpFgDpUikse5HgnkM4Fi4QX0Fpc5wf9EbLqpUCy4jMoJSXWhFwbMNgWKhVbRhy5jirhs9fy/oFhgHVVTJEs7RLZ8sSEoJm6iz7SZDMbJ+/OKERQTttCXQRLToRUmrKWCYuA2+jbN0MB4OQobYShfdTCgn/sL1K36M7TLrN3n+758aPy2rrpR6+/od5E8tf/A1uLS9aId5T7J3CNYihkQ4D9PiMdMC7mp4rjB9kjFjZp8BlnVHJBuO1yFXIV0FdDF3RlyFdJVQBdv5AxVdIsq8apiZ2PyYO1EVykesGfZEESsCkweyR8MUW+V8uJ1gkYipmpdP1pm2aJVPEGzAAAAAElFTkSuQmCC) 100%/100% no-repeat}@media screen and (max-width:768px){.ant-back-top{right:60px}}@media screen and (max-width:480px){.ant-back-top{right:20px}}.ant-badge{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;display:inline-block;color:unset;line-height:1}.ant-badge-count{z-index:10;min-width:20px;height:20px;padding:0 6px;color:#fff;font-weight:400;font-size:12px;line-height:20px;white-space:nowrap;text-align:center;background:#f5222d;border-radius:10px;box-shadow:0 0 0 1px #fff}.ant-badge-count a,.ant-badge-count a:hover{color:#fff}.ant-badge-multiple-words{padding:0 8px}.ant-badge-dot{z-index:10;width:6px;height:6px;background:#f5222d;border-radius:100%;box-shadow:0 0 0 1px #fff}.ant-badge-count,.ant-badge-dot,.ant-badge .ant-scroll-number-custom-component{position:absolute;top:0;right:0;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);-webkit-transform-origin:100% 0;transform-origin:100% 0}.ant-badge-status{line-height:inherit;vertical-align:initial}.ant-badge-status-dot{position:relative;top:-1px;display:inline-block;width:6px;height:6px;vertical-align:middle;border-radius:50%}.ant-badge-status-success{background-color:#52c41a}.ant-badge-status-processing{position:relative;background-color:#1890ff}.ant-badge-status-processing:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:50%;-webkit-animation:antStatusProcessing 1.2s ease-in-out infinite;animation:antStatusProcessing 1.2s ease-in-out infinite;content:""}.ant-badge-status-default{background-color:#d9d9d9}.ant-badge-status-error{background-color:#f5222d}.ant-badge-status-warning{background-color:#faad14}.ant-badge-status-magenta,.ant-badge-status-pink{background:#eb2f96}.ant-badge-status-red{background:#f5222d}.ant-badge-status-volcano{background:#fa541c}.ant-badge-status-orange{background:#fa8c16}.ant-badge-status-yellow{background:#fadb14}.ant-badge-status-gold{background:#faad14}.ant-badge-status-cyan{background:#13c2c2}.ant-badge-status-lime{background:#a0d911}.ant-badge-status-green{background:#52c41a}.ant-badge-status-blue{background:#1890ff}.ant-badge-status-geekblue{background:#2f54eb}.ant-badge-status-purple{background:#722ed1}.ant-badge-status-text{margin-left:8px;color:rgba(0,0,0,.65);font-size:14px}.ant-badge-zoom-appear,.ant-badge-zoom-enter{-webkit-animation:antZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46);animation:antZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-badge-zoom-leave{-webkit-animation:antZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6);animation:antZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-badge-not-a-wrapper:not(.ant-badge-status){vertical-align:middle}.ant-badge-not-a-wrapper .ant-scroll-number{position:relative;top:auto;display:block}.ant-badge-not-a-wrapper .ant-badge-count{-webkit-transform:none;transform:none}@-webkit-keyframes antStatusProcessing{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.5}to{-webkit-transform:scale(2.4);transform:scale(2.4);opacity:0}}@keyframes antStatusProcessing{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.5}to{-webkit-transform:scale(2.4);transform:scale(2.4);opacity:0}}.ant-scroll-number{overflow:hidden}.ant-scroll-number-only{display:inline-block;height:20px;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-scroll-number-only>p{height:20px;margin:0}.ant-scroll-number-symbol{vertical-align:top}@-webkit-keyframes antZoomBadgeIn{0%{-webkit-transform:scale(0) translate(50%,-50%);transform:scale(0) translate(50%,-50%);opacity:0}to{-webkit-transform:scale(1) translate(50%,-50%);transform:scale(1) translate(50%,-50%)}}@keyframes antZoomBadgeIn{0%{-webkit-transform:scale(0) translate(50%,-50%);transform:scale(0) translate(50%,-50%);opacity:0}to{-webkit-transform:scale(1) translate(50%,-50%);transform:scale(1) translate(50%,-50%)}}@-webkit-keyframes antZoomBadgeOut{0%{-webkit-transform:scale(1) translate(50%,-50%);transform:scale(1) translate(50%,-50%)}to{-webkit-transform:scale(0) translate(50%,-50%);transform:scale(0) translate(50%,-50%);opacity:0}}@keyframes antZoomBadgeOut{0%{-webkit-transform:scale(1) translate(50%,-50%);transform:scale(1) translate(50%,-50%)}to{-webkit-transform:scale(0) translate(50%,-50%);transform:scale(0) translate(50%,-50%);opacity:0}}.ant-breadcrumb{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";color:rgba(0,0,0,.45);font-size:14px}.ant-breadcrumb .anticon{font-size:14px}.ant-breadcrumb a{color:rgba(0,0,0,.45);-webkit-transition:color .3s;transition:color .3s}.ant-breadcrumb a:hover{color:#40a9ff}.ant-breadcrumb>span:last-child{color:rgba(0,0,0,.65)}.ant-breadcrumb>span:last-child .ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{margin:0 8px;color:rgba(0,0,0,.45)}.ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-overlay-link>.anticon{margin-left:4px}.ant-menu{box-sizing:border-box;font-size:14px;font-variant:tabular-nums;line-height:1.5;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";margin:0;padding:0;color:rgba(0,0,0,.65);line-height:0;list-style:none;background:#fff;outline:none;box-shadow:0 2px 8px rgba(0,0,0,.15);-webkit-transition:background .3s,width .2s;transition:background .3s,width .2s;zoom:1}.ant-menu:after,.ant-menu:before{display:table;content:""}.ant-menu:after{clear:both}.ant-menu ol,.ant-menu ul{margin:0;padding:0;list-style:none}.ant-menu-hidden{display:none}.ant-menu-item-group-title{padding:8px 16px;color:rgba(0,0,0,.45);font-size:14px;line-height:1.5;-webkit-transition:all .3s;transition:all .3s}.ant-menu-submenu,.ant-menu-submenu-inline{-webkit-transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1);transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-item:active,.ant-menu-submenu-title:active{background:#e6f7ff}.ant-menu-submenu .ant-menu-sub{cursor:auto;-webkit-transition:background .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:background .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-item>a{display:block;color:rgba(0,0,0,.65)}.ant-menu-item>a:hover{color:#1890ff}.ant-menu-item>a:before{position:absolute;top:0;right:0;bottom:0;left:0;background-color:initial;content:""}.ant-menu-item-divider{height:1px;overflow:hidden;line-height:0;background-color:#e8e8e8}.ant-menu-item-active,.ant-menu-item:hover,.ant-menu-submenu-active,.ant-menu-submenu-title:hover,.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open{color:#1890ff}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu{margin-top:-1px}.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu .ant-menu-submenu-title:hover{background-color:initial}.ant-menu-item-selected,.ant-menu-item-selected>a,.ant-menu-item-selected>a:hover{color:#1890ff}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#e6f7ff}.ant-menu-inline,.ant-menu-vertical,.ant-menu-vertical-left{border-right:1px solid #e8e8e8}.ant-menu-vertical-right{border-left:1px solid #e8e8e8}.ant-menu-vertical-left.ant-menu-sub,.ant-menu-vertical-right.ant-menu-sub,.ant-menu-vertical.ant-menu-sub{min-width:160px;padding:0;border-right:0;-webkit-transform-origin:0 0;transform-origin:0 0}.ant-menu-vertical-left.ant-menu-sub .ant-menu-item,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item,.ant-menu-vertical.ant-menu-sub .ant-menu-item{left:0;margin-left:0;border-right:0}.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical.ant-menu-sub .ant-menu-item:after{border-right:0}.ant-menu-vertical-left.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-left.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu{-webkit-transform-origin:0 0;transform-origin:0 0}.ant-menu-horizontal.ant-menu-sub{min-width:114px}.ant-menu-item,.ant-menu-submenu-title{position:relative;display:block;margin:0;padding:0 20px;white-space:nowrap;cursor:pointer;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-item .anticon,.ant-menu-submenu-title .anticon{min-width:14px;margin-right:10px;font-size:14px;-webkit-transition:font-size .15s cubic-bezier(.215,.61,.355,1),margin .3s cubic-bezier(.645,.045,.355,1);transition:font-size .15s cubic-bezier(.215,.61,.355,1),margin .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-item .anticon+span,.ant-menu-submenu-title .anticon+span{opacity:1;-webkit-transition:opacity .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1);transition:opacity .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1)}.ant-menu>.ant-menu-item-divider{height:1px;margin:1px 0;padding:0;overflow:hidden;line-height:0;background-color:#e8e8e8}.ant-menu-submenu-popup{position:absolute;z-index:1050;background:#fff;border-radius:4px}.ant-menu-submenu-popup .submenu-title-wrapper{padding-right:20px}.ant-menu-submenu-popup:before{position:absolute;top:-7px;right:0;bottom:0;left:0;opacity:.0001;content:" "}.ant-menu-submenu>.ant-menu{background-color:#fff;border-radius:4px}.ant-menu-submenu>.ant-menu-submenu-title:after{-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow{position:absolute;top:50%;right:16px;width:10px;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{position:absolute;width:6px;height:1.5px;background:#fff;background:rgba(0,0,0,.65)\9;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.65)),to(rgba(0,0,0,.65)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.65),rgba(0,0,0,.65));background-image:linear-gradient(90deg,rgba(0,0,0,.65),rgba(0,0,0,.65));background-image:none\9;border-radius:2px;-webkit-transition:background .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:background .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:background .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1);transition:background .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);content:""}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{-webkit-transform:rotate(45deg) translateY(-2px);transform:rotate(45deg) translateY(-2px)}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:after{-webkit-transform:rotate(-45deg) translateY(2px);transform:rotate(-45deg) translateY(2px)}.ant-menu-submenu-inline>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,.ant-menu-submenu-inline>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before{background:-webkit-gradient(linear,left top,right top,from(#1890ff),to(#1890ff));background:-webkit-linear-gradient(left,#1890ff,#1890ff);background:linear-gradient(90deg,#1890ff,#1890ff)}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{-webkit-transform:rotate(-45deg) translateX(2px);transform:rotate(-45deg) translateX(2px)}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:after{-webkit-transform:rotate(45deg) translateX(-2px);transform:rotate(45deg) translateX(-2px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow{-webkit-transform:translateY(-2px);transform:translateY(-2px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:after{-webkit-transform:rotate(-45deg) translateX(-2px);transform:rotate(-45deg) translateX(-2px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{-webkit-transform:rotate(45deg) translateX(2px);transform:rotate(45deg) translateX(2px)}.ant-menu-vertical-left .ant-menu-submenu-selected,.ant-menu-vertical-left .ant-menu-submenu-selected>a,.ant-menu-vertical-right .ant-menu-submenu-selected,.ant-menu-vertical-right .ant-menu-submenu-selected>a,.ant-menu-vertical .ant-menu-submenu-selected,.ant-menu-vertical .ant-menu-submenu-selected>a{color:#1890ff}.ant-menu-horizontal{line-height:46px;white-space:nowrap;border:0;border-bottom:1px solid #e8e8e8;box-shadow:none}.ant-menu-horizontal>.ant-menu-item,.ant-menu-horizontal>.ant-menu-submenu{position:relative;top:1px;display:inline-block;vertical-align:bottom;border-bottom:2px solid transparent}.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item-open,.ant-menu-horizontal>.ant-menu-item-selected,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu-active,.ant-menu-horizontal>.ant-menu-submenu-open,.ant-menu-horizontal>.ant-menu-submenu-selected,.ant-menu-horizontal>.ant-menu-submenu:hover{color:#1890ff;border-bottom:2px solid #1890ff}.ant-menu-horizontal>.ant-menu-item>a{display:block;color:rgba(0,0,0,.65)}.ant-menu-horizontal>.ant-menu-item>a:hover{color:#1890ff}.ant-menu-horizontal>.ant-menu-item>a:before{bottom:-2px}.ant-menu-horizontal>.ant-menu-item-selected>a{color:#1890ff}.ant-menu-horizontal:after{display:block;clear:both;height:0;content:" "}.ant-menu-inline .ant-menu-item,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-right .ant-menu-item,.ant-menu-vertical .ant-menu-item{position:relative}.ant-menu-inline .ant-menu-item:after,.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-vertical .ant-menu-item:after{position:absolute;top:0;right:0;bottom:0;border-right:3px solid #1890ff;-webkit-transform:scaleY(.0001);transform:scaleY(.0001);opacity:0;-webkit-transition:opacity .15s cubic-bezier(.215,.61,.355,1),-webkit-transform .15s cubic-bezier(.215,.61,.355,1);transition:opacity .15s cubic-bezier(.215,.61,.355,1),-webkit-transform .15s cubic-bezier(.215,.61,.355,1);transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1);transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1),-webkit-transform .15s cubic-bezier(.215,.61,.355,1);content:""}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-left .ant-menu-submenu-title,.ant-menu-vertical-right .ant-menu-item,.ant-menu-vertical-right .ant-menu-submenu-title,.ant-menu-vertical .ant-menu-item,.ant-menu-vertical .ant-menu-submenu-title{height:40px;margin-top:4px;margin-bottom:4px;padding:0 16px;overflow:hidden;font-size:14px;line-height:40px;text-overflow:ellipsis}.ant-menu-inline .ant-menu-submenu,.ant-menu-vertical-left .ant-menu-submenu,.ant-menu-vertical-right .ant-menu-submenu,.ant-menu-vertical .ant-menu-submenu{padding-bottom:.01px}.ant-menu-inline .ant-menu-item:not(:last-child),.ant-menu-vertical-left .ant-menu-item:not(:last-child),.ant-menu-vertical-right .ant-menu-item:not(:last-child),.ant-menu-vertical .ant-menu-item:not(:last-child){margin-bottom:8px}.ant-menu-inline>.ant-menu-item,.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-left>.ant-menu-item,.ant-menu-vertical-left>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-right>.ant-menu-item,.ant-menu-vertical-right>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical>.ant-menu-item,.ant-menu-vertical>.ant-menu-submenu>.ant-menu-submenu-title{height:40px;line-height:40px}.ant-menu-inline{width:100%}.ant-menu-inline .ant-menu-item-selected:after,.ant-menu-inline .ant-menu-selected:after{-webkit-transform:scaleY(1);transform:scaleY(1);opacity:1;-webkit-transition:opacity .15s cubic-bezier(.645,.045,.355,1),-webkit-transform .15s cubic-bezier(.645,.045,.355,1);transition:opacity .15s cubic-bezier(.645,.045,.355,1),-webkit-transform .15s cubic-bezier(.645,.045,.355,1);transition:transform .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1);transition:transform .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1),-webkit-transform .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title{width:calc(100% + 1px)}.ant-menu-inline .ant-menu-submenu-title{padding-right:34px}.ant-menu-inline-collapsed{width:80px}.ant-menu-inline-collapsed>.ant-menu-item,.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item,.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title{left:0;padding:0 32px!important;text-overflow:clip}.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow{display:none}.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon,.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon,.ant-menu-inline-collapsed>.ant-menu-item .anticon,.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon{margin:0;font-size:16px;line-height:40px}.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon+span,.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span,.ant-menu-inline-collapsed>.ant-menu-item .anticon+span,.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span{display:inline-block;max-width:0;opacity:0}.ant-menu-inline-collapsed-tooltip{pointer-events:none}.ant-menu-inline-collapsed-tooltip .anticon{display:none}.ant-menu-inline-collapsed-tooltip a{color:hsla(0,0%,100%,.85)}.ant-menu-inline-collapsed .ant-menu-item-group-title{padding-right:4px;padding-left:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-menu-item-group-list{margin:0;padding:0}.ant-menu-item-group-list .ant-menu-item,.ant-menu-item-group-list .ant-menu-submenu-title{padding:0 16px 0 28px}.ant-menu-root.ant-menu-inline,.ant-menu-root.ant-menu-vertical,.ant-menu-root.ant-menu-vertical-left,.ant-menu-root.ant-menu-vertical-right{box-shadow:none}.ant-menu-sub.ant-menu-inline{padding:0;border:0;border-radius:0;box-shadow:none}.ant-menu-sub.ant-menu-inline>.ant-menu-item,.ant-menu-sub.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title{height:40px;line-height:40px;list-style-position:inside;list-style-type:disc}.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-left:32px}.ant-menu-item-disabled,.ant-menu-submenu-disabled{color:rgba(0,0,0,.25)!important;background:none;border-color:transparent!important;cursor:not-allowed}.ant-menu-item-disabled>a,.ant-menu-submenu-disabled>a{color:rgba(0,0,0,.25)!important;pointer-events:none}.ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-submenu-disabled>.ant-menu-submenu-title{color:rgba(0,0,0,.25)!important;cursor:not-allowed}.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:rgba(0,0,0,.25)!important}.ant-menu-dark,.ant-menu-dark .ant-menu-sub{color:hsla(0,0%,100%,.65);background:#001529}.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow{opacity:.45;-webkit-transition:all .3s;transition:all .3s}.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark.ant-menu-submenu-popup{background:transparent}.ant-menu-dark .ant-menu-inline.ant-menu-sub{background:#000c17;box-shadow:inset 0 2px 8px rgba(0,0,0,.45)}.ant-menu-dark.ant-menu-horizontal{border-bottom:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item,.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu{top:0;margin-top:0;border-color:#001529;border-bottom:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item>a:before{bottom:0}.ant-menu-dark .ant-menu-item,.ant-menu-dark .ant-menu-item-group-title,.ant-menu-dark .ant-menu-item>a{color:hsla(0,0%,100%,.65)}.ant-menu-dark.ant-menu-inline,.ant-menu-dark.ant-menu-vertical,.ant-menu-dark.ant-menu-vertical-left,.ant-menu-dark.ant-menu-vertical-right{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item,.ant-menu-dark.ant-menu-vertical .ant-menu-item{left:0;margin-left:0;border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical .ant-menu-item:after{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title{width:100%}.ant-menu-dark .ant-menu-item-active,.ant-menu-dark .ant-menu-item:hover,.ant-menu-dark .ant-menu-submenu-active,.ant-menu-dark .ant-menu-submenu-open,.ant-menu-dark .ant-menu-submenu-selected,.ant-menu-dark .ant-menu-submenu-title:hover{color:#fff;background-color:initial}.ant-menu-dark .ant-menu-item-active>a,.ant-menu-dark .ant-menu-item:hover>a,.ant-menu-dark .ant-menu-submenu-active>a,.ant-menu-dark .ant-menu-submenu-open>a,.ant-menu-dark .ant-menu-submenu-selected>a,.ant-menu-dark .ant-menu-submenu-title:hover>a{color:#fff}.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow{opacity:1}.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark .ant-menu-item-selected{color:#fff;border-right:0}.ant-menu-dark .ant-menu-item-selected:after{border-right:0}.ant-menu-dark .ant-menu-item-selected>a,.ant-menu-dark .ant-menu-item-selected>a:hover{color:#fff}.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected,.ant-menu.ant-menu-dark .ant-menu-item-selected{background-color:#1890ff}.ant-menu-dark .ant-menu-item-disabled,.ant-menu-dark .ant-menu-item-disabled>a,.ant-menu-dark .ant-menu-submenu-disabled,.ant-menu-dark .ant-menu-submenu-disabled>a{color:hsla(0,0%,100%,.35)!important;opacity:.8}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title{color:hsla(0,0%,100%,.35)!important}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:hsla(0,0%,100%,.35)!important}.ant-tooltip{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:absolute;z-index:1060;display:block;max-width:250px;visibility:visible}.ant-tooltip-hidden{display:none}.ant-tooltip-placement-top,.ant-tooltip-placement-topLeft,.ant-tooltip-placement-topRight{padding-bottom:8px}.ant-tooltip-placement-right,.ant-tooltip-placement-rightBottom,.ant-tooltip-placement-rightTop{padding-left:8px}.ant-tooltip-placement-bottom,.ant-tooltip-placement-bottomLeft,.ant-tooltip-placement-bottomRight{padding-top:8px}.ant-tooltip-placement-left,.ant-tooltip-placement-leftBottom,.ant-tooltip-placement-leftTop{padding-right:8px}.ant-tooltip-inner{min-width:30px;min-height:32px;padding:6px 8px;color:#fff;text-align:left;text-decoration:none;word-wrap:break-word;background-color:rgba(0,0,0,.75);border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.ant-tooltip-placement-top .ant-tooltip-arrow,.ant-tooltip-placement-topLeft .ant-tooltip-arrow,.ant-tooltip-placement-topRight .ant-tooltip-arrow{bottom:3px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,.75)}.ant-tooltip-placement-top .ant-tooltip-arrow{left:50%;margin-left:-5px}.ant-tooltip-placement-topLeft .ant-tooltip-arrow{left:16px}.ant-tooltip-placement-topRight .ant-tooltip-arrow{right:16px}.ant-tooltip-placement-right .ant-tooltip-arrow,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow,.ant-tooltip-placement-rightTop .ant-tooltip-arrow{left:3px;border-width:5px 5px 5px 0;border-right-color:rgba(0,0,0,.75)}.ant-tooltip-placement-right .ant-tooltip-arrow{top:50%;margin-top:-5px}.ant-tooltip-placement-rightTop .ant-tooltip-arrow{top:8px}.ant-tooltip-placement-rightBottom .ant-tooltip-arrow{bottom:8px}.ant-tooltip-placement-left .ant-tooltip-arrow,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow,.ant-tooltip-placement-leftTop .ant-tooltip-arrow{right:3px;border-width:5px 0 5px 5px;border-left-color:rgba(0,0,0,.75)}.ant-tooltip-placement-left .ant-tooltip-arrow{top:50%;margin-top:-5px}.ant-tooltip-placement-leftTop .ant-tooltip-arrow{top:8px}.ant-tooltip-placement-leftBottom .ant-tooltip-arrow{bottom:8px}.ant-tooltip-placement-bottom .ant-tooltip-arrow,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{top:3px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,.75)}.ant-tooltip-placement-bottom .ant-tooltip-arrow{left:50%;margin-left:-5px}.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow{left:16px}.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{right:16px}.ant-dropdown{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;display:block}.ant-dropdown:before{position:absolute;top:-7px;right:0;bottom:-7px;left:-7px;z-index:-9999;opacity:.0001;content:" "}.ant-dropdown-wrap{position:relative}.ant-dropdown-wrap .ant-btn>.anticon-down{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}:root .ant-dropdown-wrap .ant-btn>.anticon-down{font-size:12px}.ant-dropdown-wrap .anticon-down:before{-webkit-transition:-webkit-transform .2s;transition:-webkit-transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s}.ant-dropdown-wrap-open .anticon-down:before{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.ant-dropdown-hidden,.ant-dropdown-menu-hidden{display:none}.ant-dropdown-menu{position:relative;margin:0;padding:4px 0;text-align:left;list-style-type:none;background-color:#fff;background-clip:padding-box;border-radius:4px;outline:none;box-shadow:0 2px 8px rgba(0,0,0,.15);-webkit-transform:translateZ(0)}.ant-dropdown-menu-item-group-title{padding:5px 12px;color:rgba(0,0,0,.45);-webkit-transition:all .3s;transition:all .3s}.ant-dropdown-menu-submenu-popup{position:absolute;z-index:1050}.ant-dropdown-menu-submenu-popup>.ant-dropdown-menu{-webkit-transform-origin:0 0;transform-origin:0 0}.ant-dropdown-menu-item,.ant-dropdown-menu-submenu-title{clear:both;margin:0;padding:5px 12px;color:rgba(0,0,0,.65);font-weight:400;font-size:14px;line-height:22px;white-space:nowrap;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-dropdown-menu-item>.anticon:first-child,.ant-dropdown-menu-submenu-title>.anticon:first-child{min-width:12px;margin-right:8px}.ant-dropdown-menu-item>a,.ant-dropdown-menu-submenu-title>a{display:block;margin:-5px -12px;padding:5px 12px;color:rgba(0,0,0,.65);-webkit-transition:all .3s;transition:all .3s}.ant-dropdown-menu-item-selected,.ant-dropdown-menu-item-selected>a,.ant-dropdown-menu-submenu-title-selected,.ant-dropdown-menu-submenu-title-selected>a{color:#1890ff;background-color:#e6f7ff}.ant-dropdown-menu-item:hover,.ant-dropdown-menu-submenu-title:hover{background-color:#e6f7ff}.ant-dropdown-menu-item-disabled,.ant-dropdown-menu-submenu-title-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-dropdown-menu-item-disabled:hover,.ant-dropdown-menu-submenu-title-disabled:hover{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-dropdown-menu-item-divider,.ant-dropdown-menu-submenu-title-divider{height:1px;margin:4px 0;overflow:hidden;line-height:0;background-color:#e8e8e8}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow{position:absolute;right:8px}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon{color:rgba(0,0,0,.45);font-style:normal;display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}:root .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon,:root .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon{font-size:12px}.ant-dropdown-menu-submenu-title{padding-right:26px}.ant-dropdown-menu-submenu-vertical{position:relative}.ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{position:absolute;top:0;left:100%;min-width:100%;margin-left:4px;-webkit-transform-origin:0 0;transform-origin:0 0}.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomCenter,.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomRight,.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomCenter,.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomRight{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topCenter,.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topLeft,.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topRight,.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topCenter,.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topLeft,.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topRight{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomCenter,.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomRight{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topCenter,.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topLeft,.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topRight{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-dropdown-link>.anticon.anticon-down,.ant-dropdown-trigger>.anticon.anticon-down{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}:root .ant-dropdown-link>.anticon.anticon-down,:root .ant-dropdown-trigger>.anticon.anticon-down{font-size:12px}.ant-dropdown-button{white-space:nowrap}.ant-dropdown-button.ant-btn-group>.ant-btn:last-child:not(:first-child){padding-right:8px;padding-left:8px}.ant-dropdown-button .anticon.anticon-down{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}:root .ant-dropdown-button .anticon.anticon-down{font-size:12px}.ant-dropdown-menu-dark,.ant-dropdown-menu-dark .ant-dropdown-menu{background:#001529}.ant-dropdown-menu-dark .ant-dropdown-menu-item,.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after{color:hsla(0,0%,100%,.65)}.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover{color:#fff;background:transparent}.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected>a{color:#fff;background:#1890ff}.ant-fullcalendar{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";border-top:1px solid #d9d9d9;outline:none}.ant-select.ant-fullcalendar-year-select{min-width:90px}.ant-select.ant-fullcalendar-year-select.ant-select-sm{min-width:70px}.ant-select.ant-fullcalendar-month-select{min-width:80px;margin-left:8px}.ant-select.ant-fullcalendar-month-select.ant-select-sm{min-width:70px}.ant-fullcalendar-header{padding:11px 16px 11px 0;text-align:right}.ant-fullcalendar-header .ant-select-dropdown{text-align:left}.ant-fullcalendar-header .ant-radio-group{margin-left:8px;text-align:left}.ant-fullcalendar-header label.ant-radio-button{height:22px;padding:0 10px;line-height:20px}.ant-fullcalendar-date-panel{position:relative;outline:none}.ant-fullcalendar-calendar-body{padding:8px 12px}.ant-fullcalendar table{width:100%;max-width:100%;height:256px;background-color:initial;border-collapse:collapse}.ant-fullcalendar table,.ant-fullcalendar td,.ant-fullcalendar th{border:0}.ant-fullcalendar td{position:relative}.ant-fullcalendar-calendar-table{margin-bottom:0;border-spacing:0}.ant-fullcalendar-column-header{width:33px;padding:0;line-height:18px;text-align:center}.ant-fullcalendar-column-header .ant-fullcalendar-column-header-inner{display:block;font-weight:400}.ant-fullcalendar-week-number-header .ant-fullcalendar-column-header-inner{display:none}.ant-fullcalendar-date,.ant-fullcalendar-month{text-align:center;-webkit-transition:all .3s;transition:all .3s}.ant-fullcalendar-value{display:block;width:24px;height:24px;margin:0 auto;padding:0;color:rgba(0,0,0,.65);line-height:24px;background:transparent;border-radius:2px;-webkit-transition:all .3s;transition:all .3s}.ant-fullcalendar-value:hover{background:#e6f7ff;cursor:pointer}.ant-fullcalendar-value:active{color:#fff;background:#1890ff}.ant-fullcalendar-month-panel-cell .ant-fullcalendar-value{width:48px}.ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value,.ant-fullcalendar-today .ant-fullcalendar-value{box-shadow:inset 0 0 0 1px #1890ff}.ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value,.ant-fullcalendar-selected-day .ant-fullcalendar-value{color:#fff;background:#1890ff}.ant-fullcalendar-disabled-cell-first-of-row .ant-fullcalendar-value{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-fullcalendar-disabled-cell-last-of-row .ant-fullcalendar-value{border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-fullcalendar-last-month-cell .ant-fullcalendar-value,.ant-fullcalendar-next-month-btn-day .ant-fullcalendar-value{color:rgba(0,0,0,.25)}.ant-fullcalendar-month-panel-table{width:100%;table-layout:fixed;border-collapse:initial}.ant-fullcalendar-content{position:absolute;bottom:-9px;left:0;width:100%}.ant-fullcalendar-fullscreen{border-top:0}.ant-fullcalendar-fullscreen .ant-fullcalendar-table{table-layout:fixed}.ant-fullcalendar-fullscreen .ant-fullcalendar-header .ant-radio-group{margin-left:16px}.ant-fullcalendar-fullscreen .ant-fullcalendar-header label.ant-radio-button{height:32px;line-height:30px}.ant-fullcalendar-fullscreen .ant-fullcalendar-date,.ant-fullcalendar-fullscreen .ant-fullcalendar-month{display:block;height:116px;margin:0 4px;padding:4px 8px;color:rgba(0,0,0,.65);text-align:left;border-top:2px solid #e8e8e8;-webkit-transition:background .3s;transition:background .3s}.ant-fullcalendar-fullscreen .ant-fullcalendar-date:hover,.ant-fullcalendar-fullscreen .ant-fullcalendar-month:hover{background:#e6f7ff;cursor:pointer}.ant-fullcalendar-fullscreen .ant-fullcalendar-date:active,.ant-fullcalendar-fullscreen .ant-fullcalendar-month:active{background:#bae7ff}.ant-fullcalendar-fullscreen .ant-fullcalendar-column-header{padding-right:12px;padding-bottom:5px;text-align:right}.ant-fullcalendar-fullscreen .ant-fullcalendar-value{width:auto;text-align:right;background:transparent}.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value{color:rgba(0,0,0,.65)}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-month,.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-date{background:transparent;border-top-color:#1890ff}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value,.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value{box-shadow:none}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-month,.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-date{background:#e6f7ff}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value,.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-value{color:#1890ff}.ant-fullcalendar-fullscreen .ant-fullcalendar-last-month-cell .ant-fullcalendar-date,.ant-fullcalendar-fullscreen .ant-fullcalendar-next-month-btn-day .ant-fullcalendar-date{color:rgba(0,0,0,.25)}.ant-fullcalendar-fullscreen .ant-fullcalendar-content{position:static;width:auto;height:88px;overflow-y:auto}.ant-fullcalendar-disabled-cell .ant-fullcalendar-date,.ant-fullcalendar-disabled-cell .ant-fullcalendar-date:hover{cursor:not-allowed}.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date,.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date:hover{background:transparent}.ant-fullcalendar-disabled-cell .ant-fullcalendar-value{width:auto;color:rgba(0,0,0,.25);border-radius:0;cursor:not-allowed}.ant-radio-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block;line-height:unset}.ant-radio-wrapper{margin:0 8px 0 0}.ant-radio,.ant-radio-wrapper{box-sizing:border-box;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;display:inline-block;white-space:nowrap;cursor:pointer}.ant-radio{margin:0;line-height:1;vertical-align:sub;outline:none}.ant-radio-input:focus+.ant-radio-inner,.ant-radio-wrapper:hover .ant-radio,.ant-radio:hover .ant-radio-inner{border-color:#1890ff}.ant-radio-input:focus+.ant-radio-inner{box-shadow:0 0 0 3px rgba(24,144,255,.08)}.ant-radio-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:50%;visibility:hidden;-webkit-animation:antRadioEffect .36s ease-in-out;animation:antRadioEffect .36s ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both;content:""}.ant-radio-wrapper:hover .ant-radio:after,.ant-radio:hover:after{visibility:visible}.ant-radio-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;background-color:#fff;border:1px solid #d9d9d9;border-radius:100px;-webkit-transition:all .3s;transition:all .3s}.ant-radio-inner:after{position:absolute;top:3px;left:3px;display:table;width:8px;height:8px;background-color:#1890ff;border-top:0;border-left:0;border-radius:8px;-webkit-transform:scale(0);transform:scale(0);opacity:0;-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86);content:" "}.ant-radio-input{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;cursor:pointer;opacity:0}.ant-radio-checked .ant-radio-inner{border-color:#1890ff}.ant-radio-checked .ant-radio-inner:after{-webkit-transform:scale(1);transform:scale(1);opacity:1;-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-radio-disabled .ant-radio-inner{background-color:#f5f5f5;border-color:#d9d9d9!important;cursor:not-allowed}.ant-radio-disabled .ant-radio-inner:after{background-color:rgba(0,0,0,.2)}.ant-radio-disabled .ant-radio-input{cursor:not-allowed}.ant-radio-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}span.ant-radio+*{padding-right:8px;padding-left:8px}.ant-radio-button-wrapper{position:relative;display:inline-block;height:32px;margin:0;padding:0 15px;color:rgba(0,0,0,.65);line-height:30px;background:#fff;border:1px solid #d9d9d9;border-top:1.02px solid #d9d9d9;border-left:0;cursor:pointer;-webkit-transition:color .3s,background .3s,border-color .3s;transition:color .3s,background .3s,border-color .3s}.ant-radio-button-wrapper a{color:rgba(0,0,0,.65)}.ant-radio-button-wrapper>.ant-radio-button{display:block;width:0;height:0;margin-left:0}.ant-radio-group-large .ant-radio-button-wrapper{height:40px;font-size:16px;line-height:38px}.ant-radio-group-small .ant-radio-button-wrapper{height:24px;padding:0 7px;line-height:22px}.ant-radio-button-wrapper:not(:first-child):before{position:absolute;top:0;left:-1px;display:block;width:1px;height:100%;background-color:#d9d9d9;content:""}.ant-radio-button-wrapper:first-child{border-left:1px solid #d9d9d9;border-radius:4px 0 0 4px}.ant-radio-button-wrapper:last-child{border-radius:0 4px 4px 0}.ant-radio-button-wrapper:first-child:last-child{border-radius:4px}.ant-radio-button-wrapper:hover{position:relative;color:#1890ff}.ant-radio-button-wrapper:focus-within{outline:3px solid rgba(24,144,255,.06)}.ant-radio-button-wrapper .ant-radio-inner,.ant-radio-button-wrapper input[type=checkbox],.ant-radio-button-wrapper input[type=radio]{width:0;height:0;opacity:0;pointer-events:none}.ant-radio-button-wrapper-checked{z-index:1;color:#1890ff;background:#fff;border-color:#1890ff;box-shadow:-1px 0 0 0 #1890ff}.ant-radio-button-wrapper-checked:before{background-color:#1890ff!important;opacity:.1}.ant-radio-button-wrapper-checked:first-child{border-color:#1890ff;box-shadow:none!important}.ant-radio-button-wrapper-checked:hover{color:#40a9ff;border-color:#40a9ff;box-shadow:-1px 0 0 0 #40a9ff}.ant-radio-button-wrapper-checked:active{color:#096dd9;border-color:#096dd9;box-shadow:-1px 0 0 0 #096dd9}.ant-radio-button-wrapper-checked:focus-within{outline:3px solid rgba(24,144,255,.06)}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled){color:#fff;background:#1890ff;border-color:#1890ff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{color:#fff;background:#40a9ff;border-color:#40a9ff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active{color:#fff;background:#096dd9;border-color:#096dd9}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within{outline:3px solid rgba(24,144,255,.06)}.ant-radio-button-wrapper-disabled{cursor:not-allowed}.ant-radio-button-wrapper-disabled,.ant-radio-button-wrapper-disabled:first-child,.ant-radio-button-wrapper-disabled:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9}.ant-radio-button-wrapper-disabled:first-child{border-left-color:#d9d9d9}.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked{color:#fff;background-color:#e6e6e6;border-color:#d9d9d9;box-shadow:none}@-webkit-keyframes antRadioEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}@keyframes antRadioEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}@supports (-moz-appearance:meterbar) and (background-blend-mode:difference,normal){.ant-radio{vertical-align:text-bottom}}.ant-card{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;background:#fff;border-radius:2px;-webkit-transition:all .3s;transition:all .3s}.ant-card-hoverable{cursor:pointer}.ant-card-hoverable:hover{border-color:rgba(0,0,0,.09);box-shadow:0 2px 8px rgba(0,0,0,.09)}.ant-card-bordered{border:1px solid #e8e8e8}.ant-card-head{min-height:48px;margin-bottom:-1px;padding:0 24px;color:rgba(0,0,0,.85);font-weight:500;font-size:16px;background:transparent;border-bottom:1px solid #e8e8e8;border-radius:2px 2px 0 0;zoom:1}.ant-card-head:after,.ant-card-head:before{display:table;content:""}.ant-card-head:after{clear:both}.ant-card-head-wrapper{display:flex;align-items:center}.ant-card-head-title{display:inline-block;flex:1 1;padding:16px 0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-card-head .ant-tabs{clear:both;margin-bottom:-17px;color:rgba(0,0,0,.65);font-weight:400;font-size:14px}.ant-card-head .ant-tabs-bar{border-bottom:1px solid #e8e8e8}.ant-card-extra{float:right;margin-left:auto;padding:16px 0;color:rgba(0,0,0,.65);font-weight:400;font-size:14px}.ant-card-body{padding:24px;zoom:1}.ant-card-body:after,.ant-card-body:before{display:table;content:""}.ant-card-body:after{clear:both}.ant-card-contain-grid:not(.ant-card-loading) .ant-card-body{margin:-1px 0 0 -1px;padding:0}.ant-card-grid{float:left;width:33.33%;padding:24px;border:0;border-radius:0;box-shadow:1px 0 0 0 #e8e8e8,0 1px 0 0 #e8e8e8,1px 1px 0 0 #e8e8e8,inset 1px 0 0 0 #e8e8e8,inset 0 1px 0 0 #e8e8e8;-webkit-transition:all .3s;transition:all .3s}.ant-card-grid:hover{position:relative;z-index:1;box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-card-contain-tabs>.ant-card-head .ant-card-head-title{min-height:32px;padding-bottom:0}.ant-card-contain-tabs .ant-card-extra{padding-bottom:0}.ant-card-cover>*{display:block;width:100%}.ant-card-cover img{border-radius:2px 2px 0 0}.ant-card-actions{margin:0;padding:0;list-style:none;background:#fafafa;border-top:1px solid #e8e8e8;zoom:1}.ant-card-actions:after,.ant-card-actions:before{display:table;content:""}.ant-card-actions:after{clear:both}.ant-card-actions>li{float:left;margin:12px 0;color:rgba(0,0,0,.45);text-align:center}.ant-card-actions>li>span{position:relative;display:inline-block;min-width:32px;font-size:14px;line-height:22px;cursor:pointer}.ant-card-actions>li>span:hover{color:#1890ff;-webkit-transition:color .3s;transition:color .3s}.ant-card-actions>li>span>.anticon{font-size:16px;line-height:22px}.ant-card-actions>li>span a{display:inline-block;width:100%;color:rgba(0,0,0,.45);line-height:22px}.ant-card-actions>li>span a:hover{color:#1890ff}.ant-card-actions>li:not(:last-child){border-right:1px solid #e8e8e8}.ant-card-type-inner .ant-card-head{padding:0 24px;background:#fafafa}.ant-card-type-inner .ant-card-head-title{padding:12px 0;font-size:14px}.ant-card-type-inner .ant-card-body{padding:16px 24px}.ant-card-type-inner .ant-card-extra{padding:13.5px 0}.ant-card-meta{margin:-4px 0;zoom:1}.ant-card-meta:after,.ant-card-meta:before{display:table;content:""}.ant-card-meta:after{clear:both}.ant-card-meta-avatar{float:left;padding-right:16px}.ant-card-meta-detail{overflow:hidden}.ant-card-meta-detail>div:not(:last-child){margin-bottom:8px}.ant-card-meta-title{overflow:hidden;color:rgba(0,0,0,.85);font-weight:500;font-size:16px;white-space:nowrap;text-overflow:ellipsis}.ant-card-meta-description{color:rgba(0,0,0,.45)}.ant-card-loading{overflow:hidden}.ant-card-loading .ant-card-body{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-card-loading-content p{margin:0}.ant-card-loading-block{height:14px;margin:4px 0;background:-webkit-gradient(linear,left top,right top,from(rgba(207,216,220,.2)),color-stop(rgba(207,216,220,.4)),to(rgba(207,216,220,.2)));background:-webkit-linear-gradient(left,rgba(207,216,220,.2),rgba(207,216,220,.4),rgba(207,216,220,.2));background:linear-gradient(90deg,rgba(207,216,220,.2),rgba(207,216,220,.4),rgba(207,216,220,.2));background-size:600% 600%;border-radius:2px;-webkit-animation:card-loading 1.4s ease infinite;animation:card-loading 1.4s ease infinite}@-webkit-keyframes card-loading{0%,to{background-position:0 50%}50%{background-position:100% 50%}}@keyframes card-loading{0%,to{background-position:0 50%}50%{background-position:100% 50%}}.ant-card-small>.ant-card-head{min-height:36px;padding:0 12px;font-size:14px}.ant-card-small>.ant-card-head>.ant-card-head-wrapper>.ant-card-head-title{padding:8px 0}.ant-card-small>.ant-card-head>.ant-card-head-wrapper>.ant-card-extra{padding:8px 0;font-size:14px}.ant-card-small>.ant-card-body{padding:12px}.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-nav-container{height:40px}.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-ink-bar{visibility:hidden}.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab{height:40px;margin:0 2px 0 0;padding:0 16px;line-height:38px;background:#fafafa;border:1px solid #e8e8e8;border-radius:4px 4px 0 0;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab-active{height:40px;color:#1890ff;background:#fff;border-color:#e8e8e8;border-bottom:1px solid #fff}.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab-inactive{padding:0}.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-nav-wrap{margin-bottom:0}.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab .ant-tabs-close-x{width:16px;height:16px;height:14px;margin-right:-5px;margin-left:3px;overflow:hidden;color:rgba(0,0,0,.45);font-size:12px;vertical-align:middle;-webkit-transition:all .3s;transition:all .3s}.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab .ant-tabs-close-x:hover{color:rgba(0,0,0,.85)}.ant-tabs.ant-tabs-card .ant-tabs-card-content>.ant-tabs-tabpane,.ant-tabs.ant-tabs-editable-card .ant-tabs-card-content>.ant-tabs-tabpane{-webkit-transition:none!important;transition:none!important}.ant-tabs.ant-tabs-card .ant-tabs-card-content>.ant-tabs-tabpane-inactive,.ant-tabs.ant-tabs-editable-card .ant-tabs-card-content>.ant-tabs-tabpane-inactive{overflow:hidden}.ant-tabs.ant-tabs-card .ant-tabs-card-bar .ant-tabs-tab:hover .anticon-close{opacity:1}.ant-tabs-extra-content{line-height:40px}.ant-tabs-extra-content .ant-tabs-new-tab{position:relative;width:20px;height:20px;color:rgba(0,0,0,.65);font-size:12px;line-height:20px;text-align:center;border:1px solid #e8e8e8;border-radius:2px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-tabs-extra-content .ant-tabs-new-tab:hover{color:#1890ff;border-color:#1890ff}.ant-tabs-extra-content .ant-tabs-new-tab svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.ant-tabs-vertical.ant-tabs-card .ant-tabs-card-bar.ant-tabs-left-bar .ant-tabs-nav-container,.ant-tabs-vertical.ant-tabs-card .ant-tabs-card-bar.ant-tabs-right-bar .ant-tabs-nav-container{height:auto}.ant-tabs-vertical.ant-tabs-card .ant-tabs-card-bar.ant-tabs-left-bar .ant-tabs-tab,.ant-tabs-vertical.ant-tabs-card .ant-tabs-card-bar.ant-tabs-right-bar .ant-tabs-tab{margin-bottom:8px;border-bottom:1px solid #e8e8e8}.ant-tabs-vertical.ant-tabs-card .ant-tabs-card-bar.ant-tabs-left-bar .ant-tabs-tab-active,.ant-tabs-vertical.ant-tabs-card .ant-tabs-card-bar.ant-tabs-right-bar .ant-tabs-tab-active{padding-bottom:4px}.ant-tabs-vertical.ant-tabs-card .ant-tabs-card-bar.ant-tabs-left-bar .ant-tabs-tab:last-child,.ant-tabs-vertical.ant-tabs-card .ant-tabs-card-bar.ant-tabs-right-bar .ant-tabs-tab:last-child{margin-bottom:8px}.ant-tabs-vertical.ant-tabs-card .ant-tabs-card-bar.ant-tabs-left-bar .ant-tabs-new-tab,.ant-tabs-vertical.ant-tabs-card .ant-tabs-card-bar.ant-tabs-right-bar .ant-tabs-new-tab{width:90%}.ant-tabs-vertical.ant-tabs-card.ant-tabs-left .ant-tabs-card-bar.ant-tabs-left-bar .ant-tabs-nav-wrap{margin-right:0}.ant-tabs-vertical.ant-tabs-card.ant-tabs-left .ant-tabs-card-bar.ant-tabs-left-bar .ant-tabs-tab{margin-right:1px;border-right:0;border-radius:4px 0 0 4px}.ant-tabs-vertical.ant-tabs-card.ant-tabs-left .ant-tabs-card-bar.ant-tabs-left-bar .ant-tabs-tab-active{margin-right:-1px;padding-right:18px}.ant-tabs-vertical.ant-tabs-card.ant-tabs-right .ant-tabs-card-bar.ant-tabs-right-bar .ant-tabs-nav-wrap{margin-left:0}.ant-tabs-vertical.ant-tabs-card.ant-tabs-right .ant-tabs-card-bar.ant-tabs-right-bar .ant-tabs-tab{margin-left:1px;border-left:0;border-radius:0 4px 4px 0}.ant-tabs-vertical.ant-tabs-card.ant-tabs-right .ant-tabs-card-bar.ant-tabs-right-bar .ant-tabs-tab-active{margin-left:-1px;padding-left:18px}.ant-tabs .ant-tabs-card-bar.ant-tabs-bottom-bar .ant-tabs-tab{height:auto;border-top:0;border-bottom:1px solid #e8e8e8;border-radius:0 0 4px 4px}.ant-tabs .ant-tabs-card-bar.ant-tabs-bottom-bar .ant-tabs-tab-active{padding-top:1px;padding-bottom:0;color:#1890ff}.ant-tabs{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;overflow:hidden;zoom:1}.ant-tabs:after,.ant-tabs:before{display:table;content:""}.ant-tabs:after{clear:both}.ant-tabs-ink-bar{position:absolute;bottom:1px;left:0;z-index:1;box-sizing:border-box;height:2px;background-color:#1890ff;-webkit-transform-origin:0 0;transform-origin:0 0}.ant-tabs-bar{margin:0 0 16px;border-bottom:1px solid #e8e8e8;outline:none}.ant-tabs-bar,.ant-tabs-nav-container{-webkit-transition:padding .3s cubic-bezier(.645,.045,.355,1);transition:padding .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-nav-container{position:relative;box-sizing:border-box;margin-bottom:-1px;overflow:hidden;font-size:14px;line-height:1.5;white-space:nowrap;zoom:1}.ant-tabs-nav-container:after,.ant-tabs-nav-container:before{display:table;content:""}.ant-tabs-nav-container:after{clear:both}.ant-tabs-nav-container-scrolling{padding-right:32px;padding-left:32px}.ant-tabs-bottom .ant-tabs-bottom-bar{margin-top:16px;margin-bottom:0;border-top:1px solid #e8e8e8;border-bottom:none}.ant-tabs-bottom .ant-tabs-bottom-bar .ant-tabs-ink-bar{top:1px;bottom:auto}.ant-tabs-bottom .ant-tabs-bottom-bar .ant-tabs-nav-container{margin-top:-1px;margin-bottom:0}.ant-tabs-tab-next,.ant-tabs-tab-prev{position:absolute;z-index:2;width:0;height:100%;color:rgba(0,0,0,.45);text-align:center;background-color:initial;border:0;cursor:pointer;opacity:0;-webkit-transition:width .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1);transition:width .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.ant-tabs-tab-next.ant-tabs-tab-arrow-show,.ant-tabs-tab-prev.ant-tabs-tab-arrow-show{width:32px;height:100%;opacity:1;pointer-events:auto}.ant-tabs-tab-next:hover,.ant-tabs-tab-prev:hover{color:rgba(0,0,0,.65)}.ant-tabs-tab-next-icon,.ant-tabs-tab-prev-icon{position:absolute;top:50%;left:50%;font-weight:700;font-style:normal;-webkit-font-feature-settings:normal;font-feature-settings:normal;font-variant:normal;line-height:inherit;text-align:center;text-transform:none;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ant-tabs-tab-next-icon-target,.ant-tabs-tab-prev-icon-target{display:block;display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}:root .ant-tabs-tab-next-icon-target,:root .ant-tabs-tab-prev-icon-target{font-size:12px}.ant-tabs-tab-btn-disabled{cursor:not-allowed}.ant-tabs-tab-btn-disabled,.ant-tabs-tab-btn-disabled:hover{color:rgba(0,0,0,.25)}.ant-tabs-tab-next{right:2px}.ant-tabs-tab-prev{left:0}:root .ant-tabs-tab-prev{-webkit-filter:none;filter:none}.ant-tabs-nav-wrap{margin-bottom:-1px;overflow:hidden}.ant-tabs-nav-scroll{overflow:hidden;white-space:nowrap}.ant-tabs-nav{position:relative;display:inline-block;box-sizing:border-box;margin:0;padding-left:0;list-style:none;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-nav:after,.ant-tabs-nav:before{display:table;content:" "}.ant-tabs-nav:after{clear:both}.ant-tabs-nav .ant-tabs-tab{position:relative;display:inline-block;box-sizing:border-box;height:100%;margin:0 32px 0 0;padding:12px 16px;text-decoration:none;cursor:pointer;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-nav .ant-tabs-tab:last-child{margin-right:0}.ant-tabs-nav .ant-tabs-tab:hover{color:#40a9ff}.ant-tabs-nav .ant-tabs-tab:active{color:#096dd9}.ant-tabs-nav .ant-tabs-tab .anticon{margin-right:8px}.ant-tabs-nav .ant-tabs-tab-disabled,.ant-tabs-nav .ant-tabs-tab-disabled:hover{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-tabs-nav .ant-tabs-tab-active{color:#1890ff;font-weight:500}.ant-tabs .ant-tabs-large-bar .ant-tabs-nav-container{font-size:16px}.ant-tabs .ant-tabs-large-bar .ant-tabs-tab{padding:16px}.ant-tabs .ant-tabs-small-bar .ant-tabs-nav-container{font-size:14px}.ant-tabs .ant-tabs-small-bar .ant-tabs-tab{padding:8px 16px}.ant-tabs .ant-tabs-bottom-content,.ant-tabs .ant-tabs-top-content{width:100%}.ant-tabs .ant-tabs-bottom-content>.ant-tabs-tabpane,.ant-tabs .ant-tabs-top-content>.ant-tabs-tabpane{flex-shrink:0;width:100%;opacity:1;-webkit-transition:opacity .45s;transition:opacity .45s}.ant-tabs .ant-tabs-bottom-content>.ant-tabs-tabpane-inactive,.ant-tabs .ant-tabs-top-content>.ant-tabs-tabpane-inactive{height:0;padding:0!important;overflow:hidden;opacity:0;pointer-events:none}.ant-tabs .ant-tabs-bottom-content>.ant-tabs-tabpane-inactive input,.ant-tabs .ant-tabs-top-content>.ant-tabs-tabpane-inactive input{visibility:hidden}.ant-tabs .ant-tabs-bottom-content.ant-tabs-content-animated,.ant-tabs .ant-tabs-top-content.ant-tabs-content-animated{display:flex;flex-direction:row;-webkit-transition:margin-left .3s cubic-bezier(.645,.045,.355,1);transition:margin-left .3s cubic-bezier(.645,.045,.355,1);will-change:margin-left}.ant-tabs .ant-tabs-left-bar,.ant-tabs .ant-tabs-right-bar{height:100%;border-bottom:0}.ant-tabs .ant-tabs-left-bar-tab-next,.ant-tabs .ant-tabs-left-bar-tab-prev,.ant-tabs .ant-tabs-right-bar-tab-next,.ant-tabs .ant-tabs-right-bar-tab-prev{width:32px;height:0;-webkit-transition:height .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1);transition:height .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs .ant-tabs-left-bar-tab-next.ant-tabs-tab-arrow-show,.ant-tabs .ant-tabs-left-bar-tab-prev.ant-tabs-tab-arrow-show,.ant-tabs .ant-tabs-right-bar-tab-next.ant-tabs-tab-arrow-show,.ant-tabs .ant-tabs-right-bar-tab-prev.ant-tabs-tab-arrow-show{width:100%;height:32px}.ant-tabs .ant-tabs-left-bar .ant-tabs-tab,.ant-tabs .ant-tabs-right-bar .ant-tabs-tab{display:block;float:none;margin:0 0 16px;padding:8px 24px}.ant-tabs .ant-tabs-left-bar .ant-tabs-tab:last-child,.ant-tabs .ant-tabs-right-bar .ant-tabs-tab:last-child{margin-bottom:0}.ant-tabs .ant-tabs-left-bar .ant-tabs-extra-content,.ant-tabs .ant-tabs-right-bar .ant-tabs-extra-content{text-align:center}.ant-tabs .ant-tabs-left-bar .ant-tabs-nav-scroll,.ant-tabs .ant-tabs-right-bar .ant-tabs-nav-scroll{width:auto}.ant-tabs .ant-tabs-left-bar .ant-tabs-nav-container,.ant-tabs .ant-tabs-left-bar .ant-tabs-nav-wrap,.ant-tabs .ant-tabs-right-bar .ant-tabs-nav-container,.ant-tabs .ant-tabs-right-bar .ant-tabs-nav-wrap{height:100%}.ant-tabs .ant-tabs-left-bar .ant-tabs-nav-container,.ant-tabs .ant-tabs-right-bar .ant-tabs-nav-container{margin-bottom:0}.ant-tabs .ant-tabs-left-bar .ant-tabs-nav-container.ant-tabs-nav-container-scrolling,.ant-tabs .ant-tabs-right-bar .ant-tabs-nav-container.ant-tabs-nav-container-scrolling{padding:32px 0}.ant-tabs .ant-tabs-left-bar .ant-tabs-nav-wrap,.ant-tabs .ant-tabs-right-bar .ant-tabs-nav-wrap{margin-bottom:0}.ant-tabs .ant-tabs-left-bar .ant-tabs-nav,.ant-tabs .ant-tabs-right-bar .ant-tabs-nav{width:100%}.ant-tabs .ant-tabs-left-bar .ant-tabs-ink-bar,.ant-tabs .ant-tabs-right-bar .ant-tabs-ink-bar{top:0;bottom:auto;left:auto;width:2px;height:auto}.ant-tabs .ant-tabs-left-bar .ant-tabs-tab-next,.ant-tabs .ant-tabs-right-bar .ant-tabs-tab-next{bottom:0;width:100%;height:32px}.ant-tabs .ant-tabs-left-bar .ant-tabs-tab-prev,.ant-tabs .ant-tabs-right-bar .ant-tabs-tab-prev{top:0;width:100%;height:32px}.ant-tabs .ant-tabs-left-content,.ant-tabs .ant-tabs-right-content{width:auto;margin-top:0!important;overflow:hidden}.ant-tabs .ant-tabs-left-bar{float:left;margin-right:-1px;margin-bottom:0;border-right:1px solid #e8e8e8}.ant-tabs .ant-tabs-left-bar .ant-tabs-tab{text-align:right}.ant-tabs .ant-tabs-left-bar .ant-tabs-nav-container,.ant-tabs .ant-tabs-left-bar .ant-tabs-nav-wrap{margin-right:-1px}.ant-tabs .ant-tabs-left-bar .ant-tabs-ink-bar{right:1px}.ant-tabs .ant-tabs-left-content{padding-left:24px;border-left:1px solid #e8e8e8}.ant-tabs .ant-tabs-right-bar{float:right;margin-bottom:0;margin-left:-1px;border-left:1px solid #e8e8e8}.ant-tabs .ant-tabs-right-bar .ant-tabs-nav-container,.ant-tabs .ant-tabs-right-bar .ant-tabs-nav-wrap{margin-left:-1px}.ant-tabs .ant-tabs-right-bar .ant-tabs-ink-bar{left:1px}.ant-tabs .ant-tabs-right-content{padding-right:24px;border-right:1px solid #e8e8e8}.ant-tabs-bottom .ant-tabs-ink-bar-animated,.ant-tabs-top .ant-tabs-ink-bar-animated{-webkit-transition:width .3s cubic-bezier(.645,.045,.355,1),left .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:width .3s cubic-bezier(.645,.045,.355,1),left .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1),left .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1),left .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-left .ant-tabs-ink-bar-animated,.ant-tabs-right .ant-tabs-ink-bar-animated{-webkit-transition:height .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:height .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),height .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),height .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-no-animation>.ant-tabs-content>.ant-tabs-content-animated,.no-flex>.ant-tabs-content>.ant-tabs-content-animated{margin-left:0!important;-webkit-transform:none!important;transform:none!important}.ant-tabs-no-animation>.ant-tabs-content>.ant-tabs-tabpane-inactive,.no-flex>.ant-tabs-content>.ant-tabs-tabpane-inactive{height:0;padding:0!important;overflow:hidden;opacity:0;pointer-events:none}.ant-tabs-no-animation>.ant-tabs-content>.ant-tabs-tabpane-inactive input,.no-flex>.ant-tabs-content>.ant-tabs-tabpane-inactive input{visibility:hidden}.ant-tabs-left-content>.ant-tabs-content-animated,.ant-tabs-right-content>.ant-tabs-content-animated{margin-left:0!important;-webkit-transform:none!important;transform:none!important}.ant-tabs-left-content>.ant-tabs-tabpane-inactive,.ant-tabs-right-content>.ant-tabs-tabpane-inactive{height:0;padding:0!important;overflow:hidden;opacity:0;pointer-events:none}.ant-tabs-left-content>.ant-tabs-tabpane-inactive input,.ant-tabs-right-content>.ant-tabs-tabpane-inactive input{visibility:hidden}.ant-row{position:relative;height:auto;margin-right:0;margin-left:0;zoom:1;display:block;box-sizing:border-box}.ant-row:after,.ant-row:before{display:table;content:""}.ant-row:after{clear:both}.ant-row-flex{display:flex;flex-flow:row wrap}.ant-row-flex:after,.ant-row-flex:before{display:flex}.ant-row-flex-start{justify-content:flex-start}.ant-row-flex-center{justify-content:center}.ant-row-flex-end{justify-content:flex-end}.ant-row-flex-space-between{justify-content:space-between}.ant-row-flex-space-around{justify-content:space-around}.ant-row-flex-top{align-items:flex-start}.ant-row-flex-middle{align-items:center}.ant-row-flex-bottom{align-items:flex-end}.ant-col{position:relative}.ant-col-1,.ant-col-2,.ant-col-3,.ant-col-4,.ant-col-5,.ant-col-6,.ant-col-7,.ant-col-8,.ant-col-9,.ant-col-10,.ant-col-11,.ant-col-12,.ant-col-13,.ant-col-14,.ant-col-15,.ant-col-16,.ant-col-17,.ant-col-18,.ant-col-19,.ant-col-20,.ant-col-21,.ant-col-22,.ant-col-23,.ant-col-24,.ant-col-lg-1,.ant-col-lg-2,.ant-col-lg-3,.ant-col-lg-4,.ant-col-lg-5,.ant-col-lg-6,.ant-col-lg-7,.ant-col-lg-8,.ant-col-lg-9,.ant-col-lg-10,.ant-col-lg-11,.ant-col-lg-12,.ant-col-lg-13,.ant-col-lg-14,.ant-col-lg-15,.ant-col-lg-16,.ant-col-lg-17,.ant-col-lg-18,.ant-col-lg-19,.ant-col-lg-20,.ant-col-lg-21,.ant-col-lg-22,.ant-col-lg-23,.ant-col-lg-24,.ant-col-md-1,.ant-col-md-2,.ant-col-md-3,.ant-col-md-4,.ant-col-md-5,.ant-col-md-6,.ant-col-md-7,.ant-col-md-8,.ant-col-md-9,.ant-col-md-10,.ant-col-md-11,.ant-col-md-12,.ant-col-md-13,.ant-col-md-14,.ant-col-md-15,.ant-col-md-16,.ant-col-md-17,.ant-col-md-18,.ant-col-md-19,.ant-col-md-20,.ant-col-md-21,.ant-col-md-22,.ant-col-md-23,.ant-col-md-24,.ant-col-sm-1,.ant-col-sm-2,.ant-col-sm-3,.ant-col-sm-4,.ant-col-sm-5,.ant-col-sm-6,.ant-col-sm-7,.ant-col-sm-8,.ant-col-sm-9,.ant-col-sm-10,.ant-col-sm-11,.ant-col-sm-12,.ant-col-sm-13,.ant-col-sm-14,.ant-col-sm-15,.ant-col-sm-16,.ant-col-sm-17,.ant-col-sm-18,.ant-col-sm-19,.ant-col-sm-20,.ant-col-sm-21,.ant-col-sm-22,.ant-col-sm-23,.ant-col-sm-24,.ant-col-xs-1,.ant-col-xs-2,.ant-col-xs-3,.ant-col-xs-4,.ant-col-xs-5,.ant-col-xs-6,.ant-col-xs-7,.ant-col-xs-8,.ant-col-xs-9,.ant-col-xs-10,.ant-col-xs-11,.ant-col-xs-12,.ant-col-xs-13,.ant-col-xs-14,.ant-col-xs-15,.ant-col-xs-16,.ant-col-xs-17,.ant-col-xs-18,.ant-col-xs-19,.ant-col-xs-20,.ant-col-xs-21,.ant-col-xs-22,.ant-col-xs-23,.ant-col-xs-24{position:relative;min-height:1px;padding-right:0;padding-left:0}.ant-col-1,.ant-col-2,.ant-col-3,.ant-col-4,.ant-col-5,.ant-col-6,.ant-col-7,.ant-col-8,.ant-col-9,.ant-col-10,.ant-col-11,.ant-col-12,.ant-col-13,.ant-col-14,.ant-col-15,.ant-col-16,.ant-col-17,.ant-col-18,.ant-col-19,.ant-col-20,.ant-col-21,.ant-col-22,.ant-col-23,.ant-col-24{flex:0 0 auto;float:left}.ant-col-24{display:block;box-sizing:border-box;width:100%}.ant-col-push-24{left:100%}.ant-col-pull-24{right:100%}.ant-col-offset-24{margin-left:100%}.ant-col-order-24{order:24}.ant-col-23{display:block;box-sizing:border-box;width:95.83333333%}.ant-col-push-23{left:95.83333333%}.ant-col-pull-23{right:95.83333333%}.ant-col-offset-23{margin-left:95.83333333%}.ant-col-order-23{order:23}.ant-col-22{display:block;box-sizing:border-box;width:91.66666667%}.ant-col-push-22{left:91.66666667%}.ant-col-pull-22{right:91.66666667%}.ant-col-offset-22{margin-left:91.66666667%}.ant-col-order-22{order:22}.ant-col-21{display:block;box-sizing:border-box;width:87.5%}.ant-col-push-21{left:87.5%}.ant-col-pull-21{right:87.5%}.ant-col-offset-21{margin-left:87.5%}.ant-col-order-21{order:21}.ant-col-20{display:block;box-sizing:border-box;width:83.33333333%}.ant-col-push-20{left:83.33333333%}.ant-col-pull-20{right:83.33333333%}.ant-col-offset-20{margin-left:83.33333333%}.ant-col-order-20{order:20}.ant-col-19{display:block;box-sizing:border-box;width:79.16666667%}.ant-col-push-19{left:79.16666667%}.ant-col-pull-19{right:79.16666667%}.ant-col-offset-19{margin-left:79.16666667%}.ant-col-order-19{order:19}.ant-col-18{display:block;box-sizing:border-box;width:75%}.ant-col-push-18{left:75%}.ant-col-pull-18{right:75%}.ant-col-offset-18{margin-left:75%}.ant-col-order-18{order:18}.ant-col-17{display:block;box-sizing:border-box;width:70.83333333%}.ant-col-push-17{left:70.83333333%}.ant-col-pull-17{right:70.83333333%}.ant-col-offset-17{margin-left:70.83333333%}.ant-col-order-17{order:17}.ant-col-16{display:block;box-sizing:border-box;width:66.66666667%}.ant-col-push-16{left:66.66666667%}.ant-col-pull-16{right:66.66666667%}.ant-col-offset-16{margin-left:66.66666667%}.ant-col-order-16{order:16}.ant-col-15{display:block;box-sizing:border-box;width:62.5%}.ant-col-push-15{left:62.5%}.ant-col-pull-15{right:62.5%}.ant-col-offset-15{margin-left:62.5%}.ant-col-order-15{order:15}.ant-col-14{display:block;box-sizing:border-box;width:58.33333333%}.ant-col-push-14{left:58.33333333%}.ant-col-pull-14{right:58.33333333%}.ant-col-offset-14{margin-left:58.33333333%}.ant-col-order-14{order:14}.ant-col-13{display:block;box-sizing:border-box;width:54.16666667%}.ant-col-push-13{left:54.16666667%}.ant-col-pull-13{right:54.16666667%}.ant-col-offset-13{margin-left:54.16666667%}.ant-col-order-13{order:13}.ant-col-12{display:block;box-sizing:border-box;width:50%}.ant-col-push-12{left:50%}.ant-col-pull-12{right:50%}.ant-col-offset-12{margin-left:50%}.ant-col-order-12{order:12}.ant-col-11{display:block;box-sizing:border-box;width:45.83333333%}.ant-col-push-11{left:45.83333333%}.ant-col-pull-11{right:45.83333333%}.ant-col-offset-11{margin-left:45.83333333%}.ant-col-order-11{order:11}.ant-col-10{display:block;box-sizing:border-box;width:41.66666667%}.ant-col-push-10{left:41.66666667%}.ant-col-pull-10{right:41.66666667%}.ant-col-offset-10{margin-left:41.66666667%}.ant-col-order-10{order:10}.ant-col-9{display:block;box-sizing:border-box;width:37.5%}.ant-col-push-9{left:37.5%}.ant-col-pull-9{right:37.5%}.ant-col-offset-9{margin-left:37.5%}.ant-col-order-9{order:9}.ant-col-8{display:block;box-sizing:border-box;width:33.33333333%}.ant-col-push-8{left:33.33333333%}.ant-col-pull-8{right:33.33333333%}.ant-col-offset-8{margin-left:33.33333333%}.ant-col-order-8{order:8}.ant-col-7{display:block;box-sizing:border-box;width:29.16666667%}.ant-col-push-7{left:29.16666667%}.ant-col-pull-7{right:29.16666667%}.ant-col-offset-7{margin-left:29.16666667%}.ant-col-order-7{order:7}.ant-col-6{display:block;box-sizing:border-box;width:25%}.ant-col-push-6{left:25%}.ant-col-pull-6{right:25%}.ant-col-offset-6{margin-left:25%}.ant-col-order-6{order:6}.ant-col-5{display:block;box-sizing:border-box;width:20.83333333%}.ant-col-push-5{left:20.83333333%}.ant-col-pull-5{right:20.83333333%}.ant-col-offset-5{margin-left:20.83333333%}.ant-col-order-5{order:5}.ant-col-4{display:block;box-sizing:border-box;width:16.66666667%}.ant-col-push-4{left:16.66666667%}.ant-col-pull-4{right:16.66666667%}.ant-col-offset-4{margin-left:16.66666667%}.ant-col-order-4{order:4}.ant-col-3{display:block;box-sizing:border-box;width:12.5%}.ant-col-push-3{left:12.5%}.ant-col-pull-3{right:12.5%}.ant-col-offset-3{margin-left:12.5%}.ant-col-order-3{order:3}.ant-col-2{display:block;box-sizing:border-box;width:8.33333333%}.ant-col-push-2{left:8.33333333%}.ant-col-pull-2{right:8.33333333%}.ant-col-offset-2{margin-left:8.33333333%}.ant-col-order-2{order:2}.ant-col-1{display:block;box-sizing:border-box;width:4.16666667%}.ant-col-push-1{left:4.16666667%}.ant-col-pull-1{right:4.16666667%}.ant-col-offset-1{margin-left:4.16666667%}.ant-col-order-1{order:1}.ant-col-0{display:none}.ant-col-offset-0{margin-left:0}.ant-col-order-0{order:0}.ant-col-xs-1,.ant-col-xs-2,.ant-col-xs-3,.ant-col-xs-4,.ant-col-xs-5,.ant-col-xs-6,.ant-col-xs-7,.ant-col-xs-8,.ant-col-xs-9,.ant-col-xs-10,.ant-col-xs-11,.ant-col-xs-12,.ant-col-xs-13,.ant-col-xs-14,.ant-col-xs-15,.ant-col-xs-16,.ant-col-xs-17,.ant-col-xs-18,.ant-col-xs-19,.ant-col-xs-20,.ant-col-xs-21,.ant-col-xs-22,.ant-col-xs-23,.ant-col-xs-24{flex:0 0 auto;float:left}.ant-col-xs-24{display:block;box-sizing:border-box;width:100%}.ant-col-xs-push-24{left:100%}.ant-col-xs-pull-24{right:100%}.ant-col-xs-offset-24{margin-left:100%}.ant-col-xs-order-24{order:24}.ant-col-xs-23{display:block;box-sizing:border-box;width:95.83333333%}.ant-col-xs-push-23{left:95.83333333%}.ant-col-xs-pull-23{right:95.83333333%}.ant-col-xs-offset-23{margin-left:95.83333333%}.ant-col-xs-order-23{order:23}.ant-col-xs-22{display:block;box-sizing:border-box;width:91.66666667%}.ant-col-xs-push-22{left:91.66666667%}.ant-col-xs-pull-22{right:91.66666667%}.ant-col-xs-offset-22{margin-left:91.66666667%}.ant-col-xs-order-22{order:22}.ant-col-xs-21{display:block;box-sizing:border-box;width:87.5%}.ant-col-xs-push-21{left:87.5%}.ant-col-xs-pull-21{right:87.5%}.ant-col-xs-offset-21{margin-left:87.5%}.ant-col-xs-order-21{order:21}.ant-col-xs-20{display:block;box-sizing:border-box;width:83.33333333%}.ant-col-xs-push-20{left:83.33333333%}.ant-col-xs-pull-20{right:83.33333333%}.ant-col-xs-offset-20{margin-left:83.33333333%}.ant-col-xs-order-20{order:20}.ant-col-xs-19{display:block;box-sizing:border-box;width:79.16666667%}.ant-col-xs-push-19{left:79.16666667%}.ant-col-xs-pull-19{right:79.16666667%}.ant-col-xs-offset-19{margin-left:79.16666667%}.ant-col-xs-order-19{order:19}.ant-col-xs-18{display:block;box-sizing:border-box;width:75%}.ant-col-xs-push-18{left:75%}.ant-col-xs-pull-18{right:75%}.ant-col-xs-offset-18{margin-left:75%}.ant-col-xs-order-18{order:18}.ant-col-xs-17{display:block;box-sizing:border-box;width:70.83333333%}.ant-col-xs-push-17{left:70.83333333%}.ant-col-xs-pull-17{right:70.83333333%}.ant-col-xs-offset-17{margin-left:70.83333333%}.ant-col-xs-order-17{order:17}.ant-col-xs-16{display:block;box-sizing:border-box;width:66.66666667%}.ant-col-xs-push-16{left:66.66666667%}.ant-col-xs-pull-16{right:66.66666667%}.ant-col-xs-offset-16{margin-left:66.66666667%}.ant-col-xs-order-16{order:16}.ant-col-xs-15{display:block;box-sizing:border-box;width:62.5%}.ant-col-xs-push-15{left:62.5%}.ant-col-xs-pull-15{right:62.5%}.ant-col-xs-offset-15{margin-left:62.5%}.ant-col-xs-order-15{order:15}.ant-col-xs-14{display:block;box-sizing:border-box;width:58.33333333%}.ant-col-xs-push-14{left:58.33333333%}.ant-col-xs-pull-14{right:58.33333333%}.ant-col-xs-offset-14{margin-left:58.33333333%}.ant-col-xs-order-14{order:14}.ant-col-xs-13{display:block;box-sizing:border-box;width:54.16666667%}.ant-col-xs-push-13{left:54.16666667%}.ant-col-xs-pull-13{right:54.16666667%}.ant-col-xs-offset-13{margin-left:54.16666667%}.ant-col-xs-order-13{order:13}.ant-col-xs-12{display:block;box-sizing:border-box;width:50%}.ant-col-xs-push-12{left:50%}.ant-col-xs-pull-12{right:50%}.ant-col-xs-offset-12{margin-left:50%}.ant-col-xs-order-12{order:12}.ant-col-xs-11{display:block;box-sizing:border-box;width:45.83333333%}.ant-col-xs-push-11{left:45.83333333%}.ant-col-xs-pull-11{right:45.83333333%}.ant-col-xs-offset-11{margin-left:45.83333333%}.ant-col-xs-order-11{order:11}.ant-col-xs-10{display:block;box-sizing:border-box;width:41.66666667%}.ant-col-xs-push-10{left:41.66666667%}.ant-col-xs-pull-10{right:41.66666667%}.ant-col-xs-offset-10{margin-left:41.66666667%}.ant-col-xs-order-10{order:10}.ant-col-xs-9{display:block;box-sizing:border-box;width:37.5%}.ant-col-xs-push-9{left:37.5%}.ant-col-xs-pull-9{right:37.5%}.ant-col-xs-offset-9{margin-left:37.5%}.ant-col-xs-order-9{order:9}.ant-col-xs-8{display:block;box-sizing:border-box;width:33.33333333%}.ant-col-xs-push-8{left:33.33333333%}.ant-col-xs-pull-8{right:33.33333333%}.ant-col-xs-offset-8{margin-left:33.33333333%}.ant-col-xs-order-8{order:8}.ant-col-xs-7{display:block;box-sizing:border-box;width:29.16666667%}.ant-col-xs-push-7{left:29.16666667%}.ant-col-xs-pull-7{right:29.16666667%}.ant-col-xs-offset-7{margin-left:29.16666667%}.ant-col-xs-order-7{order:7}.ant-col-xs-6{display:block;box-sizing:border-box;width:25%}.ant-col-xs-push-6{left:25%}.ant-col-xs-pull-6{right:25%}.ant-col-xs-offset-6{margin-left:25%}.ant-col-xs-order-6{order:6}.ant-col-xs-5{display:block;box-sizing:border-box;width:20.83333333%}.ant-col-xs-push-5{left:20.83333333%}.ant-col-xs-pull-5{right:20.83333333%}.ant-col-xs-offset-5{margin-left:20.83333333%}.ant-col-xs-order-5{order:5}.ant-col-xs-4{display:block;box-sizing:border-box;width:16.66666667%}.ant-col-xs-push-4{left:16.66666667%}.ant-col-xs-pull-4{right:16.66666667%}.ant-col-xs-offset-4{margin-left:16.66666667%}.ant-col-xs-order-4{order:4}.ant-col-xs-3{display:block;box-sizing:border-box;width:12.5%}.ant-col-xs-push-3{left:12.5%}.ant-col-xs-pull-3{right:12.5%}.ant-col-xs-offset-3{margin-left:12.5%}.ant-col-xs-order-3{order:3}.ant-col-xs-2{display:block;box-sizing:border-box;width:8.33333333%}.ant-col-xs-push-2{left:8.33333333%}.ant-col-xs-pull-2{right:8.33333333%}.ant-col-xs-offset-2{margin-left:8.33333333%}.ant-col-xs-order-2{order:2}.ant-col-xs-1{display:block;box-sizing:border-box;width:4.16666667%}.ant-col-xs-push-1{left:4.16666667%}.ant-col-xs-pull-1{right:4.16666667%}.ant-col-xs-offset-1{margin-left:4.16666667%}.ant-col-xs-order-1{order:1}.ant-col-xs-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xs-push-0{left:auto}.ant-col-xs-pull-0{right:auto}.ant-col-xs-offset-0{margin-left:0}.ant-col-xs-order-0{order:0}@media (min-width:576px){.ant-col-sm-1,.ant-col-sm-2,.ant-col-sm-3,.ant-col-sm-4,.ant-col-sm-5,.ant-col-sm-6,.ant-col-sm-7,.ant-col-sm-8,.ant-col-sm-9,.ant-col-sm-10,.ant-col-sm-11,.ant-col-sm-12,.ant-col-sm-13,.ant-col-sm-14,.ant-col-sm-15,.ant-col-sm-16,.ant-col-sm-17,.ant-col-sm-18,.ant-col-sm-19,.ant-col-sm-20,.ant-col-sm-21,.ant-col-sm-22,.ant-col-sm-23,.ant-col-sm-24{flex:0 0 auto;float:left}.ant-col-sm-24{display:block;box-sizing:border-box;width:100%}.ant-col-sm-push-24{left:100%}.ant-col-sm-pull-24{right:100%}.ant-col-sm-offset-24{margin-left:100%}.ant-col-sm-order-24{order:24}.ant-col-sm-23{display:block;box-sizing:border-box;width:95.83333333%}.ant-col-sm-push-23{left:95.83333333%}.ant-col-sm-pull-23{right:95.83333333%}.ant-col-sm-offset-23{margin-left:95.83333333%}.ant-col-sm-order-23{order:23}.ant-col-sm-22{display:block;box-sizing:border-box;width:91.66666667%}.ant-col-sm-push-22{left:91.66666667%}.ant-col-sm-pull-22{right:91.66666667%}.ant-col-sm-offset-22{margin-left:91.66666667%}.ant-col-sm-order-22{order:22}.ant-col-sm-21{display:block;box-sizing:border-box;width:87.5%}.ant-col-sm-push-21{left:87.5%}.ant-col-sm-pull-21{right:87.5%}.ant-col-sm-offset-21{margin-left:87.5%}.ant-col-sm-order-21{order:21}.ant-col-sm-20{display:block;box-sizing:border-box;width:83.33333333%}.ant-col-sm-push-20{left:83.33333333%}.ant-col-sm-pull-20{right:83.33333333%}.ant-col-sm-offset-20{margin-left:83.33333333%}.ant-col-sm-order-20{order:20}.ant-col-sm-19{display:block;box-sizing:border-box;width:79.16666667%}.ant-col-sm-push-19{left:79.16666667%}.ant-col-sm-pull-19{right:79.16666667%}.ant-col-sm-offset-19{margin-left:79.16666667%}.ant-col-sm-order-19{order:19}.ant-col-sm-18{display:block;box-sizing:border-box;width:75%}.ant-col-sm-push-18{left:75%}.ant-col-sm-pull-18{right:75%}.ant-col-sm-offset-18{margin-left:75%}.ant-col-sm-order-18{order:18}.ant-col-sm-17{display:block;box-sizing:border-box;width:70.83333333%}.ant-col-sm-push-17{left:70.83333333%}.ant-col-sm-pull-17{right:70.83333333%}.ant-col-sm-offset-17{margin-left:70.83333333%}.ant-col-sm-order-17{order:17}.ant-col-sm-16{display:block;box-sizing:border-box;width:66.66666667%}.ant-col-sm-push-16{left:66.66666667%}.ant-col-sm-pull-16{right:66.66666667%}.ant-col-sm-offset-16{margin-left:66.66666667%}.ant-col-sm-order-16{order:16}.ant-col-sm-15{display:block;box-sizing:border-box;width:62.5%}.ant-col-sm-push-15{left:62.5%}.ant-col-sm-pull-15{right:62.5%}.ant-col-sm-offset-15{margin-left:62.5%}.ant-col-sm-order-15{order:15}.ant-col-sm-14{display:block;box-sizing:border-box;width:58.33333333%}.ant-col-sm-push-14{left:58.33333333%}.ant-col-sm-pull-14{right:58.33333333%}.ant-col-sm-offset-14{margin-left:58.33333333%}.ant-col-sm-order-14{order:14}.ant-col-sm-13{display:block;box-sizing:border-box;width:54.16666667%}.ant-col-sm-push-13{left:54.16666667%}.ant-col-sm-pull-13{right:54.16666667%}.ant-col-sm-offset-13{margin-left:54.16666667%}.ant-col-sm-order-13{order:13}.ant-col-sm-12{display:block;box-sizing:border-box;width:50%}.ant-col-sm-push-12{left:50%}.ant-col-sm-pull-12{right:50%}.ant-col-sm-offset-12{margin-left:50%}.ant-col-sm-order-12{order:12}.ant-col-sm-11{display:block;box-sizing:border-box;width:45.83333333%}.ant-col-sm-push-11{left:45.83333333%}.ant-col-sm-pull-11{right:45.83333333%}.ant-col-sm-offset-11{margin-left:45.83333333%}.ant-col-sm-order-11{order:11}.ant-col-sm-10{display:block;box-sizing:border-box;width:41.66666667%}.ant-col-sm-push-10{left:41.66666667%}.ant-col-sm-pull-10{right:41.66666667%}.ant-col-sm-offset-10{margin-left:41.66666667%}.ant-col-sm-order-10{order:10}.ant-col-sm-9{display:block;box-sizing:border-box;width:37.5%}.ant-col-sm-push-9{left:37.5%}.ant-col-sm-pull-9{right:37.5%}.ant-col-sm-offset-9{margin-left:37.5%}.ant-col-sm-order-9{order:9}.ant-col-sm-8{display:block;box-sizing:border-box;width:33.33333333%}.ant-col-sm-push-8{left:33.33333333%}.ant-col-sm-pull-8{right:33.33333333%}.ant-col-sm-offset-8{margin-left:33.33333333%}.ant-col-sm-order-8{order:8}.ant-col-sm-7{display:block;box-sizing:border-box;width:29.16666667%}.ant-col-sm-push-7{left:29.16666667%}.ant-col-sm-pull-7{right:29.16666667%}.ant-col-sm-offset-7{margin-left:29.16666667%}.ant-col-sm-order-7{order:7}.ant-col-sm-6{display:block;box-sizing:border-box;width:25%}.ant-col-sm-push-6{left:25%}.ant-col-sm-pull-6{right:25%}.ant-col-sm-offset-6{margin-left:25%}.ant-col-sm-order-6{order:6}.ant-col-sm-5{display:block;box-sizing:border-box;width:20.83333333%}.ant-col-sm-push-5{left:20.83333333%}.ant-col-sm-pull-5{right:20.83333333%}.ant-col-sm-offset-5{margin-left:20.83333333%}.ant-col-sm-order-5{order:5}.ant-col-sm-4{display:block;box-sizing:border-box;width:16.66666667%}.ant-col-sm-push-4{left:16.66666667%}.ant-col-sm-pull-4{right:16.66666667%}.ant-col-sm-offset-4{margin-left:16.66666667%}.ant-col-sm-order-4{order:4}.ant-col-sm-3{display:block;box-sizing:border-box;width:12.5%}.ant-col-sm-push-3{left:12.5%}.ant-col-sm-pull-3{right:12.5%}.ant-col-sm-offset-3{margin-left:12.5%}.ant-col-sm-order-3{order:3}.ant-col-sm-2{display:block;box-sizing:border-box;width:8.33333333%}.ant-col-sm-push-2{left:8.33333333%}.ant-col-sm-pull-2{right:8.33333333%}.ant-col-sm-offset-2{margin-left:8.33333333%}.ant-col-sm-order-2{order:2}.ant-col-sm-1{display:block;box-sizing:border-box;width:4.16666667%}.ant-col-sm-push-1{left:4.16666667%}.ant-col-sm-pull-1{right:4.16666667%}.ant-col-sm-offset-1{margin-left:4.16666667%}.ant-col-sm-order-1{order:1}.ant-col-sm-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-sm-push-0{left:auto}.ant-col-sm-pull-0{right:auto}.ant-col-sm-offset-0{margin-left:0}.ant-col-sm-order-0{order:0}}@media (min-width:768px){.ant-col-md-1,.ant-col-md-2,.ant-col-md-3,.ant-col-md-4,.ant-col-md-5,.ant-col-md-6,.ant-col-md-7,.ant-col-md-8,.ant-col-md-9,.ant-col-md-10,.ant-col-md-11,.ant-col-md-12,.ant-col-md-13,.ant-col-md-14,.ant-col-md-15,.ant-col-md-16,.ant-col-md-17,.ant-col-md-18,.ant-col-md-19,.ant-col-md-20,.ant-col-md-21,.ant-col-md-22,.ant-col-md-23,.ant-col-md-24{flex:0 0 auto;float:left}.ant-col-md-24{display:block;box-sizing:border-box;width:100%}.ant-col-md-push-24{left:100%}.ant-col-md-pull-24{right:100%}.ant-col-md-offset-24{margin-left:100%}.ant-col-md-order-24{order:24}.ant-col-md-23{display:block;box-sizing:border-box;width:95.83333333%}.ant-col-md-push-23{left:95.83333333%}.ant-col-md-pull-23{right:95.83333333%}.ant-col-md-offset-23{margin-left:95.83333333%}.ant-col-md-order-23{order:23}.ant-col-md-22{display:block;box-sizing:border-box;width:91.66666667%}.ant-col-md-push-22{left:91.66666667%}.ant-col-md-pull-22{right:91.66666667%}.ant-col-md-offset-22{margin-left:91.66666667%}.ant-col-md-order-22{order:22}.ant-col-md-21{display:block;box-sizing:border-box;width:87.5%}.ant-col-md-push-21{left:87.5%}.ant-col-md-pull-21{right:87.5%}.ant-col-md-offset-21{margin-left:87.5%}.ant-col-md-order-21{order:21}.ant-col-md-20{display:block;box-sizing:border-box;width:83.33333333%}.ant-col-md-push-20{left:83.33333333%}.ant-col-md-pull-20{right:83.33333333%}.ant-col-md-offset-20{margin-left:83.33333333%}.ant-col-md-order-20{order:20}.ant-col-md-19{display:block;box-sizing:border-box;width:79.16666667%}.ant-col-md-push-19{left:79.16666667%}.ant-col-md-pull-19{right:79.16666667%}.ant-col-md-offset-19{margin-left:79.16666667%}.ant-col-md-order-19{order:19}.ant-col-md-18{display:block;box-sizing:border-box;width:75%}.ant-col-md-push-18{left:75%}.ant-col-md-pull-18{right:75%}.ant-col-md-offset-18{margin-left:75%}.ant-col-md-order-18{order:18}.ant-col-md-17{display:block;box-sizing:border-box;width:70.83333333%}.ant-col-md-push-17{left:70.83333333%}.ant-col-md-pull-17{right:70.83333333%}.ant-col-md-offset-17{margin-left:70.83333333%}.ant-col-md-order-17{order:17}.ant-col-md-16{display:block;box-sizing:border-box;width:66.66666667%}.ant-col-md-push-16{left:66.66666667%}.ant-col-md-pull-16{right:66.66666667%}.ant-col-md-offset-16{margin-left:66.66666667%}.ant-col-md-order-16{order:16}.ant-col-md-15{display:block;box-sizing:border-box;width:62.5%}.ant-col-md-push-15{left:62.5%}.ant-col-md-pull-15{right:62.5%}.ant-col-md-offset-15{margin-left:62.5%}.ant-col-md-order-15{order:15}.ant-col-md-14{display:block;box-sizing:border-box;width:58.33333333%}.ant-col-md-push-14{left:58.33333333%}.ant-col-md-pull-14{right:58.33333333%}.ant-col-md-offset-14{margin-left:58.33333333%}.ant-col-md-order-14{order:14}.ant-col-md-13{display:block;box-sizing:border-box;width:54.16666667%}.ant-col-md-push-13{left:54.16666667%}.ant-col-md-pull-13{right:54.16666667%}.ant-col-md-offset-13{margin-left:54.16666667%}.ant-col-md-order-13{order:13}.ant-col-md-12{display:block;box-sizing:border-box;width:50%}.ant-col-md-push-12{left:50%}.ant-col-md-pull-12{right:50%}.ant-col-md-offset-12{margin-left:50%}.ant-col-md-order-12{order:12}.ant-col-md-11{display:block;box-sizing:border-box;width:45.83333333%}.ant-col-md-push-11{left:45.83333333%}.ant-col-md-pull-11{right:45.83333333%}.ant-col-md-offset-11{margin-left:45.83333333%}.ant-col-md-order-11{order:11}.ant-col-md-10{display:block;box-sizing:border-box;width:41.66666667%}.ant-col-md-push-10{left:41.66666667%}.ant-col-md-pull-10{right:41.66666667%}.ant-col-md-offset-10{margin-left:41.66666667%}.ant-col-md-order-10{order:10}.ant-col-md-9{display:block;box-sizing:border-box;width:37.5%}.ant-col-md-push-9{left:37.5%}.ant-col-md-pull-9{right:37.5%}.ant-col-md-offset-9{margin-left:37.5%}.ant-col-md-order-9{order:9}.ant-col-md-8{display:block;box-sizing:border-box;width:33.33333333%}.ant-col-md-push-8{left:33.33333333%}.ant-col-md-pull-8{right:33.33333333%}.ant-col-md-offset-8{margin-left:33.33333333%}.ant-col-md-order-8{order:8}.ant-col-md-7{display:block;box-sizing:border-box;width:29.16666667%}.ant-col-md-push-7{left:29.16666667%}.ant-col-md-pull-7{right:29.16666667%}.ant-col-md-offset-7{margin-left:29.16666667%}.ant-col-md-order-7{order:7}.ant-col-md-6{display:block;box-sizing:border-box;width:25%}.ant-col-md-push-6{left:25%}.ant-col-md-pull-6{right:25%}.ant-col-md-offset-6{margin-left:25%}.ant-col-md-order-6{order:6}.ant-col-md-5{display:block;box-sizing:border-box;width:20.83333333%}.ant-col-md-push-5{left:20.83333333%}.ant-col-md-pull-5{right:20.83333333%}.ant-col-md-offset-5{margin-left:20.83333333%}.ant-col-md-order-5{order:5}.ant-col-md-4{display:block;box-sizing:border-box;width:16.66666667%}.ant-col-md-push-4{left:16.66666667%}.ant-col-md-pull-4{right:16.66666667%}.ant-col-md-offset-4{margin-left:16.66666667%}.ant-col-md-order-4{order:4}.ant-col-md-3{display:block;box-sizing:border-box;width:12.5%}.ant-col-md-push-3{left:12.5%}.ant-col-md-pull-3{right:12.5%}.ant-col-md-offset-3{margin-left:12.5%}.ant-col-md-order-3{order:3}.ant-col-md-2{display:block;box-sizing:border-box;width:8.33333333%}.ant-col-md-push-2{left:8.33333333%}.ant-col-md-pull-2{right:8.33333333%}.ant-col-md-offset-2{margin-left:8.33333333%}.ant-col-md-order-2{order:2}.ant-col-md-1{display:block;box-sizing:border-box;width:4.16666667%}.ant-col-md-push-1{left:4.16666667%}.ant-col-md-pull-1{right:4.16666667%}.ant-col-md-offset-1{margin-left:4.16666667%}.ant-col-md-order-1{order:1}.ant-col-md-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-md-push-0{left:auto}.ant-col-md-pull-0{right:auto}.ant-col-md-offset-0{margin-left:0}.ant-col-md-order-0{order:0}}@media (min-width:992px){.ant-col-lg-1,.ant-col-lg-2,.ant-col-lg-3,.ant-col-lg-4,.ant-col-lg-5,.ant-col-lg-6,.ant-col-lg-7,.ant-col-lg-8,.ant-col-lg-9,.ant-col-lg-10,.ant-col-lg-11,.ant-col-lg-12,.ant-col-lg-13,.ant-col-lg-14,.ant-col-lg-15,.ant-col-lg-16,.ant-col-lg-17,.ant-col-lg-18,.ant-col-lg-19,.ant-col-lg-20,.ant-col-lg-21,.ant-col-lg-22,.ant-col-lg-23,.ant-col-lg-24{flex:0 0 auto;float:left}.ant-col-lg-24{display:block;box-sizing:border-box;width:100%}.ant-col-lg-push-24{left:100%}.ant-col-lg-pull-24{right:100%}.ant-col-lg-offset-24{margin-left:100%}.ant-col-lg-order-24{order:24}.ant-col-lg-23{display:block;box-sizing:border-box;width:95.83333333%}.ant-col-lg-push-23{left:95.83333333%}.ant-col-lg-pull-23{right:95.83333333%}.ant-col-lg-offset-23{margin-left:95.83333333%}.ant-col-lg-order-23{order:23}.ant-col-lg-22{display:block;box-sizing:border-box;width:91.66666667%}.ant-col-lg-push-22{left:91.66666667%}.ant-col-lg-pull-22{right:91.66666667%}.ant-col-lg-offset-22{margin-left:91.66666667%}.ant-col-lg-order-22{order:22}.ant-col-lg-21{display:block;box-sizing:border-box;width:87.5%}.ant-col-lg-push-21{left:87.5%}.ant-col-lg-pull-21{right:87.5%}.ant-col-lg-offset-21{margin-left:87.5%}.ant-col-lg-order-21{order:21}.ant-col-lg-20{display:block;box-sizing:border-box;width:83.33333333%}.ant-col-lg-push-20{left:83.33333333%}.ant-col-lg-pull-20{right:83.33333333%}.ant-col-lg-offset-20{margin-left:83.33333333%}.ant-col-lg-order-20{order:20}.ant-col-lg-19{display:block;box-sizing:border-box;width:79.16666667%}.ant-col-lg-push-19{left:79.16666667%}.ant-col-lg-pull-19{right:79.16666667%}.ant-col-lg-offset-19{margin-left:79.16666667%}.ant-col-lg-order-19{order:19}.ant-col-lg-18{display:block;box-sizing:border-box;width:75%}.ant-col-lg-push-18{left:75%}.ant-col-lg-pull-18{right:75%}.ant-col-lg-offset-18{margin-left:75%}.ant-col-lg-order-18{order:18}.ant-col-lg-17{display:block;box-sizing:border-box;width:70.83333333%}.ant-col-lg-push-17{left:70.83333333%}.ant-col-lg-pull-17{right:70.83333333%}.ant-col-lg-offset-17{margin-left:70.83333333%}.ant-col-lg-order-17{order:17}.ant-col-lg-16{display:block;box-sizing:border-box;width:66.66666667%}.ant-col-lg-push-16{left:66.66666667%}.ant-col-lg-pull-16{right:66.66666667%}.ant-col-lg-offset-16{margin-left:66.66666667%}.ant-col-lg-order-16{order:16}.ant-col-lg-15{display:block;box-sizing:border-box;width:62.5%}.ant-col-lg-push-15{left:62.5%}.ant-col-lg-pull-15{right:62.5%}.ant-col-lg-offset-15{margin-left:62.5%}.ant-col-lg-order-15{order:15}.ant-col-lg-14{display:block;box-sizing:border-box;width:58.33333333%}.ant-col-lg-push-14{left:58.33333333%}.ant-col-lg-pull-14{right:58.33333333%}.ant-col-lg-offset-14{margin-left:58.33333333%}.ant-col-lg-order-14{order:14}.ant-col-lg-13{display:block;box-sizing:border-box;width:54.16666667%}.ant-col-lg-push-13{left:54.16666667%}.ant-col-lg-pull-13{right:54.16666667%}.ant-col-lg-offset-13{margin-left:54.16666667%}.ant-col-lg-order-13{order:13}.ant-col-lg-12{display:block;box-sizing:border-box;width:50%}.ant-col-lg-push-12{left:50%}.ant-col-lg-pull-12{right:50%}.ant-col-lg-offset-12{margin-left:50%}.ant-col-lg-order-12{order:12}.ant-col-lg-11{display:block;box-sizing:border-box;width:45.83333333%}.ant-col-lg-push-11{left:45.83333333%}.ant-col-lg-pull-11{right:45.83333333%}.ant-col-lg-offset-11{margin-left:45.83333333%}.ant-col-lg-order-11{order:11}.ant-col-lg-10{display:block;box-sizing:border-box;width:41.66666667%}.ant-col-lg-push-10{left:41.66666667%}.ant-col-lg-pull-10{right:41.66666667%}.ant-col-lg-offset-10{margin-left:41.66666667%}.ant-col-lg-order-10{order:10}.ant-col-lg-9{display:block;box-sizing:border-box;width:37.5%}.ant-col-lg-push-9{left:37.5%}.ant-col-lg-pull-9{right:37.5%}.ant-col-lg-offset-9{margin-left:37.5%}.ant-col-lg-order-9{order:9}.ant-col-lg-8{display:block;box-sizing:border-box;width:33.33333333%}.ant-col-lg-push-8{left:33.33333333%}.ant-col-lg-pull-8{right:33.33333333%}.ant-col-lg-offset-8{margin-left:33.33333333%}.ant-col-lg-order-8{order:8}.ant-col-lg-7{display:block;box-sizing:border-box;width:29.16666667%}.ant-col-lg-push-7{left:29.16666667%}.ant-col-lg-pull-7{right:29.16666667%}.ant-col-lg-offset-7{margin-left:29.16666667%}.ant-col-lg-order-7{order:7}.ant-col-lg-6{display:block;box-sizing:border-box;width:25%}.ant-col-lg-push-6{left:25%}.ant-col-lg-pull-6{right:25%}.ant-col-lg-offset-6{margin-left:25%}.ant-col-lg-order-6{order:6}.ant-col-lg-5{display:block;box-sizing:border-box;width:20.83333333%}.ant-col-lg-push-5{left:20.83333333%}.ant-col-lg-pull-5{right:20.83333333%}.ant-col-lg-offset-5{margin-left:20.83333333%}.ant-col-lg-order-5{order:5}.ant-col-lg-4{display:block;box-sizing:border-box;width:16.66666667%}.ant-col-lg-push-4{left:16.66666667%}.ant-col-lg-pull-4{right:16.66666667%}.ant-col-lg-offset-4{margin-left:16.66666667%}.ant-col-lg-order-4{order:4}.ant-col-lg-3{display:block;box-sizing:border-box;width:12.5%}.ant-col-lg-push-3{left:12.5%}.ant-col-lg-pull-3{right:12.5%}.ant-col-lg-offset-3{margin-left:12.5%}.ant-col-lg-order-3{order:3}.ant-col-lg-2{display:block;box-sizing:border-box;width:8.33333333%}.ant-col-lg-push-2{left:8.33333333%}.ant-col-lg-pull-2{right:8.33333333%}.ant-col-lg-offset-2{margin-left:8.33333333%}.ant-col-lg-order-2{order:2}.ant-col-lg-1{display:block;box-sizing:border-box;width:4.16666667%}.ant-col-lg-push-1{left:4.16666667%}.ant-col-lg-pull-1{right:4.16666667%}.ant-col-lg-offset-1{margin-left:4.16666667%}.ant-col-lg-order-1{order:1}.ant-col-lg-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-lg-push-0{left:auto}.ant-col-lg-pull-0{right:auto}.ant-col-lg-offset-0{margin-left:0}.ant-col-lg-order-0{order:0}}@media (min-width:1200px){.ant-col-xl-1,.ant-col-xl-2,.ant-col-xl-3,.ant-col-xl-4,.ant-col-xl-5,.ant-col-xl-6,.ant-col-xl-7,.ant-col-xl-8,.ant-col-xl-9,.ant-col-xl-10,.ant-col-xl-11,.ant-col-xl-12,.ant-col-xl-13,.ant-col-xl-14,.ant-col-xl-15,.ant-col-xl-16,.ant-col-xl-17,.ant-col-xl-18,.ant-col-xl-19,.ant-col-xl-20,.ant-col-xl-21,.ant-col-xl-22,.ant-col-xl-23,.ant-col-xl-24{flex:0 0 auto;float:left}.ant-col-xl-24{display:block;box-sizing:border-box;width:100%}.ant-col-xl-push-24{left:100%}.ant-col-xl-pull-24{right:100%}.ant-col-xl-offset-24{margin-left:100%}.ant-col-xl-order-24{order:24}.ant-col-xl-23{display:block;box-sizing:border-box;width:95.83333333%}.ant-col-xl-push-23{left:95.83333333%}.ant-col-xl-pull-23{right:95.83333333%}.ant-col-xl-offset-23{margin-left:95.83333333%}.ant-col-xl-order-23{order:23}.ant-col-xl-22{display:block;box-sizing:border-box;width:91.66666667%}.ant-col-xl-push-22{left:91.66666667%}.ant-col-xl-pull-22{right:91.66666667%}.ant-col-xl-offset-22{margin-left:91.66666667%}.ant-col-xl-order-22{order:22}.ant-col-xl-21{display:block;box-sizing:border-box;width:87.5%}.ant-col-xl-push-21{left:87.5%}.ant-col-xl-pull-21{right:87.5%}.ant-col-xl-offset-21{margin-left:87.5%}.ant-col-xl-order-21{order:21}.ant-col-xl-20{display:block;box-sizing:border-box;width:83.33333333%}.ant-col-xl-push-20{left:83.33333333%}.ant-col-xl-pull-20{right:83.33333333%}.ant-col-xl-offset-20{margin-left:83.33333333%}.ant-col-xl-order-20{order:20}.ant-col-xl-19{display:block;box-sizing:border-box;width:79.16666667%}.ant-col-xl-push-19{left:79.16666667%}.ant-col-xl-pull-19{right:79.16666667%}.ant-col-xl-offset-19{margin-left:79.16666667%}.ant-col-xl-order-19{order:19}.ant-col-xl-18{display:block;box-sizing:border-box;width:75%}.ant-col-xl-push-18{left:75%}.ant-col-xl-pull-18{right:75%}.ant-col-xl-offset-18{margin-left:75%}.ant-col-xl-order-18{order:18}.ant-col-xl-17{display:block;box-sizing:border-box;width:70.83333333%}.ant-col-xl-push-17{left:70.83333333%}.ant-col-xl-pull-17{right:70.83333333%}.ant-col-xl-offset-17{margin-left:70.83333333%}.ant-col-xl-order-17{order:17}.ant-col-xl-16{display:block;box-sizing:border-box;width:66.66666667%}.ant-col-xl-push-16{left:66.66666667%}.ant-col-xl-pull-16{right:66.66666667%}.ant-col-xl-offset-16{margin-left:66.66666667%}.ant-col-xl-order-16{order:16}.ant-col-xl-15{display:block;box-sizing:border-box;width:62.5%}.ant-col-xl-push-15{left:62.5%}.ant-col-xl-pull-15{right:62.5%}.ant-col-xl-offset-15{margin-left:62.5%}.ant-col-xl-order-15{order:15}.ant-col-xl-14{display:block;box-sizing:border-box;width:58.33333333%}.ant-col-xl-push-14{left:58.33333333%}.ant-col-xl-pull-14{right:58.33333333%}.ant-col-xl-offset-14{margin-left:58.33333333%}.ant-col-xl-order-14{order:14}.ant-col-xl-13{display:block;box-sizing:border-box;width:54.16666667%}.ant-col-xl-push-13{left:54.16666667%}.ant-col-xl-pull-13{right:54.16666667%}.ant-col-xl-offset-13{margin-left:54.16666667%}.ant-col-xl-order-13{order:13}.ant-col-xl-12{display:block;box-sizing:border-box;width:50%}.ant-col-xl-push-12{left:50%}.ant-col-xl-pull-12{right:50%}.ant-col-xl-offset-12{margin-left:50%}.ant-col-xl-order-12{order:12}.ant-col-xl-11{display:block;box-sizing:border-box;width:45.83333333%}.ant-col-xl-push-11{left:45.83333333%}.ant-col-xl-pull-11{right:45.83333333%}.ant-col-xl-offset-11{margin-left:45.83333333%}.ant-col-xl-order-11{order:11}.ant-col-xl-10{display:block;box-sizing:border-box;width:41.66666667%}.ant-col-xl-push-10{left:41.66666667%}.ant-col-xl-pull-10{right:41.66666667%}.ant-col-xl-offset-10{margin-left:41.66666667%}.ant-col-xl-order-10{order:10}.ant-col-xl-9{display:block;box-sizing:border-box;width:37.5%}.ant-col-xl-push-9{left:37.5%}.ant-col-xl-pull-9{right:37.5%}.ant-col-xl-offset-9{margin-left:37.5%}.ant-col-xl-order-9{order:9}.ant-col-xl-8{display:block;box-sizing:border-box;width:33.33333333%}.ant-col-xl-push-8{left:33.33333333%}.ant-col-xl-pull-8{right:33.33333333%}.ant-col-xl-offset-8{margin-left:33.33333333%}.ant-col-xl-order-8{order:8}.ant-col-xl-7{display:block;box-sizing:border-box;width:29.16666667%}.ant-col-xl-push-7{left:29.16666667%}.ant-col-xl-pull-7{right:29.16666667%}.ant-col-xl-offset-7{margin-left:29.16666667%}.ant-col-xl-order-7{order:7}.ant-col-xl-6{display:block;box-sizing:border-box;width:25%}.ant-col-xl-push-6{left:25%}.ant-col-xl-pull-6{right:25%}.ant-col-xl-offset-6{margin-left:25%}.ant-col-xl-order-6{order:6}.ant-col-xl-5{display:block;box-sizing:border-box;width:20.83333333%}.ant-col-xl-push-5{left:20.83333333%}.ant-col-xl-pull-5{right:20.83333333%}.ant-col-xl-offset-5{margin-left:20.83333333%}.ant-col-xl-order-5{order:5}.ant-col-xl-4{display:block;box-sizing:border-box;width:16.66666667%}.ant-col-xl-push-4{left:16.66666667%}.ant-col-xl-pull-4{right:16.66666667%}.ant-col-xl-offset-4{margin-left:16.66666667%}.ant-col-xl-order-4{order:4}.ant-col-xl-3{display:block;box-sizing:border-box;width:12.5%}.ant-col-xl-push-3{left:12.5%}.ant-col-xl-pull-3{right:12.5%}.ant-col-xl-offset-3{margin-left:12.5%}.ant-col-xl-order-3{order:3}.ant-col-xl-2{display:block;box-sizing:border-box;width:8.33333333%}.ant-col-xl-push-2{left:8.33333333%}.ant-col-xl-pull-2{right:8.33333333%}.ant-col-xl-offset-2{margin-left:8.33333333%}.ant-col-xl-order-2{order:2}.ant-col-xl-1{display:block;box-sizing:border-box;width:4.16666667%}.ant-col-xl-push-1{left:4.16666667%}.ant-col-xl-pull-1{right:4.16666667%}.ant-col-xl-offset-1{margin-left:4.16666667%}.ant-col-xl-order-1{order:1}.ant-col-xl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xl-push-0{left:auto}.ant-col-xl-pull-0{right:auto}.ant-col-xl-offset-0{margin-left:0}.ant-col-xl-order-0{order:0}}@media (min-width:1600px){.ant-col-xxl-1,.ant-col-xxl-2,.ant-col-xxl-3,.ant-col-xxl-4,.ant-col-xxl-5,.ant-col-xxl-6,.ant-col-xxl-7,.ant-col-xxl-8,.ant-col-xxl-9,.ant-col-xxl-10,.ant-col-xxl-11,.ant-col-xxl-12,.ant-col-xxl-13,.ant-col-xxl-14,.ant-col-xxl-15,.ant-col-xxl-16,.ant-col-xxl-17,.ant-col-xxl-18,.ant-col-xxl-19,.ant-col-xxl-20,.ant-col-xxl-21,.ant-col-xxl-22,.ant-col-xxl-23,.ant-col-xxl-24{flex:0 0 auto;float:left}.ant-col-xxl-24{display:block;box-sizing:border-box;width:100%}.ant-col-xxl-push-24{left:100%}.ant-col-xxl-pull-24{right:100%}.ant-col-xxl-offset-24{margin-left:100%}.ant-col-xxl-order-24{order:24}.ant-col-xxl-23{display:block;box-sizing:border-box;width:95.83333333%}.ant-col-xxl-push-23{left:95.83333333%}.ant-col-xxl-pull-23{right:95.83333333%}.ant-col-xxl-offset-23{margin-left:95.83333333%}.ant-col-xxl-order-23{order:23}.ant-col-xxl-22{display:block;box-sizing:border-box;width:91.66666667%}.ant-col-xxl-push-22{left:91.66666667%}.ant-col-xxl-pull-22{right:91.66666667%}.ant-col-xxl-offset-22{margin-left:91.66666667%}.ant-col-xxl-order-22{order:22}.ant-col-xxl-21{display:block;box-sizing:border-box;width:87.5%}.ant-col-xxl-push-21{left:87.5%}.ant-col-xxl-pull-21{right:87.5%}.ant-col-xxl-offset-21{margin-left:87.5%}.ant-col-xxl-order-21{order:21}.ant-col-xxl-20{display:block;box-sizing:border-box;width:83.33333333%}.ant-col-xxl-push-20{left:83.33333333%}.ant-col-xxl-pull-20{right:83.33333333%}.ant-col-xxl-offset-20{margin-left:83.33333333%}.ant-col-xxl-order-20{order:20}.ant-col-xxl-19{display:block;box-sizing:border-box;width:79.16666667%}.ant-col-xxl-push-19{left:79.16666667%}.ant-col-xxl-pull-19{right:79.16666667%}.ant-col-xxl-offset-19{margin-left:79.16666667%}.ant-col-xxl-order-19{order:19}.ant-col-xxl-18{display:block;box-sizing:border-box;width:75%}.ant-col-xxl-push-18{left:75%}.ant-col-xxl-pull-18{right:75%}.ant-col-xxl-offset-18{margin-left:75%}.ant-col-xxl-order-18{order:18}.ant-col-xxl-17{display:block;box-sizing:border-box;width:70.83333333%}.ant-col-xxl-push-17{left:70.83333333%}.ant-col-xxl-pull-17{right:70.83333333%}.ant-col-xxl-offset-17{margin-left:70.83333333%}.ant-col-xxl-order-17{order:17}.ant-col-xxl-16{display:block;box-sizing:border-box;width:66.66666667%}.ant-col-xxl-push-16{left:66.66666667%}.ant-col-xxl-pull-16{right:66.66666667%}.ant-col-xxl-offset-16{margin-left:66.66666667%}.ant-col-xxl-order-16{order:16}.ant-col-xxl-15{display:block;box-sizing:border-box;width:62.5%}.ant-col-xxl-push-15{left:62.5%}.ant-col-xxl-pull-15{right:62.5%}.ant-col-xxl-offset-15{margin-left:62.5%}.ant-col-xxl-order-15{order:15}.ant-col-xxl-14{display:block;box-sizing:border-box;width:58.33333333%}.ant-col-xxl-push-14{left:58.33333333%}.ant-col-xxl-pull-14{right:58.33333333%}.ant-col-xxl-offset-14{margin-left:58.33333333%}.ant-col-xxl-order-14{order:14}.ant-col-xxl-13{display:block;box-sizing:border-box;width:54.16666667%}.ant-col-xxl-push-13{left:54.16666667%}.ant-col-xxl-pull-13{right:54.16666667%}.ant-col-xxl-offset-13{margin-left:54.16666667%}.ant-col-xxl-order-13{order:13}.ant-col-xxl-12{display:block;box-sizing:border-box;width:50%}.ant-col-xxl-push-12{left:50%}.ant-col-xxl-pull-12{right:50%}.ant-col-xxl-offset-12{margin-left:50%}.ant-col-xxl-order-12{order:12}.ant-col-xxl-11{display:block;box-sizing:border-box;width:45.83333333%}.ant-col-xxl-push-11{left:45.83333333%}.ant-col-xxl-pull-11{right:45.83333333%}.ant-col-xxl-offset-11{margin-left:45.83333333%}.ant-col-xxl-order-11{order:11}.ant-col-xxl-10{display:block;box-sizing:border-box;width:41.66666667%}.ant-col-xxl-push-10{left:41.66666667%}.ant-col-xxl-pull-10{right:41.66666667%}.ant-col-xxl-offset-10{margin-left:41.66666667%}.ant-col-xxl-order-10{order:10}.ant-col-xxl-9{display:block;box-sizing:border-box;width:37.5%}.ant-col-xxl-push-9{left:37.5%}.ant-col-xxl-pull-9{right:37.5%}.ant-col-xxl-offset-9{margin-left:37.5%}.ant-col-xxl-order-9{order:9}.ant-col-xxl-8{display:block;box-sizing:border-box;width:33.33333333%}.ant-col-xxl-push-8{left:33.33333333%}.ant-col-xxl-pull-8{right:33.33333333%}.ant-col-xxl-offset-8{margin-left:33.33333333%}.ant-col-xxl-order-8{order:8}.ant-col-xxl-7{display:block;box-sizing:border-box;width:29.16666667%}.ant-col-xxl-push-7{left:29.16666667%}.ant-col-xxl-pull-7{right:29.16666667%}.ant-col-xxl-offset-7{margin-left:29.16666667%}.ant-col-xxl-order-7{order:7}.ant-col-xxl-6{display:block;box-sizing:border-box;width:25%}.ant-col-xxl-push-6{left:25%}.ant-col-xxl-pull-6{right:25%}.ant-col-xxl-offset-6{margin-left:25%}.ant-col-xxl-order-6{order:6}.ant-col-xxl-5{display:block;box-sizing:border-box;width:20.83333333%}.ant-col-xxl-push-5{left:20.83333333%}.ant-col-xxl-pull-5{right:20.83333333%}.ant-col-xxl-offset-5{margin-left:20.83333333%}.ant-col-xxl-order-5{order:5}.ant-col-xxl-4{display:block;box-sizing:border-box;width:16.66666667%}.ant-col-xxl-push-4{left:16.66666667%}.ant-col-xxl-pull-4{right:16.66666667%}.ant-col-xxl-offset-4{margin-left:16.66666667%}.ant-col-xxl-order-4{order:4}.ant-col-xxl-3{display:block;box-sizing:border-box;width:12.5%}.ant-col-xxl-push-3{left:12.5%}.ant-col-xxl-pull-3{right:12.5%}.ant-col-xxl-offset-3{margin-left:12.5%}.ant-col-xxl-order-3{order:3}.ant-col-xxl-2{display:block;box-sizing:border-box;width:8.33333333%}.ant-col-xxl-push-2{left:8.33333333%}.ant-col-xxl-pull-2{right:8.33333333%}.ant-col-xxl-offset-2{margin-left:8.33333333%}.ant-col-xxl-order-2{order:2}.ant-col-xxl-1{display:block;box-sizing:border-box;width:4.16666667%}.ant-col-xxl-push-1{left:4.16666667%}.ant-col-xxl-pull-1{right:4.16666667%}.ant-col-xxl-offset-1{margin-left:4.16666667%}.ant-col-xxl-order-1{order:1}.ant-col-xxl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xxl-push-0{left:auto}.ant-col-xxl-pull-0{right:auto}.ant-col-xxl-offset-0{margin-left:0}.ant-col-xxl-order-0{order:0}}.ant-carousel{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum"}.ant-carousel .slick-slider{position:relative;display:block;box-sizing:border-box;-webkit-touch-callout:none;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.ant-carousel .slick-list{position:relative;display:block;margin:0;padding:0;overflow:hidden}.ant-carousel .slick-list:focus{outline:none}.ant-carousel .slick-list.dragging{cursor:pointer}.ant-carousel .slick-list .slick-slide{pointer-events:none}.ant-carousel .slick-list .slick-slide.slick-active{pointer-events:auto}.ant-carousel .slick-slider .slick-list,.ant-carousel .slick-slider .slick-track{-webkit-transform:translateZ(0);transform:translateZ(0)}.ant-carousel .slick-track{position:relative;top:0;left:0;display:block}.ant-carousel .slick-track:after,.ant-carousel .slick-track:before{display:table;content:""}.ant-carousel .slick-track:after{clear:both}.slick-loading .ant-carousel .slick-track{visibility:hidden}.ant-carousel .slick-slide{display:none;float:left;height:100%;min-height:1px}[dir=rtl] .ant-carousel .slick-slide{float:right}.ant-carousel .slick-slide img{display:block}.ant-carousel .slick-slide.slick-loading img{display:none}.ant-carousel .slick-slide.dragging img{pointer-events:none}.ant-carousel .slick-initialized .slick-slide{display:block}.ant-carousel .slick-loading .slick-slide{visibility:hidden}.ant-carousel .slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.ant-carousel .slick-arrow.slick-hidden{display:none}.ant-carousel .slick-next,.ant-carousel .slick-prev{position:absolute;top:50%;display:block;width:20px;height:20px;margin-top:-10px;padding:0;font-size:0;line-height:0;border:0;cursor:pointer}.ant-carousel .slick-next,.ant-carousel .slick-next:focus,.ant-carousel .slick-next:hover,.ant-carousel .slick-prev,.ant-carousel .slick-prev:focus,.ant-carousel .slick-prev:hover{color:transparent;background:transparent;outline:none}.ant-carousel .slick-next:focus:before,.ant-carousel .slick-next:hover:before,.ant-carousel .slick-prev:focus:before,.ant-carousel .slick-prev:hover:before{opacity:1}.ant-carousel .slick-next.slick-disabled:before,.ant-carousel .slick-prev.slick-disabled:before{opacity:.25}.ant-carousel .slick-prev{left:-25px}.ant-carousel .slick-prev:before{content:"\2190"}.ant-carousel .slick-next{right:-25px}.ant-carousel .slick-next:before{content:"\2192"}.ant-carousel .slick-dots{position:absolute;display:block;width:100%;height:3px;margin:0;padding:0;text-align:center;list-style:none}.ant-carousel .slick-dots-bottom{bottom:12px}.ant-carousel .slick-dots-top{top:12px}.ant-carousel .slick-dots li{position:relative;display:inline-block;margin:0 2px;padding:0;text-align:center;vertical-align:top}.ant-carousel .slick-dots li button{display:block;width:16px;height:3px;padding:0;color:transparent;font-size:0;background:#fff;border:0;border-radius:1px;outline:none;cursor:pointer;opacity:.3;-webkit-transition:all .5s;transition:all .5s}.ant-carousel .slick-dots li button:focus,.ant-carousel .slick-dots li button:hover{opacity:.75}.ant-carousel .slick-dots li.slick-active button{width:24px;background:#fff;opacity:1}.ant-carousel .slick-dots li.slick-active button:focus,.ant-carousel .slick-dots li.slick-active button:hover{opacity:1}.ant-carousel-vertical .slick-dots{top:50%;bottom:auto;width:3px;height:auto;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ant-carousel-vertical .slick-dots-left{left:12px}.ant-carousel-vertical .slick-dots-right{right:12px}.ant-carousel-vertical .slick-dots li{margin:0 2px;vertical-align:initial}.ant-carousel-vertical .slick-dots li button{width:3px;height:16px}.ant-carousel-vertical .slick-dots li.slick-active button{width:3px;height:24px}.ant-cascader{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum"}.ant-cascader-input.ant-input{position:relative;width:100%;background-color:initial!important;cursor:pointer}.ant-cascader-picker-show-search .ant-cascader-input.ant-input{position:relative}.ant-cascader-picker{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;display:inline-block;background-color:#fff;border-radius:4px;outline:0;cursor:pointer;-webkit-transition:color .3s;transition:color .3s}.ant-cascader-picker-with-value .ant-cascader-picker-label{color:transparent}.ant-cascader-picker-disabled{color:rgba(0,0,0,.25);background:#f5f5f5;cursor:not-allowed}.ant-cascader-picker-disabled .ant-cascader-input{cursor:not-allowed}.ant-cascader-picker:focus .ant-cascader-input{border-color:#40a9ff;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-cascader-picker-show-search.ant-cascader-picker-focused{color:rgba(0,0,0,.25)}.ant-cascader-picker-label{position:absolute;top:50%;left:0;width:100%;height:20px;margin-top:-10px;padding:0 12px;overflow:hidden;line-height:20px;white-space:nowrap;text-overflow:ellipsis}.ant-cascader-picker-clear{position:absolute;top:50%;right:12px;z-index:2;width:12px;height:12px;margin-top:-6px;color:rgba(0,0,0,.25);font-size:12px;line-height:12px;background:#fff;cursor:pointer;opacity:0;-webkit-transition:color .3s ease,opacity .15s ease;transition:color .3s ease,opacity .15s ease}.ant-cascader-picker-clear:hover{color:rgba(0,0,0,.45)}.ant-cascader-picker:hover .ant-cascader-picker-clear{opacity:1}.ant-cascader-picker-arrow{position:absolute;top:50%;right:12px;z-index:1;width:12px;height:12px;margin-top:-6px;color:rgba(0,0,0,.25);font-size:12px;line-height:12px;-webkit-transition:-webkit-transform .2s;transition:-webkit-transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s}.ant-cascader-picker-arrow.ant-cascader-picker-arrow-expand{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.ant-cascader-picker-small .ant-cascader-picker-arrow,.ant-cascader-picker-small .ant-cascader-picker-clear{right:8px}.ant-cascader-menus{position:absolute;z-index:1050;font-size:14px;white-space:nowrap;background:#fff;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-cascader-menus ol,.ant-cascader-menus ul{margin:0;padding:0;list-style:none}.ant-cascader-menus-empty,.ant-cascader-menus-hidden{display:none}.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-bottomLeft,.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-bottomLeft{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-topLeft,.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-topLeft{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-bottomLeft{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-topLeft{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-cascader-menu{display:inline-block;min-width:111px;height:180px;margin:0;padding:0;overflow:auto;vertical-align:top;list-style:none;border-right:1px solid #e8e8e8;-ms-overflow-style:-ms-autohiding-scrollbar}.ant-cascader-menu:first-child{border-radius:4px 0 0 4px}.ant-cascader-menu:last-child{margin-right:-1px;border-right-color:transparent;border-radius:0 4px 4px 0}.ant-cascader-menu:only-child{border-radius:4px}.ant-cascader-menu-item{padding:5px 12px;line-height:22px;white-space:nowrap;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-cascader-menu-item:hover{background:#e6f7ff}.ant-cascader-menu-item-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-cascader-menu-item-disabled:hover{background:transparent}.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover{font-weight:600;background:#f5f5f5}.ant-cascader-menu-item-expand{position:relative;padding-right:24px}.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,.ant-cascader-menu-item-expand .ant-cascader-menu-item-loading-icon{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);position:absolute;right:12px;color:rgba(0,0,0,.45)}:root .ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,:root .ant-cascader-menu-item-expand .ant-cascader-menu-item-loading-icon{font-size:12px}.ant-cascader-menu-item .ant-cascader-menu-item-keyword{color:#f5222d}.ant-checkbox{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;top:-.09em;display:inline-block;line-height:1;white-space:nowrap;vertical-align:middle;outline:none;cursor:pointer}.ant-checkbox-input:focus+.ant-checkbox-inner,.ant-checkbox-wrapper:hover .ant-checkbox-inner,.ant-checkbox:hover .ant-checkbox-inner{border-color:#1890ff}.ant-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;-webkit-animation:antCheckboxEffect .36s ease-in-out;animation:antCheckboxEffect .36s ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both;content:""}.ant-checkbox-wrapper:hover .ant-checkbox:after,.ant-checkbox:hover:after{visibility:visible}.ant-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:initial;-webkit-transition:all .3s;transition:all .3s}.ant-checkbox-inner:after{position:absolute;top:50%;left:21%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(0) translate(-50%,-50%);transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;-webkit-transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-checkbox-input{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-checkbox-checked .ant-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(1) translate(-50%,-50%);transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-checkbox-checked .ant-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-checkbox-disabled{cursor:not-allowed}.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after{border-color:rgba(0,0,0,.25);-webkit-animation-name:none;animation-name:none}.ant-checkbox-disabled .ant-checkbox-input{cursor:not-allowed}.ant-checkbox-disabled .ant-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-checkbox-disabled .ant-checkbox-inner:after{border-color:#f5f5f5;border-collapse:initial;-webkit-animation-name:none;animation-name:none}.ant-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block;line-height:unset;cursor:pointer}.ant-checkbox-wrapper+.ant-checkbox-wrapper{margin-left:8px}.ant-checkbox+span,.ant-checkbox-wrapper+span{padding-right:8px;padding-left:8px}.ant-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block}.ant-checkbox-group-item{display:inline-block;margin-right:8px}.ant-checkbox-group-item:last-child{margin-right:0}.ant-checkbox-group-item+.ant-checkbox-group-item{margin-left:0}.ant-checkbox-indeterminate .ant-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-checkbox-indeterminate .ant-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after{background-color:rgba(0,0,0,.25);border-color:rgba(0,0,0,.25)}.ant-collapse{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";background-color:#fafafa;border:1px solid #d9d9d9;border-bottom:0;border-radius:4px}.ant-collapse>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse>.ant-collapse-item:last-child,.ant-collapse>.ant-collapse-item:last-child>.ant-collapse-header{border-radius:0 0 4px 4px}.ant-collapse>.ant-collapse-item>.ant-collapse-header{position:relative;padding:12px 16px 12px 40px;color:rgba(0,0,0,.85);line-height:22px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;top:50%;left:16px;display:inline-block;margin-top:2px;font-size:12px;line-height:46px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow>*{line-height:1}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow svg{display:inline-block}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow:before{display:none}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow .ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow-icon{display:block}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow svg{-webkit-transition:-webkit-transform .24s;transition:-webkit-transform .24s;transition:transform .24s;transition:transform .24s,-webkit-transform .24s}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-extra{float:right}.ant-collapse>.ant-collapse-item>.ant-collapse-header:focus{outline:none}.ant-collapse>.ant-collapse-item.ant-collapse-no-arrow>.ant-collapse-header{padding-left:12px}.ant-collapse-icon-position-right>.ant-collapse-item>.ant-collapse-header{padding:12px 40px 12px 16px}.ant-collapse-icon-position-right>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{right:16px;left:auto}.ant-collapse-anim-active{-webkit-transition:height .2s cubic-bezier(.215,.61,.355,1);transition:height .2s cubic-bezier(.215,.61,.355,1)}.ant-collapse-content{overflow:hidden;color:rgba(0,0,0,.65);background-color:#fff;border-top:1px solid #d9d9d9}.ant-collapse-content>.ant-collapse-content-box{padding:16px}.ant-collapse-content-inactive{display:none}.ant-collapse-item:last-child>.ant-collapse-content{border-radius:0 0 4px 4px}.ant-collapse-borderless{background-color:#fff;border:0}.ant-collapse-borderless>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse-borderless>.ant-collapse-item:last-child,.ant-collapse-borderless>.ant-collapse-item:last-child .ant-collapse-header{border-radius:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content{background-color:initial;border-top:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content>.ant-collapse-content-box{padding-top:4px}.ant-collapse .ant-collapse-item-disabled>.ant-collapse-header,.ant-collapse .ant-collapse-item-disabled>.ant-collapse-header>.arrow{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-comment{position:relative}.ant-comment-inner{display:flex;padding:16px 0}.ant-comment-avatar{position:relative;flex-shrink:0;margin-right:12px;cursor:pointer}.ant-comment-avatar img{width:32px;height:32px;border-radius:50%}.ant-comment-content{position:relative;flex:1 1 auto;min-width:1px;font-size:14px;word-wrap:break-word}.ant-comment-content-author{display:flex;justify-content:flex-start;margin-bottom:4px;font-size:14px}.ant-comment-content-author>a,.ant-comment-content-author>span{height:18px;padding-right:8px;font-size:12px;line-height:18px}.ant-comment-content-author-name{color:rgba(0,0,0,.45);font-size:14px;-webkit-transition:color .3s;transition:color .3s}.ant-comment-content-author-name>*,.ant-comment-content-author-name>:hover{color:rgba(0,0,0,.45)}.ant-comment-content-author-time{color:#ccc;white-space:nowrap;cursor:auto}.ant-comment-content-detail p{white-space:pre-wrap}.ant-comment-actions{margin-top:12px;padding-left:0}.ant-comment-actions>li{display:inline-block;color:rgba(0,0,0,.45)}.ant-comment-actions>li>span{padding-right:10px;color:rgba(0,0,0,.45);font-size:12px;cursor:pointer;-webkit-transition:color .3s;transition:color .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-comment-actions>li>span:hover{color:#595959}.ant-comment-nested{margin-left:44px}.ant-calendar-picker-container{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:absolute;z-index:1050;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-topLeft,.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-topRight,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-topLeft,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-topRight{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-bottomLeft,.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-bottomRight,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-bottomLeft,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-bottomRight{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-topLeft,.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-topRight{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-bottomLeft,.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-bottomRight{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-calendar-picker{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;display:inline-block;outline:none;cursor:text;-webkit-transition:opacity .3s;transition:opacity .3s}.ant-calendar-picker-input{outline:none}.ant-calendar-picker-input.ant-input-sm{padding-top:0;padding-bottom:0}.ant-calendar-picker:hover .ant-calendar-picker-input:not(.ant-input-disabled){border-color:#1890ff}.ant-calendar-picker:focus .ant-calendar-picker-input:not(.ant-input-disabled){border-color:#40a9ff;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-calendar-picker-clear,.ant-calendar-picker-icon{position:absolute;top:50%;right:12px;z-index:1;width:14px;height:14px;margin-top:-7px;font-size:12px;line-height:14px;-webkit-transition:all .3s;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-calendar-picker-clear{z-index:2;color:rgba(0,0,0,.25);font-size:14px;background:#fff;cursor:pointer;opacity:0;pointer-events:none}.ant-calendar-picker-clear:hover{color:rgba(0,0,0,.45)}.ant-calendar-picker:hover .ant-calendar-picker-clear{opacity:1;pointer-events:auto}.ant-calendar-picker-icon{display:inline-block;color:rgba(0,0,0,.25);font-size:14px;line-height:1}.ant-calendar-picker-small .ant-calendar-picker-clear,.ant-calendar-picker-small .ant-calendar-picker-icon{right:8px}.ant-calendar{position:relative;width:280px;font-size:14px;line-height:1.5;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #fff;border-radius:4px;outline:none;box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-calendar-input-wrap{height:34px;padding:6px 10px;border-bottom:1px solid #e8e8e8}.ant-calendar-input{width:100%;height:22px;color:rgba(0,0,0,.65);background:#fff;border:0;outline:0;cursor:auto}.ant-calendar-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-calendar-input:-ms-input-placeholder{color:#bfbfbf}.ant-calendar-input::-webkit-input-placeholder{color:#bfbfbf}.ant-calendar-week-number{width:286px}.ant-calendar-week-number-cell{text-align:center}.ant-calendar-header{height:40px;line-height:40px;text-align:center;border-bottom:1px solid #e8e8e8;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-calendar-header a:hover{color:#40a9ff}.ant-calendar-header .ant-calendar-century-select,.ant-calendar-header .ant-calendar-decade-select,.ant-calendar-header .ant-calendar-month-select,.ant-calendar-header .ant-calendar-year-select{display:inline-block;padding:0 2px;color:rgba(0,0,0,.85);font-weight:500;line-height:40px}.ant-calendar-header .ant-calendar-century-select-arrow,.ant-calendar-header .ant-calendar-decade-select-arrow,.ant-calendar-header .ant-calendar-month-select-arrow,.ant-calendar-header .ant-calendar-year-select-arrow{display:none}.ant-calendar-header .ant-calendar-next-century-btn,.ant-calendar-header .ant-calendar-next-decade-btn,.ant-calendar-header .ant-calendar-next-month-btn,.ant-calendar-header .ant-calendar-next-year-btn,.ant-calendar-header .ant-calendar-prev-century-btn,.ant-calendar-header .ant-calendar-prev-decade-btn,.ant-calendar-header .ant-calendar-prev-month-btn,.ant-calendar-header .ant-calendar-prev-year-btn{position:absolute;top:0;display:inline-block;padding:0 5px;color:rgba(0,0,0,.45);font-size:16px;font-family:Arial,Hiragino Sans GB,Microsoft Yahei,"Microsoft Sans Serif",sans-serif;line-height:40px}.ant-calendar-header .ant-calendar-prev-century-btn,.ant-calendar-header .ant-calendar-prev-decade-btn,.ant-calendar-header .ant-calendar-prev-year-btn{left:7px}.ant-calendar-header .ant-calendar-prev-century-btn:after,.ant-calendar-header .ant-calendar-prev-decade-btn:after,.ant-calendar-header .ant-calendar-prev-year-btn:after{content:"\AB"}.ant-calendar-header .ant-calendar-next-century-btn,.ant-calendar-header .ant-calendar-next-decade-btn,.ant-calendar-header .ant-calendar-next-year-btn{right:7px}.ant-calendar-header .ant-calendar-next-century-btn:after,.ant-calendar-header .ant-calendar-next-decade-btn:after,.ant-calendar-header .ant-calendar-next-year-btn:after{content:"\BB"}.ant-calendar-header .ant-calendar-prev-month-btn{left:29px}.ant-calendar-header .ant-calendar-prev-month-btn:after{content:"\2039"}.ant-calendar-header .ant-calendar-next-month-btn{right:29px}.ant-calendar-header .ant-calendar-next-month-btn:after{content:"\203A"}.ant-calendar-body{padding:8px 12px}.ant-calendar table{width:100%;max-width:100%;background-color:initial;border-collapse:collapse}.ant-calendar table,.ant-calendar td,.ant-calendar th{text-align:center;border:0}.ant-calendar-calendar-table{margin-bottom:0;border-spacing:0}.ant-calendar-column-header{width:33px;padding:6px 0;line-height:18px;text-align:center}.ant-calendar-column-header .ant-calendar-column-header-inner{display:block;font-weight:400}.ant-calendar-week-number-header .ant-calendar-column-header-inner{display:none}.ant-calendar-cell{height:30px;padding:3px 0}.ant-calendar-date{display:block;width:24px;height:24px;margin:0 auto;padding:0;color:rgba(0,0,0,.65);line-height:22px;text-align:center;background:transparent;border:1px solid transparent;border-radius:2px;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-date-panel{position:relative;outline:none}.ant-calendar-date:hover{background:#e6f7ff;cursor:pointer}.ant-calendar-date:active{color:#fff;background:#40a9ff}.ant-calendar-today .ant-calendar-date{color:#1890ff;font-weight:700;border-color:#1890ff}.ant-calendar-last-month-cell .ant-calendar-date,.ant-calendar-next-month-btn-day .ant-calendar-date{color:rgba(0,0,0,.25)}.ant-calendar-selected-day .ant-calendar-date{background:#d1e9ff}.ant-calendar-selected-date .ant-calendar-date,.ant-calendar-selected-end-date .ant-calendar-date,.ant-calendar-selected-start-date .ant-calendar-date{color:#fff;background:#1890ff;border:1px solid transparent}.ant-calendar-selected-date .ant-calendar-date:hover,.ant-calendar-selected-end-date .ant-calendar-date:hover,.ant-calendar-selected-start-date .ant-calendar-date:hover{background:#1890ff}.ant-calendar-disabled-cell .ant-calendar-date{position:relative;width:auto;color:rgba(0,0,0,.25);background:#f5f5f5;border:1px solid transparent;border-radius:0;cursor:not-allowed}.ant-calendar-disabled-cell .ant-calendar-date:hover{background:#f5f5f5}.ant-calendar-disabled-cell.ant-calendar-selected-day .ant-calendar-date:before{position:absolute;top:-1px;left:5px;width:24px;height:24px;background:rgba(0,0,0,.1);border-radius:2px;content:""}.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date{position:relative;padding-right:5px;padding-left:5px}.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date:before{position:absolute;top:-1px;left:5px;width:24px;height:24px;border:1px solid rgba(0,0,0,.25);border-radius:2px;content:" "}.ant-calendar-disabled-cell-first-of-row .ant-calendar-date{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-calendar-disabled-cell-last-of-row .ant-calendar-date{border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-calendar-footer{padding:0 12px;line-height:38px;border-top:1px solid #e8e8e8}.ant-calendar-footer:empty{border-top:0}.ant-calendar-footer-btn{display:block;text-align:center}.ant-calendar-footer-extra{text-align:left}.ant-calendar .ant-calendar-clear-btn,.ant-calendar .ant-calendar-today-btn{display:inline-block;margin:0 0 0 8px;text-align:center}.ant-calendar .ant-calendar-clear-btn-disabled,.ant-calendar .ant-calendar-today-btn-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-calendar .ant-calendar-clear-btn:only-child,.ant-calendar .ant-calendar-today-btn:only-child{margin:0}.ant-calendar .ant-calendar-clear-btn{position:absolute;top:7px;right:5px;display:none;width:20px;height:20px;margin:0;overflow:hidden;line-height:20px;text-align:center;text-indent:-76px}.ant-calendar .ant-calendar-clear-btn:after{display:inline-block;width:20px;color:rgba(0,0,0,.25);font-size:14px;line-height:1;text-indent:43px;-webkit-transition:color .3s ease;transition:color .3s ease}.ant-calendar .ant-calendar-clear-btn:hover:after{color:rgba(0,0,0,.45)}.ant-calendar .ant-calendar-ok-btn{position:relative;display:inline-block;font-weight:400;white-space:nowrap;text-align:center;background-image:none;box-shadow:0 2px 0 rgba(0,0,0,.015);cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:manipulation;height:32px;color:#fff;background-color:#1890ff;border:1px solid #1890ff;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px 0 rgba(0,0,0,.045);height:24px;padding:0 7px;font-size:14px;border-radius:4px;line-height:22px}.ant-calendar .ant-calendar-ok-btn>.anticon{line-height:1}.ant-calendar .ant-calendar-ok-btn,.ant-calendar .ant-calendar-ok-btn:active,.ant-calendar .ant-calendar-ok-btn:focus{outline:0}.ant-calendar .ant-calendar-ok-btn:not([disabled]):hover{text-decoration:none}.ant-calendar .ant-calendar-ok-btn:not([disabled]):active{outline:0;box-shadow:none}.ant-calendar .ant-calendar-ok-btn.disabled,.ant-calendar .ant-calendar-ok-btn[disabled]{cursor:not-allowed}.ant-calendar .ant-calendar-ok-btn.disabled>*,.ant-calendar .ant-calendar-ok-btn[disabled]>*{pointer-events:none}.ant-calendar .ant-calendar-ok-btn-lg{height:40px;padding:0 15px;font-size:16px;border-radius:4px}.ant-calendar .ant-calendar-ok-btn-sm{height:24px;padding:0 7px;font-size:14px;border-radius:4px}.ant-calendar .ant-calendar-ok-btn>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-calendar .ant-calendar-ok-btn:focus,.ant-calendar .ant-calendar-ok-btn:hover{color:#fff;background-color:#40a9ff;border-color:#40a9ff}.ant-calendar .ant-calendar-ok-btn:focus>a:only-child,.ant-calendar .ant-calendar-ok-btn:hover>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn:focus>a:only-child:after,.ant-calendar .ant-calendar-ok-btn:hover>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-calendar .ant-calendar-ok-btn.active,.ant-calendar .ant-calendar-ok-btn:active{color:#fff;background-color:#096dd9;border-color:#096dd9}.ant-calendar .ant-calendar-ok-btn.active>a:only-child,.ant-calendar .ant-calendar-ok-btn:active>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn.active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn:active>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-calendar .ant-calendar-ok-btn-disabled,.ant-calendar .ant-calendar-ok-btn-disabled.active,.ant-calendar .ant-calendar-ok-btn-disabled:active,.ant-calendar .ant-calendar-ok-btn-disabled:focus,.ant-calendar .ant-calendar-ok-btn-disabled:hover,.ant-calendar .ant-calendar-ok-btn.disabled,.ant-calendar .ant-calendar-ok-btn.disabled.active,.ant-calendar .ant-calendar-ok-btn.disabled:active,.ant-calendar .ant-calendar-ok-btn.disabled:focus,.ant-calendar .ant-calendar-ok-btn.disabled:hover,.ant-calendar .ant-calendar-ok-btn[disabled],.ant-calendar .ant-calendar-ok-btn[disabled].active,.ant-calendar .ant-calendar-ok-btn[disabled]:active,.ant-calendar .ant-calendar-ok-btn[disabled]:focus,.ant-calendar .ant-calendar-ok-btn[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;box-shadow:none}.ant-calendar .ant-calendar-ok-btn-disabled.active>a:only-child,.ant-calendar .ant-calendar-ok-btn-disabled:active>a:only-child,.ant-calendar .ant-calendar-ok-btn-disabled:focus>a:only-child,.ant-calendar .ant-calendar-ok-btn-disabled:hover>a:only-child,.ant-calendar .ant-calendar-ok-btn-disabled>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled.active>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled:active>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled:focus>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled:hover>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled].active>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]:active>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]:focus>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]:hover>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn-disabled.active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn-disabled:active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn-disabled:focus>a:only-child:after,.ant-calendar .ant-calendar-ok-btn-disabled:hover>a:only-child:after,.ant-calendar .ant-calendar-ok-btn-disabled>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled.active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled:active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled:focus>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled:hover>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled].active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]:active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]:focus>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]:hover>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]>a:only-child:after{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;content:""}.ant-calendar-range-picker-input{width:44%;height:99%;text-align:center;background-color:initial;border:0;outline:0}.ant-calendar-range-picker-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-calendar-range-picker-input:-ms-input-placeholder{color:#bfbfbf}.ant-calendar-range-picker-input::-webkit-input-placeholder{color:#bfbfbf}.ant-calendar-range-picker-input[disabled]{cursor:not-allowed}.ant-calendar-range-picker-separator{display:inline-block;min-width:10px;height:100%;color:rgba(0,0,0,.45);white-space:nowrap;text-align:center;vertical-align:top;pointer-events:none}.ant-calendar-range{width:552px;overflow:hidden}.ant-calendar-range .ant-calendar-date-panel:after{display:block;clear:both;height:0;visibility:hidden;content:"."}.ant-calendar-range-part{position:relative;width:50%}.ant-calendar-range-left{float:left}.ant-calendar-range-left .ant-calendar-time-picker-inner{border-right:1px solid #e8e8e8}.ant-calendar-range-right{float:right}.ant-calendar-range-right .ant-calendar-time-picker-inner{border-left:1px solid #e8e8e8}.ant-calendar-range-middle{position:absolute;left:50%;z-index:1;height:34px;margin:1px 0 0;padding:0 200px 0 0;color:rgba(0,0,0,.45);line-height:34px;text-align:center;-webkit-transform:translateX(-50%);transform:translateX(-50%);pointer-events:none}.ant-calendar-range-right .ant-calendar-date-input-wrap{margin-left:-90px}.ant-calendar-range.ant-calendar-time .ant-calendar-range-middle{padding:0 10px 0 0;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.ant-calendar-range.ant-calendar-time .ant-calendar-range-right .ant-calendar-date-input-wrap{margin-left:0}.ant-calendar-range .ant-calendar-input-wrap{position:relative;height:34px}.ant-calendar-range .ant-calendar-input,.ant-calendar-range .ant-calendar-time-picker-input{position:relative;display:inline-block;width:100%;height:32px;color:rgba(0,0,0,.65);font-size:14px;line-height:1.5;background-color:#fff;background-image:none;border-radius:4px;-webkit-transition:all .3s;transition:all .3s;height:24px;padding:4px 0;border:0;box-shadow:none}.ant-calendar-range .ant-calendar-input::-moz-placeholder,.ant-calendar-range .ant-calendar-time-picker-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-calendar-range .ant-calendar-input:-ms-input-placeholder,.ant-calendar-range .ant-calendar-time-picker-input:-ms-input-placeholder{color:#bfbfbf}.ant-calendar-range .ant-calendar-input::-webkit-input-placeholder,.ant-calendar-range .ant-calendar-time-picker-input::-webkit-input-placeholder{color:#bfbfbf}.ant-calendar-range .ant-calendar-input:hover,.ant-calendar-range .ant-calendar-time-picker-input:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-calendar-range .ant-calendar-input:focus,.ant-calendar-range .ant-calendar-time-picker-input:focus{border-color:#40a9ff;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-calendar-range .ant-calendar-input-disabled,.ant-calendar-range .ant-calendar-time-picker-input-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-calendar-range .ant-calendar-input-disabled:hover,.ant-calendar-range .ant-calendar-time-picker-input-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-calendar-range .ant-calendar-input[disabled],.ant-calendar-range .ant-calendar-time-picker-input[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-calendar-range .ant-calendar-input[disabled]:hover,.ant-calendar-range .ant-calendar-time-picker-input[disabled]:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-calendar-range .ant-calendar-input,textarea.ant-calendar-range .ant-calendar-time-picker-input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s}.ant-calendar-range .ant-calendar-input-lg,.ant-calendar-range .ant-calendar-time-picker-input-lg{height:40px;padding:6px 11px;font-size:16px}.ant-calendar-range .ant-calendar-input-sm,.ant-calendar-range .ant-calendar-time-picker-input-sm{height:24px;padding:1px 7px}.ant-calendar-range .ant-calendar-input:focus,.ant-calendar-range .ant-calendar-time-picker-input:focus{box-shadow:none}.ant-calendar-range .ant-calendar-time-picker-icon{display:none}.ant-calendar-range.ant-calendar-week-number{width:574px}.ant-calendar-range.ant-calendar-week-number .ant-calendar-range-part{width:286px}.ant-calendar-range .ant-calendar-decade-panel,.ant-calendar-range .ant-calendar-month-panel,.ant-calendar-range .ant-calendar-year-panel{top:34px}.ant-calendar-range .ant-calendar-month-panel .ant-calendar-year-panel{top:0}.ant-calendar-range .ant-calendar-decade-panel-table,.ant-calendar-range .ant-calendar-month-panel-table,.ant-calendar-range .ant-calendar-year-panel-table{height:208px}.ant-calendar-range .ant-calendar-in-range-cell{position:relative;border-radius:0}.ant-calendar-range .ant-calendar-in-range-cell>div{position:relative;z-index:1}.ant-calendar-range .ant-calendar-in-range-cell:before{position:absolute;top:4px;right:0;bottom:4px;left:0;display:block;background:#e6f7ff;border:0;border-radius:0;content:""}.ant-calendar-range .ant-calendar-footer-extra{float:left}div.ant-calendar-range-quick-selector{text-align:left}div.ant-calendar-range-quick-selector>a{margin-right:8px}.ant-calendar-range .ant-calendar-header,.ant-calendar-range .ant-calendar-month-panel-header,.ant-calendar-range .ant-calendar-year-panel-header{border-bottom:0}.ant-calendar-range .ant-calendar-body,.ant-calendar-range .ant-calendar-month-panel-body,.ant-calendar-range .ant-calendar-year-panel-body{border-top:1px solid #e8e8e8}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker{top:68px;z-index:2;width:100%;height:207px}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-panel{height:267px;margin-top:-34px}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-inner{height:100%;padding-top:40px;background:none}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-combobox{display:inline-block;height:100%;background-color:#fff;border-top:1px solid #e8e8e8}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-select{height:100%}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-select ul{max-height:100%}.ant-calendar-range.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn{margin-right:8px}.ant-calendar-range.ant-calendar-time .ant-calendar-today-btn{height:22px;margin:8px 12px;line-height:22px}.ant-calendar-range-with-ranges.ant-calendar-time .ant-calendar-time-picker{height:233px}.ant-calendar-range.ant-calendar-show-time-picker .ant-calendar-body{border-top-color:transparent}.ant-calendar-time-picker{position:absolute;top:40px;width:100%;background-color:#fff}.ant-calendar-time-picker-panel{position:absolute;z-index:1050;width:100%}.ant-calendar-time-picker-inner{position:relative;display:inline-block;width:100%;overflow:hidden;font-size:14px;line-height:1.5;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;outline:none}.ant-calendar-time-picker-column-1,.ant-calendar-time-picker-column-1 .ant-calendar-time-picker-select,.ant-calendar-time-picker-combobox{width:100%}.ant-calendar-time-picker-column-2 .ant-calendar-time-picker-select{width:50%}.ant-calendar-time-picker-column-3 .ant-calendar-time-picker-select{width:33.33%}.ant-calendar-time-picker-column-4 .ant-calendar-time-picker-select{width:25%}.ant-calendar-time-picker-input-wrap{display:none}.ant-calendar-time-picker-select{position:relative;float:left;box-sizing:border-box;height:226px;overflow:hidden;font-size:14px;border-right:1px solid #e8e8e8}.ant-calendar-time-picker-select:hover{overflow-y:auto}.ant-calendar-time-picker-select:first-child{margin-left:0;border-left:0}.ant-calendar-time-picker-select:last-child{border-right:0}.ant-calendar-time-picker-select ul{box-sizing:border-box;width:100%;max-height:206px;margin:0;padding:0;list-style:none}.ant-calendar-time-picker-select li{box-sizing:initial;width:100%;height:24px;margin:0;padding-left:32px;line-height:24px;list-style:none;cursor:pointer;-webkit-transition:background .3s ease;transition:background .3s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-calendar-time-picker-select li:last-child:after{display:block;height:202px;content:""}.ant-calendar-time-picker-select li:hover{background:#e6f7ff}li.ant-calendar-time-picker-select-option-selected{font-weight:700;background:#f5f5f5}li.ant-calendar-time-picker-select-option-disabled{color:rgba(0,0,0,.25)}li.ant-calendar-time-picker-select-option-disabled:hover{background:transparent;cursor:not-allowed}.ant-calendar-time .ant-calendar-day-select{display:inline-block;padding:0 2px;color:rgba(0,0,0,.85);font-weight:500;line-height:34px}.ant-calendar-time .ant-calendar-footer{position:relative;height:auto}.ant-calendar-time .ant-calendar-footer-btn{text-align:right}.ant-calendar-time .ant-calendar-footer .ant-calendar-today-btn{float:left;margin:0}.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn{display:inline-block;margin-right:8px}.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn-disabled{color:rgba(0,0,0,.25)}.ant-calendar-month-panel{position:absolute;top:1px;right:0;bottom:0;left:0;z-index:10;background:#fff;border-radius:4px;outline:none}.ant-calendar-month-panel>div{display:flex;flex-direction:column;height:100%}.ant-calendar-month-panel-hidden{display:none}.ant-calendar-month-panel-header{height:40px;line-height:40px;text-align:center;border-bottom:1px solid #e8e8e8;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-calendar-month-panel-header a:hover{color:#40a9ff}.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select,.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select,.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select,.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select{display:inline-block;padding:0 2px;color:rgba(0,0,0,.85);font-weight:500;line-height:40px}.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select-arrow,.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select-arrow,.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select-arrow,.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select-arrow{display:none}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn{position:absolute;top:0;display:inline-block;padding:0 5px;color:rgba(0,0,0,.45);font-size:16px;font-family:Arial,Hiragino Sans GB,Microsoft Yahei,"Microsoft Sans Serif",sans-serif;line-height:40px}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn{left:7px}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn:after{content:"\AB"}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn{right:7px}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn:after{content:"\BB"}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn{left:29px}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn:after{content:"\2039"}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn{right:29px}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn:after{content:"\203A"}.ant-calendar-month-panel-body{flex:1 1}.ant-calendar-month-panel-footer{border-top:1px solid #e8e8e8}.ant-calendar-month-panel-footer .ant-calendar-footer-extra{padding:0 12px}.ant-calendar-month-panel-table{width:100%;height:100%;table-layout:fixed;border-collapse:initial}.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month,.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month:hover{color:#fff;background:#1890ff}.ant-calendar-month-panel-cell{text-align:center}.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month,.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month:hover{color:rgba(0,0,0,.25);background:#f5f5f5;cursor:not-allowed}.ant-calendar-month-panel-month{display:inline-block;height:24px;margin:0 auto;padding:0 8px;color:rgba(0,0,0,.65);line-height:24px;text-align:center;background:transparent;border-radius:2px;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-month-panel-month:hover{background:#e6f7ff;cursor:pointer}.ant-calendar-year-panel{position:absolute;top:1px;right:0;bottom:0;left:0;z-index:10;background:#fff;border-radius:4px;outline:none}.ant-calendar-year-panel>div{display:flex;flex-direction:column;height:100%}.ant-calendar-year-panel-hidden{display:none}.ant-calendar-year-panel-header{height:40px;line-height:40px;text-align:center;border-bottom:1px solid #e8e8e8;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-calendar-year-panel-header a:hover{color:#40a9ff}.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select,.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select,.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select,.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select{display:inline-block;padding:0 2px;color:rgba(0,0,0,.85);font-weight:500;line-height:40px}.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select-arrow,.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select-arrow,.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select-arrow,.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select-arrow{display:none}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn{position:absolute;top:0;display:inline-block;padding:0 5px;color:rgba(0,0,0,.45);font-size:16px;font-family:Arial,Hiragino Sans GB,Microsoft Yahei,"Microsoft Sans Serif",sans-serif;line-height:40px}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn{left:7px}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn:after{content:"\AB"}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn{right:7px}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn:after{content:"\BB"}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn{left:29px}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn:after{content:"\2039"}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn{right:29px}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn:after{content:"\203A"}.ant-calendar-year-panel-body{flex:1 1}.ant-calendar-year-panel-footer{border-top:1px solid #e8e8e8}.ant-calendar-year-panel-footer .ant-calendar-footer-extra{padding:0 12px}.ant-calendar-year-panel-table{width:100%;height:100%;table-layout:fixed;border-collapse:initial}.ant-calendar-year-panel-cell{text-align:center}.ant-calendar-year-panel-year{display:inline-block;height:24px;margin:0 auto;padding:0 8px;color:rgba(0,0,0,.65);line-height:24px;text-align:center;background:transparent;border-radius:2px;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-year-panel-year:hover{background:#e6f7ff;cursor:pointer}.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year,.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year:hover{color:#fff;background:#1890ff}.ant-calendar-year-panel-last-decade-cell .ant-calendar-year-panel-year,.ant-calendar-year-panel-next-decade-cell .ant-calendar-year-panel-year{color:rgba(0,0,0,.25);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-calendar-decade-panel{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;display:flex;flex-direction:column;background:#fff;border-radius:4px;outline:none}.ant-calendar-decade-panel-hidden{display:none}.ant-calendar-decade-panel-header{height:40px;line-height:40px;text-align:center;border-bottom:1px solid #e8e8e8;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-calendar-decade-panel-header a:hover{color:#40a9ff}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select{display:inline-block;padding:0 2px;color:rgba(0,0,0,.85);font-weight:500;line-height:40px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select-arrow,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select-arrow,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select-arrow,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select-arrow{display:none}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn{position:absolute;top:0;display:inline-block;padding:0 5px;color:rgba(0,0,0,.45);font-size:16px;font-family:Arial,Hiragino Sans GB,Microsoft Yahei,"Microsoft Sans Serif",sans-serif;line-height:40px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn{left:7px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn:after{content:"\AB"}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn{right:7px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn:after{content:"\BB"}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn{left:29px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn:after{content:"\2039"}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn{right:29px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn:after{content:"\203A"}.ant-calendar-decade-panel-body{flex:1 1}.ant-calendar-decade-panel-footer{border-top:1px solid #e8e8e8}.ant-calendar-decade-panel-footer .ant-calendar-footer-extra{padding:0 12px}.ant-calendar-decade-panel-table{width:100%;height:100%;table-layout:fixed;border-collapse:initial}.ant-calendar-decade-panel-cell{white-space:nowrap;text-align:center}.ant-calendar-decade-panel-decade{display:inline-block;height:24px;margin:0 auto;padding:0 6px;color:rgba(0,0,0,.65);line-height:24px;text-align:center;background:transparent;border-radius:2px;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-decade-panel-decade:hover{background:#e6f7ff;cursor:pointer}.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade,.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade:hover{color:#fff;background:#1890ff}.ant-calendar-decade-panel-last-century-cell .ant-calendar-decade-panel-decade,.ant-calendar-decade-panel-next-century-cell .ant-calendar-decade-panel-decade{color:rgba(0,0,0,.25);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-calendar-month .ant-calendar-month-header-wrap{position:relative;height:288px}.ant-calendar-month .ant-calendar-month-panel,.ant-calendar-month .ant-calendar-year-panel{top:0;height:100%}.ant-calendar-week-number-cell{opacity:.5}.ant-calendar-week-number .ant-calendar-body tr{cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-calendar-week-number .ant-calendar-body tr:hover{background:#e6f7ff}.ant-calendar-week-number .ant-calendar-body tr.ant-calendar-active-week{font-weight:700;background:#bae7ff}.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day .ant-calendar-date,.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day:hover .ant-calendar-date{color:rgba(0,0,0,.65);background:transparent}.ant-time-picker-panel{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:absolute;z-index:1050;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.ant-time-picker-panel-inner{position:relative;left:-2px;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border-radius:4px;outline:none;box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-time-picker-panel-input{width:100%;max-width:154px;margin:0;padding:0;line-height:normal;border:0;outline:0;cursor:auto}.ant-time-picker-panel-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-time-picker-panel-input:-ms-input-placeholder{color:#bfbfbf}.ant-time-picker-panel-input::-webkit-input-placeholder{color:#bfbfbf}.ant-time-picker-panel-input-wrap{position:relative;box-sizing:border-box;padding:7px 2px 7px 12px;border-bottom:1px solid #e8e8e8}.ant-time-picker-panel-input-invalid{border-color:#f5222d}.ant-time-picker-panel-narrow .ant-time-picker-panel-input-wrap{max-width:112px}.ant-time-picker-panel-select{position:relative;float:left;box-sizing:border-box;width:56px;max-height:192px;overflow:hidden;font-size:14px;border-left:1px solid #e8e8e8}.ant-time-picker-panel-select:hover{overflow-y:auto}.ant-time-picker-panel-select:first-child{margin-left:0;border-left:0}.ant-time-picker-panel-select:last-child{border-right:0}.ant-time-picker-panel-select:only-child{width:100%}.ant-time-picker-panel-select ul{box-sizing:border-box;width:100%;margin:0;padding:0 0 160px;list-style:none}.ant-time-picker-panel-select li{box-sizing:initial;width:100%;height:32px;margin:0;padding:0 0 0 12px;line-height:32px;text-align:left;list-style:none;cursor:pointer;-webkit-transition:background .3s;transition:background .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-time-picker-panel-select li:hover{background:#e6f7ff}li.ant-time-picker-panel-select-option-selected{font-weight:700;background:#f5f5f5}li.ant-time-picker-panel-select-option-selected:hover{background:#f5f5f5}li.ant-time-picker-panel-select-option-disabled{color:rgba(0,0,0,.25)}li.ant-time-picker-panel-select-option-disabled:hover{background:transparent;cursor:not-allowed}.ant-time-picker-panel-combobox{zoom:1}.ant-time-picker-panel-combobox:after,.ant-time-picker-panel-combobox:before{display:table;content:""}.ant-time-picker-panel-combobox:after{clear:both}.ant-time-picker-panel-addon{padding:8px;border-top:1px solid #e8e8e8}.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-topLeft,.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-topRight,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-topLeft,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-topRight{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-bottomLeft,.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-bottomRight,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-bottomLeft,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-bottomRight{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-topLeft,.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-topRight{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-bottomLeft,.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-bottomRight{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-time-picker{box-sizing:border-box;margin:0;padding:0;font-size:14px;font-variant:tabular-nums;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";width:128px;outline:none;cursor:text;-webkit-transition:opacity .3s;transition:opacity .3s}.ant-time-picker,.ant-time-picker-input{color:rgba(0,0,0,.65);line-height:1.5;position:relative;display:inline-block}.ant-time-picker-input{width:100%;height:32px;padding:4px 11px;font-size:14px;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s}.ant-time-picker-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-time-picker-input:-ms-input-placeholder{color:#bfbfbf}.ant-time-picker-input::-webkit-input-placeholder{color:#bfbfbf}.ant-time-picker-input:focus,.ant-time-picker-input:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-time-picker-input:focus{outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-time-picker-input-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-time-picker-input-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-time-picker-input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s}.ant-time-picker-input-lg{height:40px;padding:6px 11px;font-size:16px}.ant-time-picker-input-sm{height:24px;padding:1px 7px}.ant-time-picker-input[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-time-picker-input[disabled]:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-time-picker-open{opacity:0}.ant-time-picker-clear,.ant-time-picker-icon{position:absolute;top:50%;right:11px;z-index:1;width:14px;height:14px;margin-top:-7px;color:rgba(0,0,0,.25);line-height:14px;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-time-picker-clear .ant-time-picker-clock-icon,.ant-time-picker-icon .ant-time-picker-clock-icon{display:block;color:rgba(0,0,0,.25);line-height:1}.ant-time-picker-clear{z-index:2;background:#fff;opacity:0;pointer-events:none}.ant-time-picker-clear:hover{color:rgba(0,0,0,.45)}.ant-time-picker:hover .ant-time-picker-clear{opacity:1;pointer-events:auto}.ant-time-picker-large .ant-time-picker-input{height:40px;padding:6px 11px;font-size:16px}.ant-time-picker-small .ant-time-picker-input{height:24px;padding:1px 7px}.ant-time-picker-small .ant-time-picker-clear,.ant-time-picker-small .ant-time-picker-icon{right:7px}.ant-tag{box-sizing:border-box;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block;height:auto;margin:0 8px 0 0;padding:0 7px;font-size:12px;line-height:20px;white-space:nowrap;background:#fafafa;border:1px solid #d9d9d9;border-radius:4px;cursor:default;opacity:1;-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-tag:hover{opacity:.85}.ant-tag,.ant-tag a,.ant-tag a:hover{color:rgba(0,0,0,.65)}.ant-tag>a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.ant-tag .anticon-close{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);margin-left:3px;color:rgba(0,0,0,.45);font-weight:700;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86)}:root .ant-tag .anticon-close{font-size:12px}.ant-tag .anticon-close:hover{color:rgba(0,0,0,.85)}.ant-tag-has-color{border-color:transparent}.ant-tag-has-color,.ant-tag-has-color .anticon-close,.ant-tag-has-color .anticon-close:hover,.ant-tag-has-color a,.ant-tag-has-color a:hover{color:#fff}.ant-tag-checkable{background-color:initial;border-color:transparent}.ant-tag-checkable:not(.ant-tag-checkable-checked):hover{color:#1890ff}.ant-tag-checkable-checked,.ant-tag-checkable:active{color:#fff}.ant-tag-checkable-checked{background-color:#1890ff}.ant-tag-checkable:active{background-color:#096dd9}.ant-tag-hidden{display:none}.ant-tag-pink{color:#eb2f96;background:#fff0f6;border-color:#ffadd2}.ant-tag-pink-inverse{color:#fff;background:#eb2f96;border-color:#eb2f96}.ant-tag-magenta{color:#eb2f96;background:#fff0f6;border-color:#ffadd2}.ant-tag-magenta-inverse{color:#fff;background:#eb2f96;border-color:#eb2f96}.ant-tag-red{color:#f5222d;background:#fff1f0;border-color:#ffa39e}.ant-tag-red-inverse{color:#fff;background:#f5222d;border-color:#f5222d}.ant-tag-volcano{color:#fa541c;background:#fff2e8;border-color:#ffbb96}.ant-tag-volcano-inverse{color:#fff;background:#fa541c;border-color:#fa541c}.ant-tag-orange{color:#fa8c16;background:#fff7e6;border-color:#ffd591}.ant-tag-orange-inverse{color:#fff;background:#fa8c16;border-color:#fa8c16}.ant-tag-yellow{color:#fadb14;background:#feffe6;border-color:#fffb8f}.ant-tag-yellow-inverse{color:#fff;background:#fadb14;border-color:#fadb14}.ant-tag-gold{color:#faad14;background:#fffbe6;border-color:#ffe58f}.ant-tag-gold-inverse{color:#fff;background:#faad14;border-color:#faad14}.ant-tag-cyan{color:#13c2c2;background:#e6fffb;border-color:#87e8de}.ant-tag-cyan-inverse{color:#fff;background:#13c2c2;border-color:#13c2c2}.ant-tag-lime{color:#a0d911;background:#fcffe6;border-color:#eaff8f}.ant-tag-lime-inverse{color:#fff;background:#a0d911;border-color:#a0d911}.ant-tag-green{color:#52c41a;background:#f6ffed;border-color:#b7eb8f}.ant-tag-green-inverse{color:#fff;background:#52c41a;border-color:#52c41a}.ant-tag-blue{color:#1890ff;background:#e6f7ff;border-color:#91d5ff}.ant-tag-blue-inverse{color:#fff;background:#1890ff;border-color:#1890ff}.ant-tag-geekblue{color:#2f54eb;background:#f0f5ff;border-color:#adc6ff}.ant-tag-geekblue-inverse{color:#fff;background:#2f54eb;border-color:#2f54eb}.ant-tag-purple{color:#722ed1;background:#f9f0ff;border-color:#d3adf7}.ant-tag-purple-inverse{color:#fff;background:#722ed1;border-color:#722ed1}.ant-divider{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";background:#e8e8e8}.ant-divider,.ant-divider-vertical{position:relative;top:-.06em;display:inline-block;width:1px;height:.9em;margin:0 8px;vertical-align:middle}.ant-divider-horizontal{display:block;clear:both;width:100%;min-width:100%;height:1px;margin:24px 0}.ant-divider-horizontal.ant-divider-with-text,.ant-divider-horizontal.ant-divider-with-text-left,.ant-divider-horizontal.ant-divider-with-text-right{display:table;margin:16px 0;color:rgba(0,0,0,.85);font-weight:500;font-size:16px;white-space:nowrap;text-align:center;background:transparent}.ant-divider-horizontal.ant-divider-with-text-left:after,.ant-divider-horizontal.ant-divider-with-text-left:before,.ant-divider-horizontal.ant-divider-with-text-right:after,.ant-divider-horizontal.ant-divider-with-text-right:before,.ant-divider-horizontal.ant-divider-with-text:after,.ant-divider-horizontal.ant-divider-with-text:before{position:relative;top:50%;display:table-cell;width:50%;border-top:1px solid #e8e8e8;-webkit-transform:translateY(50%);transform:translateY(50%);content:""}.ant-divider-horizontal.ant-divider-with-text-left .ant-divider-inner-text,.ant-divider-horizontal.ant-divider-with-text-right .ant-divider-inner-text{display:inline-block;padding:0 10px}.ant-divider-horizontal.ant-divider-with-text-left:before{top:50%;width:5%}.ant-divider-horizontal.ant-divider-with-text-left:after,.ant-divider-horizontal.ant-divider-with-text-right:before{top:50%;width:95%}.ant-divider-horizontal.ant-divider-with-text-right:after{top:50%;width:5%}.ant-divider-inner-text{display:inline-block;padding:0 24px}.ant-divider-dashed{background:none;border-top:1px dashed #e8e8e8}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed,.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed,.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed{border-top:0}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:after,.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:before,.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:after,.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:before,.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after,.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before{border-style:dashed none none}.ant-drawer{position:fixed;z-index:1000;width:0;height:100%}.ant-drawer>*{-webkit-transition:-webkit-transform .3s cubic-bezier(.9,0,.3,.7),-webkit-box-shadow .3s cubic-bezier(.9,0,.3,.7);-webkit-transition:box-shadow .3s cubic-bezier(.9,0,.3,.7),-webkit-transform .3s cubic-bezier(.9,0,.3,.7);transition:box-shadow .3s cubic-bezier(.9,0,.3,.7),-webkit-transform .3s cubic-bezier(.9,0,.3,.7);transition:transform .3s cubic-bezier(.9,0,.3,.7),box-shadow .3s cubic-bezier(.9,0,.3,.7);transition:transform .3s cubic-bezier(.9,0,.3,.7),box-shadow .3s cubic-bezier(.9,0,.3,.7),-webkit-transform .3s cubic-bezier(.9,0,.3,.7)}.ant-drawer-content-wrapper{position:fixed}.ant-drawer .ant-drawer-content{width:100%;height:100%}.ant-drawer-left,.ant-drawer-right{top:0;width:0;height:100%}.ant-drawer-left .ant-drawer-content-wrapper,.ant-drawer-right .ant-drawer-content-wrapper{height:100%}.ant-drawer-left.ant-drawer-open,.ant-drawer-right.ant-drawer-open{width:100%}.ant-drawer-left.ant-drawer-open.no-mask,.ant-drawer-right.ant-drawer-open.no-mask{width:0}.ant-drawer-left.ant-drawer-open .ant-drawer-content-wrapper{box-shadow:2px 0 8px rgba(0,0,0,.15)}.ant-drawer-right,.ant-drawer-right .ant-drawer-content-wrapper{right:0}.ant-drawer-right.ant-drawer-open .ant-drawer-content-wrapper{box-shadow:-2px 0 8px rgba(0,0,0,.15)}.ant-drawer-bottom,.ant-drawer-top{left:0;width:100%;height:0%}.ant-drawer-bottom .ant-drawer-content-wrapper,.ant-drawer-top .ant-drawer-content-wrapper{width:100%}.ant-drawer-bottom.ant-drawer-open,.ant-drawer-top.ant-drawer-open{height:100%}.ant-drawer-bottom.ant-drawer-open.no-mask,.ant-drawer-top.ant-drawer-open.no-mask{height:0%}.ant-drawer-top{top:0}.ant-drawer-top.ant-drawer-open .ant-drawer-content-wrapper{box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-drawer-bottom,.ant-drawer-bottom .ant-drawer-content-wrapper{bottom:0}.ant-drawer-bottom.ant-drawer-open .ant-drawer-content-wrapper{box-shadow:0 -2px 8px rgba(0,0,0,.15)}.ant-drawer.ant-drawer-open .ant-drawer-mask{height:100%;opacity:.3;-webkit-transition:none;transition:none;-webkit-animation:antdDrawerFadeIn .3s cubic-bezier(.7,.3,.1,1);animation:antdDrawerFadeIn .3s cubic-bezier(.7,.3,.1,1)}.ant-drawer-title{margin:0;color:rgba(0,0,0,.85);font-weight:500;font-size:16px;line-height:22px}.ant-drawer-content{position:relative;z-index:1;background-color:#fff;background-clip:padding-box;border:0}.ant-drawer-close{position:absolute;top:0;right:0;z-index:10;display:block;width:56px;height:56px;padding:0;color:rgba(0,0,0,.45);font-weight:700;font-size:16px;font-style:normal;line-height:56px;text-align:center;text-transform:none;text-decoration:none;background:transparent;border:0;outline:0;cursor:pointer;-webkit-transition:color .3s;transition:color .3s;text-rendering:auto}.ant-drawer-close:focus,.ant-drawer-close:hover{color:rgba(0,0,0,.75);text-decoration:none}.ant-drawer-header{position:relative;padding:16px 24px;border-bottom:1px solid #e8e8e8;border-radius:4px 4px 0 0}.ant-drawer-header,.ant-drawer-header-no-title{color:rgba(0,0,0,.65);background:#fff}.ant-drawer-body{padding:24px;font-size:14px;line-height:1.5;word-wrap:break-word}.ant-drawer-mask{position:fixed;width:100%;height:0;background-color:rgba(0,0,0,.65);opacity:0;filter:alpha(opacity=50);-webkit-transition:opacity .3s linear,height 0s ease .3s;transition:opacity .3s linear,height 0s ease .3s}.ant-drawer-open{-webkit-transition:-webkit-transform .3s cubic-bezier(.7,.3,.1,1);transition:-webkit-transform .3s cubic-bezier(.7,.3,.1,1);transition:transform .3s cubic-bezier(.7,.3,.1,1);transition:transform .3s cubic-bezier(.7,.3,.1,1),-webkit-transform .3s cubic-bezier(.7,.3,.1,1)}.ant-drawer-open-content{box-shadow:0 4px 12px rgba(0,0,0,.15)}@-webkit-keyframes antdDrawerFadeIn{0%{opacity:0}to{opacity:.3}}@keyframes antdDrawerFadeIn{0%{opacity:0}to{opacity:.3}}.ant-form{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum"}.ant-form legend{display:block;width:100%;margin-bottom:20px;padding:0;color:rgba(0,0,0,.45);font-size:16px;line-height:inherit;border:0;border-bottom:1px solid #d9d9d9}.ant-form label{font-size:14px}.ant-form input[type=search]{box-sizing:border-box}.ant-form input[type=checkbox],.ant-form input[type=radio]{line-height:normal}.ant-form input[type=file]{display:block}.ant-form input[type=range]{display:block;width:100%}.ant-form select[multiple],.ant-form select[size]{height:auto}.ant-form input[type=checkbox]:focus,.ant-form input[type=file]:focus,.ant-form input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.ant-form output{display:block;padding-top:15px;color:rgba(0,0,0,.65);font-size:14px;line-height:1.5}.ant-form-item-required:before{display:inline-block;margin-right:4px;color:#f5222d;font-size:14px;font-family:SimSun,sans-serif;line-height:1;content:"*"}.ant-form-hide-required-mark .ant-form-item-required:before{display:none}.ant-form-item-label>label{color:rgba(0,0,0,.85)}.ant-form-item-label>label:after{content:":";position:relative;top:-.5px;margin:0 8px 0 2px}.ant-form-item-label>label.ant-form-item-no-colon:after{content:" "}.ant-checkbox-inline.disabled,.ant-checkbox-vertical.disabled,.ant-checkbox.disabled label,.ant-radio-inline.disabled,.ant-radio-vertical.disabled,.ant-radio.disabled label,input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.ant-form-item{box-sizing:border-box;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";margin:0 0 24px;vertical-align:top}.ant-form-item label{position:relative}.ant-form-item label>.anticon{font-size:14px;vertical-align:top}.ant-form-item-control{position:relative;line-height:40px;zoom:1}.ant-form-item-control:after,.ant-form-item-control:before{display:table;content:""}.ant-form-item-control:after{clear:both}.ant-form-item-children{position:relative}.ant-form-item-with-help{margin-bottom:5px}.ant-form-item-label{display:inline-block;overflow:hidden;line-height:39.9999px;white-space:nowrap;text-align:right;vertical-align:middle}.ant-form-item-label-left{text-align:left}.ant-form-item .ant-switch{margin:2px 0 4px}.ant-form-explain,.ant-form-extra{clear:both;min-height:22px;margin-top:-2px;color:rgba(0,0,0,.45);font-size:14px;line-height:1.5;-webkit-transition:color .3s cubic-bezier(.215,.61,.355,1);transition:color .3s cubic-bezier(.215,.61,.355,1)}.ant-form-explain{margin-bottom:-1px}.ant-form-extra{padding-top:4px}.ant-form-text{display:inline-block;padding-right:8px}.ant-form-split{display:block;text-align:center}form .has-feedback .ant-input{padding-right:24px}form .has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-arrow,form .has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-selection__clear,form .has-feedback>.ant-select .ant-select-arrow,form .has-feedback>.ant-select .ant-select-selection__clear{right:28px}form .has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-selection-selected-value,form .has-feedback>.ant-select .ant-select-selection-selected-value{padding-right:42px}form .has-feedback .ant-cascader-picker-arrow{margin-right:17px}form .has-feedback .ant-calendar-picker-clear,form .has-feedback .ant-calendar-picker-icon,form .has-feedback .ant-cascader-picker-clear,form .has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix,form .has-feedback .ant-time-picker-clear,form .has-feedback .ant-time-picker-icon{right:28px}form textarea.ant-input{height:auto;margin-bottom:4px}form .ant-upload{background:transparent}form input[type=checkbox],form input[type=radio]{width:14px;height:14px}form .ant-checkbox-inline,form .ant-radio-inline{display:inline-block;margin-left:8px;font-weight:400;vertical-align:middle;cursor:pointer}form .ant-checkbox-inline:first-child,form .ant-radio-inline:first-child{margin-left:0}form .ant-checkbox-vertical,form .ant-radio-vertical{display:block}form .ant-checkbox-vertical+.ant-checkbox-vertical,form .ant-radio-vertical+.ant-radio-vertical{margin-left:0}form .ant-input-number+.ant-form-text{margin-left:8px}form .ant-input-number-handler-wrap{z-index:2}form .ant-cascader-picker,form .ant-select{width:100%}form .ant-input-group .ant-cascader-picker,form .ant-input-group .ant-select{width:auto}form .ant-input-group-wrapper,form :not(.ant-input-group-wrapper)>.ant-input-group{position:relative;top:-1px;display:inline-block;vertical-align:middle}.ant-input-group-wrap .ant-select-selection{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group-wrap .ant-select-selection:hover{border-color:#d9d9d9}.ant-input-group-wrap .ant-select-selection--single{height:40px;margin-left:-1px;background-color:rgba(0,0,0,.07)}.ant-input-group-wrap .ant-select-selection--single .ant-select-selection__rendered{padding-right:25px;padding-left:8px;line-height:30px}.ant-input-group-wrap .ant-select-open .ant-select-selection{border-color:#d9d9d9;box-shadow:none}.ant-col-24.ant-form-item-label,.ant-col-xl-24.ant-form-item-label,.ant-form-vertical .ant-form-item-label{display:block;margin:0;padding:0 0 8px;line-height:1.5;white-space:normal;text-align:left}.ant-col-24.ant-form-item-label label:after,.ant-col-xl-24.ant-form-item-label label:after,.ant-form-vertical .ant-form-item-label label:after{display:none}.ant-form-vertical .ant-form-item{padding-bottom:8px}.ant-form-vertical .ant-form-item-control{line-height:1.5}.ant-form-vertical .ant-form-explain{margin-top:2px;margin-bottom:-5px}.ant-form-vertical .ant-form-extra{margin-top:2px;margin-bottom:-4px}@media (max-width:575px){.ant-form-item-control-wrapper,.ant-form-item-label{display:block;width:100%}.ant-form-item-label{display:block;margin:0;padding:0 0 8px;line-height:1.5;white-space:normal;text-align:left}.ant-form-item-label label:after{display:none}.ant-col-xs-24.ant-form-item-label{display:block;margin:0;padding:0 0 8px;line-height:1.5;white-space:normal;text-align:left}.ant-col-xs-24.ant-form-item-label label:after{display:none}}@media (max-width:767px){.ant-col-sm-24.ant-form-item-label{display:block;margin:0;padding:0 0 8px;line-height:1.5;white-space:normal;text-align:left}.ant-col-sm-24.ant-form-item-label label:after{display:none}}@media (max-width:991px){.ant-col-md-24.ant-form-item-label{display:block;margin:0;padding:0 0 8px;line-height:1.5;white-space:normal;text-align:left}.ant-col-md-24.ant-form-item-label label:after{display:none}}@media (max-width:1199px){.ant-col-lg-24.ant-form-item-label{display:block;margin:0;padding:0 0 8px;line-height:1.5;white-space:normal;text-align:left}.ant-col-lg-24.ant-form-item-label label:after{display:none}}@media (max-width:1599px){.ant-col-xl-24.ant-form-item-label{display:block;margin:0;padding:0 0 8px;line-height:1.5;white-space:normal;text-align:left}.ant-col-xl-24.ant-form-item-label label:after{display:none}}.ant-form-inline .ant-form-item{display:inline-block;margin-right:16px;margin-bottom:0}.ant-form-inline .ant-form-item-with-help{margin-bottom:24px}.ant-form-inline .ant-form-item>.ant-form-item-control-wrapper,.ant-form-inline .ant-form-item>.ant-form-item-label{display:inline-block;vertical-align:top}.ant-form-inline .ant-form-text,.ant-form-inline .has-feedback{display:inline-block}.has-error.has-feedback .ant-form-item-children-icon,.has-success.has-feedback .ant-form-item-children-icon,.has-warning.has-feedback .ant-form-item-children-icon,.is-validating.has-feedback .ant-form-item-children-icon{position:absolute;top:50%;right:0;z-index:1;width:32px;height:20px;margin-top:-10px;font-size:14px;line-height:20px;text-align:center;visibility:visible;-webkit-animation:zoomIn .3s cubic-bezier(.12,.4,.29,1.46);animation:zoomIn .3s cubic-bezier(.12,.4,.29,1.46);pointer-events:none}.has-error.has-feedback .ant-form-item-children-icon svg,.has-success.has-feedback .ant-form-item-children-icon svg,.has-warning.has-feedback .ant-form-item-children-icon svg,.is-validating.has-feedback .ant-form-item-children-icon svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.has-success.has-feedback .ant-form-item-children-icon{color:#52c41a;-webkit-animation-name:diffZoomIn1!important;animation-name:diffZoomIn1!important}.has-warning .ant-form-explain,.has-warning .ant-form-split{color:#faad14}.has-warning .ant-input,.has-warning .ant-input:hover{border-color:#faad14}.has-warning .ant-input:focus{border-color:#ffc53d;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(250,173,20,.2)}.has-warning .ant-input:not([disabled]):hover{border-color:#faad14}.has-warning .ant-calendar-picker-open .ant-calendar-picker-input{border-color:#ffc53d;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(250,173,20,.2)}.has-warning .ant-input-affix-wrapper .ant-input,.has-warning .ant-input-affix-wrapper .ant-input:hover{background-color:#fff;border-color:#faad14}.has-warning .ant-input-affix-wrapper .ant-input:focus{border-color:#ffc53d;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(250,173,20,.2)}.has-warning .ant-input-affix-wrapper:hover .ant-input:not(.ant-input-disabled){border-color:#faad14}.has-warning .ant-input-prefix{color:#faad14}.has-warning .ant-input-group-addon{color:#faad14;background-color:#fff;border-color:#faad14}.has-warning .has-feedback{color:#faad14}.has-warning.has-feedback .ant-form-item-children-icon{color:#faad14;-webkit-animation-name:diffZoomIn3!important;animation-name:diffZoomIn3!important}.has-warning .ant-select-selection,.has-warning .ant-select-selection:hover{border-color:#faad14}.has-warning .ant-select-focused .ant-select-selection,.has-warning .ant-select-open .ant-select-selection{border-color:#ffc53d;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(250,173,20,.2)}.has-warning .ant-calendar-picker-icon:after,.has-warning .ant-cascader-picker-arrow,.has-warning .ant-picker-icon:after,.has-warning .ant-select-arrow,.has-warning .ant-time-picker-icon:after{color:#faad14}.has-warning .ant-input-number,.has-warning .ant-time-picker-input{border-color:#faad14}.has-warning .ant-input-number-focused,.has-warning .ant-input-number:focus,.has-warning .ant-time-picker-input-focused,.has-warning .ant-time-picker-input:focus{border-color:#ffc53d;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(250,173,20,.2)}.has-warning .ant-input-number:not([disabled]):hover,.has-warning .ant-time-picker-input:not([disabled]):hover{border-color:#faad14}.has-warning .ant-cascader-picker:focus .ant-cascader-input{border-color:#ffc53d;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(250,173,20,.2)}.has-error .ant-form-explain,.has-error .ant-form-split{color:#f5222d}.has-error .ant-input,.has-error .ant-input:hover{border-color:#f5222d}.has-error .ant-input:focus{border-color:#ff4d4f;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(245,34,45,.2)}.has-error .ant-input:not([disabled]):hover{border-color:#f5222d}.has-error .ant-calendar-picker-open .ant-calendar-picker-input{border-color:#ff4d4f;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(245,34,45,.2)}.has-error .ant-input-affix-wrapper .ant-input,.has-error .ant-input-affix-wrapper .ant-input:hover{background-color:#fff;border-color:#f5222d}.has-error .ant-input-affix-wrapper .ant-input:focus{border-color:#ff4d4f;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(245,34,45,.2)}.has-error .ant-input-affix-wrapper:hover .ant-input:not(.ant-input-disabled){border-color:#f5222d}.has-error .ant-input-prefix{color:#f5222d}.has-error .ant-input-group-addon{color:#f5222d;background-color:#fff;border-color:#f5222d}.has-error .has-feedback{color:#f5222d}.has-error.has-feedback .ant-form-item-children-icon{color:#f5222d;-webkit-animation-name:diffZoomIn2!important;animation-name:diffZoomIn2!important}.has-error .ant-select-selection,.has-error .ant-select-selection:hover{border-color:#f5222d}.has-error .ant-select-focused .ant-select-selection,.has-error .ant-select-open .ant-select-selection{border-color:#ff4d4f;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(245,34,45,.2)}.has-error .ant-select.ant-select-auto-complete .ant-input:focus{border-color:#f5222d}.has-error .ant-input-group-addon .ant-select-selection{border-color:transparent;box-shadow:none}.has-error .ant-calendar-picker-icon:after,.has-error .ant-cascader-picker-arrow,.has-error .ant-picker-icon:after,.has-error .ant-select-arrow,.has-error .ant-time-picker-icon:after{color:#f5222d}.has-error .ant-input-number,.has-error .ant-time-picker-input{border-color:#f5222d}.has-error .ant-input-number-focused,.has-error .ant-input-number:focus,.has-error .ant-time-picker-input-focused,.has-error .ant-time-picker-input:focus{border-color:#ff4d4f;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(245,34,45,.2)}.has-error .ant-input-number:not([disabled]):hover,.has-error .ant-mention-wrapper .ant-mention-editor,.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):hover,.has-error .ant-time-picker-input:not([disabled]):hover{border-color:#f5222d}.has-error .ant-cascader-picker:focus .ant-cascader-input,.has-error .ant-mention-wrapper.ant-mention-active:not([disabled]) .ant-mention-editor,.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):focus{border-color:#ff4d4f;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(245,34,45,.2)}.has-error .ant-transfer-list{border-color:#f5222d}.has-error .ant-transfer-list-search:not([disabled]){border-color:#d9d9d9}.has-error .ant-transfer-list-search:not([disabled]):hover{border-color:#40a9ff;border-right-width:1px!important}.has-error .ant-transfer-list-search:not([disabled]):focus{border-color:#40a9ff;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.is-validating.has-feedback .ant-form-item-children-icon{display:inline-block;color:#1890ff}.ant-advanced-search-form .ant-form-item{margin-bottom:24px}.ant-advanced-search-form .ant-form-item-with-help{margin-bottom:5px}.show-help-appear,.show-help-enter,.show-help-leave{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.show-help-appear.show-help-appear-active,.show-help-enter.show-help-enter-active{-webkit-animation-name:antShowHelpIn;animation-name:antShowHelpIn;-webkit-animation-play-state:running;animation-play-state:running}.show-help-leave.show-help-leave-active{-webkit-animation-name:antShowHelpOut;animation-name:antShowHelpOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.show-help-appear,.show-help-enter{opacity:0}.show-help-appear,.show-help-enter,.show-help-leave{-webkit-animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-timing-function:cubic-bezier(.645,.045,.355,1)}@-webkit-keyframes antShowHelpIn{0%{-webkit-transform:translateY(-5px);transform:translateY(-5px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes antShowHelpIn{0%{-webkit-transform:translateY(-5px);transform:translateY(-5px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes antShowHelpOut{to{-webkit-transform:translateY(-5px);transform:translateY(-5px);opacity:0}}@keyframes antShowHelpOut{to{-webkit-transform:translateY(-5px);transform:translateY(-5px);opacity:0}}@-webkit-keyframes diffZoomIn1{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes diffZoomIn1{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes diffZoomIn2{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes diffZoomIn2{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes diffZoomIn3{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes diffZoomIn3{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}.ant-input-number{box-sizing:border-box;font-variant:tabular-nums;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;width:100%;height:32px;color:rgba(0,0,0,.65);font-size:14px;line-height:1.5;background-color:#fff;background-image:none;-webkit-transition:all .3s;transition:all .3s;display:inline-block;width:90px;margin:0;padding:0;border:1px solid #d9d9d9;border-radius:4px}.ant-input-number::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-input-number:-ms-input-placeholder{color:#bfbfbf}.ant-input-number::-webkit-input-placeholder{color:#bfbfbf}.ant-input-number:focus{border-color:#40a9ff;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-input-number[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-input-number[disabled]:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-input-number{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s}.ant-input-number-lg{height:40px;padding:6px 11px}.ant-input-number-sm{height:24px;padding:1px 7px}.ant-input-number-handler{position:relative;display:block;width:100%;height:50%;overflow:hidden;color:rgba(0,0,0,.45);font-weight:700;line-height:0;text-align:center;-webkit-transition:all .1s linear;transition:all .1s linear}.ant-input-number-handler:active{background:#f4f4f4}.ant-input-number-handler:hover .ant-input-number-handler-down-inner,.ant-input-number-handler:hover .ant-input-number-handler-up-inner{color:#40a9ff}.ant-input-number-handler-down-inner,.ant-input-number-handler-up-inner{display:inline-block;color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;right:4px;width:12px;height:12px;color:rgba(0,0,0,.45);line-height:12px;-webkit-transition:all .1s linear;transition:all .1s linear;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-handler-down-inner>*,.ant-input-number-handler-up-inner>*{line-height:1}.ant-input-number-handler-down-inner svg,.ant-input-number-handler-up-inner svg{display:inline-block}.ant-input-number-handler-down-inner:before,.ant-input-number-handler-up-inner:before{display:none}.ant-input-number-handler-down-inner .ant-input-number-handler-down-inner-icon,.ant-input-number-handler-down-inner .ant-input-number-handler-up-inner-icon,.ant-input-number-handler-up-inner .ant-input-number-handler-down-inner-icon,.ant-input-number-handler-up-inner .ant-input-number-handler-up-inner-icon{display:block}.ant-input-number-focused,.ant-input-number:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-input-number-focused{outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-input-number-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-input-number-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-input-number-disabled .ant-input-number-input{cursor:not-allowed}.ant-input-number-disabled .ant-input-number-handler-wrap{display:none}.ant-input-number-input{width:100%;height:30px;padding:0 11px;text-align:left;background-color:initial;border:0;border-radius:4px;outline:0;-webkit-transition:all .3s linear;transition:all .3s linear;-moz-appearance:textfield}.ant-input-number-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-input-number-input:-ms-input-placeholder{color:#bfbfbf}.ant-input-number-input::-webkit-input-placeholder{color:#bfbfbf}.ant-input-number-lg{padding:0;font-size:16px}.ant-input-number-lg input{height:38px}.ant-input-number-sm{padding:0}.ant-input-number-sm input{height:22px;padding:0 7px}.ant-input-number-handler-wrap{position:absolute;top:0;right:0;width:22px;height:100%;background:#fff;border-left:1px solid #d9d9d9;border-radius:0 4px 4px 0;opacity:0;-webkit-transition:opacity .24s linear .1s;transition:opacity .24s linear .1s}.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-down-inner,.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-up-inner{display:inline-block;font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);min-width:auto;margin-right:0}:root .ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-down-inner,:root .ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-up-inner{font-size:12px}.ant-input-number-handler-wrap:hover .ant-input-number-handler{height:40%}.ant-input-number:hover .ant-input-number-handler-wrap{opacity:1}.ant-input-number-handler-up{cursor:pointer}.ant-input-number-handler-up-inner{top:50%;margin-top:-5px;text-align:center}.ant-input-number-handler-up:hover{height:60%!important}.ant-input-number-handler-down{top:0;border-top:1px solid #d9d9d9;cursor:pointer}.ant-input-number-handler-down-inner{top:50%;margin-top:-6px;text-align:center}.ant-input-number-handler-down:hover{height:60%!important}.ant-input-number-handler-down-disabled,.ant-input-number-handler-up-disabled{cursor:not-allowed}.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner,.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner{color:rgba(0,0,0,.25)}.ant-layout{display:flex;flex:auto;flex-direction:column;min-height:0;background:#f0f2f5}.ant-layout,.ant-layout *{box-sizing:border-box}.ant-layout.ant-layout-has-sider{flex-direction:row}.ant-layout.ant-layout-has-sider>.ant-layout,.ant-layout.ant-layout-has-sider>.ant-layout-content{overflow-x:hidden}.ant-layout-footer,.ant-layout-header{flex:0 0 auto}.ant-layout-header{height:64px;padding:0 50px;line-height:64px;background:#001529}.ant-layout-footer{padding:24px 50px;color:rgba(0,0,0,.65);font-size:14px;background:#f0f2f5}.ant-layout-content{flex:auto;min-height:0}.ant-layout-sider{position:relative;min-width:0;background:#001529;-webkit-transition:all .2s;transition:all .2s}.ant-layout-sider-children{height:100%;margin-top:-.1px;padding-top:.1px}.ant-layout-sider-has-trigger{padding-bottom:48px}.ant-layout-sider-right{order:1}.ant-layout-sider-trigger{position:fixed;bottom:0;z-index:1;height:48px;color:#fff;line-height:48px;text-align:center;background:#002140;cursor:pointer;-webkit-transition:all .2s;transition:all .2s}.ant-layout-sider-zero-width>*{overflow:hidden}.ant-layout-sider-zero-width-trigger{position:absolute;top:64px;right:-36px;width:36px;height:42px;color:#fff;font-size:18px;line-height:42px;text-align:center;background:#001529;border-radius:0 4px 4px 0;cursor:pointer;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-layout-sider-zero-width-trigger:hover{background:#192c3e}.ant-layout-sider-zero-width-trigger-right{left:-36px}.ant-layout-sider-light{background:#fff}.ant-layout-sider-light .ant-layout-sider-trigger,.ant-layout-sider-light .ant-layout-sider-zero-width-trigger{color:rgba(0,0,0,.65);background:#fff}.ant-list{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative}.ant-list *{outline:none}.ant-list-pagination{margin-top:24px;text-align:right}.ant-list-more{margin-top:12px;text-align:center}.ant-list-more button{padding-right:32px;padding-left:32px}.ant-list-spin{min-height:40px;text-align:center}.ant-list-empty-text{padding:16px;color:rgba(0,0,0,.25);font-size:14px;text-align:center}.ant-list-items{margin:0;padding:0;list-style:none}.ant-list-item{display:flex;align-items:center;padding:12px 0}.ant-list-item-content{color:rgba(0,0,0,.65)}.ant-list-item-meta{display:flex;flex:1 1;align-items:flex-start;font-size:0}.ant-list-item-meta-avatar{margin-right:16px}.ant-list-item-meta-content{flex:1 0}.ant-list-item-meta-title{margin-bottom:4px;color:rgba(0,0,0,.65);font-size:14px;line-height:22px}.ant-list-item-meta-title>a{color:rgba(0,0,0,.65);-webkit-transition:all .3s;transition:all .3s}.ant-list-item-meta-title>a:hover{color:#1890ff}.ant-list-item-meta-description{color:rgba(0,0,0,.45);font-size:14px;line-height:22px}.ant-list-item-action{flex:0 0 auto;margin-left:48px;padding:0;font-size:0;list-style:none}.ant-list-item-action>li{position:relative;display:inline-block;padding:0 8px;color:rgba(0,0,0,.45);font-size:14px;line-height:22px;text-align:center;cursor:pointer}.ant-list-item-action>li:first-child{padding-left:0}.ant-list-item-action-split{position:absolute;top:50%;right:0;width:1px;height:14px;margin-top:-7px;background-color:#e8e8e8}.ant-list-footer,.ant-list-header{background:transparent}.ant-list-footer,.ant-list-header{padding-top:12px;padding-bottom:12px}.ant-list-empty{padding:16px 0;color:rgba(0,0,0,.45);font-size:12px;text-align:center}.ant-list-split .ant-list-item{border-bottom:1px solid #e8e8e8}.ant-list-split .ant-list-item:last-child{border-bottom:none}.ant-list-split .ant-list-header{border-bottom:1px solid #e8e8e8}.ant-list-loading .ant-list-spin-nested-loading{min-height:32px}.ant-list-something-after-last-item .ant-spin-container>.ant-list-items>.ant-list-item:last-child{border-bottom:1px solid #e8e8e8}.ant-list-lg .ant-list-item{padding-top:16px;padding-bottom:16px}.ant-list-sm .ant-list-item{padding-top:8px;padding-bottom:8px}.ant-list-vertical .ant-list-item{align-items:normal}.ant-list-vertical .ant-list-item-main{display:block;flex:1 1}.ant-list-vertical .ant-list-item-extra{margin-left:40px}.ant-list-vertical .ant-list-item-meta{margin-bottom:16px}.ant-list-vertical .ant-list-item-meta-title{margin-bottom:12px;color:rgba(0,0,0,.85);font-size:16px;line-height:24px}.ant-list-vertical .ant-list-item-action{margin-top:16px;margin-left:auto}.ant-list-vertical .ant-list-item-action>li{padding:0 16px}.ant-list-vertical .ant-list-item-action>li:first-child{padding-left:0}.ant-list-grid .ant-list-item{display:block;max-width:100%;margin-bottom:16px;padding-top:0;padding-bottom:0;border-bottom:none}.ant-list-item-no-flex{display:block}.ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action{float:right}.ant-list-bordered{border:1px solid #d9d9d9;border-radius:4px}.ant-list-bordered .ant-list-footer,.ant-list-bordered .ant-list-header,.ant-list-bordered .ant-list-item{padding-right:24px;padding-left:24px}.ant-list-bordered .ant-list-item{border-bottom:1px solid #e8e8e8}.ant-list-bordered .ant-list-pagination{margin:16px 24px}.ant-list-bordered.ant-list-sm .ant-list-item{padding-right:16px;padding-left:16px}.ant-list-bordered.ant-list-sm .ant-list-footer,.ant-list-bordered.ant-list-sm .ant-list-header{padding:8px 16px}.ant-list-bordered.ant-list-lg .ant-list-footer,.ant-list-bordered.ant-list-lg .ant-list-header{padding:16px 24px}@media screen and (max-width:768px){.ant-list-item-action,.ant-list-vertical .ant-list-item-extra{margin-left:24px}}@media screen and (max-width:576px){.ant-list-item{flex-wrap:wrap}.ant-list-item-action{margin-left:12px}.ant-list-vertical .ant-list-item{flex-wrap:wrap-reverse}.ant-list-vertical .ant-list-item-main{min-width:220px}.ant-list-vertical .ant-list-item-extra{margin:auto auto 16px}}.ant-spin{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:absolute;display:none;color:#1890ff;text-align:center;vertical-align:middle;opacity:0;-webkit-transition:-webkit-transform .3s cubic-bezier(.78,.14,.15,.86);transition:-webkit-transform .3s cubic-bezier(.78,.14,.15,.86);transition:transform .3s cubic-bezier(.78,.14,.15,.86);transition:transform .3s cubic-bezier(.78,.14,.15,.86),-webkit-transform .3s cubic-bezier(.78,.14,.15,.86)}.ant-spin-spinning{position:static;display:inline-block;opacity:1}.ant-spin-nested-loading{position:relative}.ant-spin-nested-loading>div>.ant-spin{position:absolute;top:0;left:0;z-index:4;display:block;width:100%;height:100%;max-height:400px}.ant-spin-nested-loading>div>.ant-spin .ant-spin-dot{position:absolute;top:50%;left:50%;margin:-10px}.ant-spin-nested-loading>div>.ant-spin .ant-spin-text{position:absolute;top:50%;width:100%;padding-top:5px;text-shadow:0 1px 2px #fff}.ant-spin-nested-loading>div>.ant-spin.ant-spin-show-text .ant-spin-dot{margin-top:-20px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-dot{margin:-7px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-text{padding-top:2px}.ant-spin-nested-loading>div>.ant-spin-sm.ant-spin-show-text .ant-spin-dot{margin-top:-17px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-dot{margin:-16px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-text{padding-top:11px}.ant-spin-nested-loading>div>.ant-spin-lg.ant-spin-show-text .ant-spin-dot{margin-top:-26px}.ant-spin-container{position:relative;-webkit-transition:opacity .3s;transition:opacity .3s}.ant-spin-container:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;display:none\9;width:100%;height:100%;background:#fff;opacity:0;-webkit-transition:all .3s;transition:all .3s;content:"";pointer-events:none}.ant-spin-blur{clear:both;overflow:hidden;opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.ant-spin-blur:after{opacity:.4;pointer-events:auto}.ant-spin-tip{color:rgba(0,0,0,.45)}.ant-spin-dot{position:relative;display:inline-block;font-size:20px;width:20px;height:20px}.ant-spin-dot-item{position:absolute;display:block;width:9px;height:9px;background-color:#1890ff;border-radius:100%;-webkit-transform:scale(.75);transform:scale(.75);-webkit-transform-origin:50% 50%;transform-origin:50% 50%;opacity:.3;-webkit-animation:antSpinMove 1s linear infinite alternate;animation:antSpinMove 1s linear infinite alternate}.ant-spin-dot-item:first-child{top:0;left:0}.ant-spin-dot-item:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.ant-spin-dot-item:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.ant-spin-dot-item:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}.ant-spin-dot-spin{-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-animation:antRotate 1.2s linear infinite;animation:antRotate 1.2s linear infinite}.ant-spin-sm .ant-spin-dot{font-size:14px;width:14px;height:14px}.ant-spin-sm .ant-spin-dot i{width:6px;height:6px}.ant-spin-lg .ant-spin-dot{font-size:32px;width:32px;height:32px}.ant-spin-lg .ant-spin-dot i{width:14px;height:14px}.ant-spin.ant-spin-show-text .ant-spin-text{display:block}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.ant-spin-blur{background:#fff;opacity:.5}}@-webkit-keyframes antSpinMove{to{opacity:1}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}.ant-pagination{box-sizing:border-box;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum"}.ant-pagination,.ant-pagination ol,.ant-pagination ul{margin:0;padding:0;list-style:none}.ant-pagination:after{display:block;clear:both;height:0;overflow:hidden;visibility:hidden;content:" "}.ant-pagination-item,.ant-pagination-total-text{display:inline-block;height:32px;margin-right:8px;line-height:30px;vertical-align:middle}.ant-pagination-item{min-width:32px;font-family:Arial;text-align:center;list-style:none;background-color:#fff;border:1px solid #d9d9d9;border-radius:4px;outline:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-item a{margin:0 6px;color:rgba(0,0,0,.65);-webkit-transition:none;transition:none}.ant-pagination-item:focus,.ant-pagination-item:hover{border-color:#1890ff;-webkit-transition:all .3s;transition:all .3s}.ant-pagination-item:focus a,.ant-pagination-item:hover a{color:#1890ff}.ant-pagination-item-active{font-weight:500;background:#fff;border-color:#1890ff}.ant-pagination-item-active a{color:#1890ff}.ant-pagination-item-active:focus,.ant-pagination-item-active:hover{border-color:#40a9ff}.ant-pagination-item-active:focus a,.ant-pagination-item-active:hover a{color:#40a9ff}.ant-pagination-jump-next,.ant-pagination-jump-prev{outline:0}.ant-pagination-jump-next .ant-pagination-item-container,.ant-pagination-jump-prev .ant-pagination-item-container{position:relative}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon{display:inline-block;font-size:12px;font-size:12px\9;-webkit-transform:scale(1) rotate(0deg);transform:scale(1) rotate(0deg);color:#1890ff;letter-spacing:-1px;opacity:0;-webkit-transition:all .2s;transition:all .2s}:root .ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon,:root .ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon{font-size:12px}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon-svg,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon-svg{top:0;right:0;bottom:0;left:0;margin:auto}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis{position:absolute;top:0;right:0;bottom:0;left:0;display:block;margin:auto;color:rgba(0,0,0,.25);letter-spacing:2px;text-align:center;text-indent:.13em;opacity:1;-webkit-transition:all .2s;transition:all .2s}.ant-pagination-jump-next:focus .ant-pagination-item-link-icon,.ant-pagination-jump-next:hover .ant-pagination-item-link-icon,.ant-pagination-jump-prev:focus .ant-pagination-item-link-icon,.ant-pagination-jump-prev:hover .ant-pagination-item-link-icon{opacity:1}.ant-pagination-jump-next:focus .ant-pagination-item-ellipsis,.ant-pagination-jump-next:hover .ant-pagination-item-ellipsis,.ant-pagination-jump-prev:focus .ant-pagination-item-ellipsis,.ant-pagination-jump-prev:hover .ant-pagination-item-ellipsis{opacity:0}.ant-pagination-jump-next,.ant-pagination-jump-prev,.ant-pagination-prev{margin-right:8px}.ant-pagination-jump-next,.ant-pagination-jump-prev,.ant-pagination-next,.ant-pagination-prev{display:inline-block;min-width:32px;height:32px;color:rgba(0,0,0,.65);font-family:Arial;line-height:32px;text-align:center;vertical-align:middle;list-style:none;border-radius:4px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-pagination-next,.ant-pagination-prev{outline:0}.ant-pagination-next a,.ant-pagination-prev a{color:rgba(0,0,0,.65);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-next:hover a,.ant-pagination-prev:hover a{border-color:#40a9ff}.ant-pagination-next .ant-pagination-item-link,.ant-pagination-prev .ant-pagination-item-link{display:block;height:100%;font-size:12px;text-align:center;background-color:#fff;border:1px solid #d9d9d9;border-radius:4px;outline:none;-webkit-transition:all .3s;transition:all .3s}.ant-pagination-next:focus .ant-pagination-item-link,.ant-pagination-next:hover .ant-pagination-item-link,.ant-pagination-prev:focus .ant-pagination-item-link,.ant-pagination-prev:hover .ant-pagination-item-link{color:#1890ff;border-color:#1890ff}.ant-pagination-disabled,.ant-pagination-disabled:focus,.ant-pagination-disabled:hover{cursor:not-allowed}.ant-pagination-disabled .ant-pagination-item-link,.ant-pagination-disabled:focus .ant-pagination-item-link,.ant-pagination-disabled:focus a,.ant-pagination-disabled:hover .ant-pagination-item-link,.ant-pagination-disabled:hover a,.ant-pagination-disabled a{color:rgba(0,0,0,.25);border-color:#d9d9d9;cursor:not-allowed}.ant-pagination-slash{margin:0 10px 0 5px}.ant-pagination-options{display:inline-block;margin-left:16px;vertical-align:middle}.ant-pagination-options-size-changer.ant-select{display:inline-block;width:auto;margin-right:8px}.ant-pagination-options-quick-jumper{display:inline-block;height:32px;line-height:32px;vertical-align:top}.ant-pagination-options-quick-jumper input{position:relative;display:inline-block;width:100%;height:32px;padding:4px 11px;color:rgba(0,0,0,.65);font-size:14px;line-height:1.5;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s;width:50px;margin:0 8px}.ant-pagination-options-quick-jumper input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{color:#bfbfbf}.ant-pagination-options-quick-jumper input::-webkit-input-placeholder{color:#bfbfbf}.ant-pagination-options-quick-jumper input:focus,.ant-pagination-options-quick-jumper input:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-pagination-options-quick-jumper input:focus{outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-pagination-options-quick-jumper input-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-pagination-options-quick-jumper input-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-pagination-options-quick-jumper input[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-pagination-options-quick-jumper input[disabled]:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-pagination-options-quick-jumper input{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s}.ant-pagination-options-quick-jumper input-lg{height:40px;padding:6px 11px;font-size:16px}.ant-pagination-options-quick-jumper input-sm{height:24px;padding:1px 7px}.ant-pagination-simple .ant-pagination-next,.ant-pagination-simple .ant-pagination-prev{height:24px;line-height:24px;vertical-align:top}.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link,.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link{height:24px;border:0}.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link:after,.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination-simple .ant-pagination-simple-pager{display:inline-block;height:24px;margin-right:8px}.ant-pagination-simple .ant-pagination-simple-pager input{box-sizing:border-box;height:100%;margin-right:8px;padding:0 6px;text-align:center;background-color:#fff;border:1px solid #d9d9d9;border-radius:4px;outline:none;-webkit-transition:border-color .3s;transition:border-color .3s}.ant-pagination-simple .ant-pagination-simple-pager input:hover{border-color:#1890ff}.ant-pagination.mini .ant-pagination-simple-pager,.ant-pagination.mini .ant-pagination-total-text{height:24px;line-height:24px}.ant-pagination.mini .ant-pagination-item{min-width:24px;height:24px;margin:0;line-height:22px}.ant-pagination.mini .ant-pagination-item:not(.ant-pagination-item-active){background:transparent;border-color:transparent}.ant-pagination.mini .ant-pagination-next,.ant-pagination.mini .ant-pagination-prev{min-width:24px;height:24px;margin:0;line-height:24px}.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link,.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link{background:transparent;border-color:transparent}.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link:after,.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination.mini .ant-pagination-jump-next,.ant-pagination.mini .ant-pagination-jump-prev{height:24px;margin-right:0;line-height:24px}.ant-pagination.mini .ant-pagination-options{margin-left:2px}.ant-pagination.mini .ant-pagination-options-quick-jumper{height:24px;line-height:24px}.ant-pagination.mini .ant-pagination-options-quick-jumper input{height:24px;padding:1px 7px;width:44px}@media only screen and (max-width:992px){.ant-pagination-item-after-jump-prev,.ant-pagination-item-before-jump-next{display:none}}@media only screen and (max-width:576px){.ant-pagination-options{display:none}}.ant-mention-wrapper{box-sizing:border-box;margin:0;font-size:14px;font-variant:tabular-nums;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block;vertical-align:middle}.ant-mention-wrapper,.ant-mention-wrapper .ant-mention-editor{padding:0;color:rgba(0,0,0,.65);line-height:1.5;position:relative;width:100%}.ant-mention-wrapper .ant-mention-editor{display:inline-block;height:32px;font-size:14px;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s;display:block;height:auto;min-height:32px}.ant-mention-wrapper .ant-mention-editor::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-mention-wrapper .ant-mention-editor:-ms-input-placeholder{color:#bfbfbf}.ant-mention-wrapper .ant-mention-editor::-webkit-input-placeholder{color:#bfbfbf}.ant-mention-wrapper .ant-mention-editor:focus,.ant-mention-wrapper .ant-mention-editor:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-mention-wrapper .ant-mention-editor:focus{outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-mention-wrapper .ant-mention-editor-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-mention-wrapper .ant-mention-editor-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-mention-wrapper .ant-mention-editor[disabled]{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-mention-wrapper .ant-mention-editor[disabled]:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-mention-wrapper .ant-mention-editor{max-width:100%;height:auto;min-height:32px;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s}.ant-mention-wrapper .ant-mention-editor-lg{height:40px;padding:6px 11px;font-size:16px}.ant-mention-wrapper .ant-mention-editor-sm{height:24px;padding:1px 7px}.ant-mention-wrapper .ant-mention-editor-wrapper{height:auto;overflow-y:auto}.ant-mention-wrapper.ant-mention-active:not(.disabled) .ant-mention-editor{border-color:#40a9ff;border-right-width:1px!important;outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-mention-wrapper.disabled .ant-mention-editor{color:rgba(0,0,0,.25);background-color:#f5f5f5;cursor:not-allowed;opacity:1}.ant-mention-wrapper.disabled .ant-mention-editor:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-mention-wrapper .public-DraftEditorPlaceholder-root{position:absolute;pointer-events:none}.ant-mention-wrapper .public-DraftEditorPlaceholder-root .public-DraftEditorPlaceholder-inner{height:auto;padding:5px 11px;color:#bfbfbf;white-space:pre-wrap;word-wrap:break-word;outline:none;opacity:1}.ant-mention-wrapper .DraftEditor-editorContainer .public-DraftEditor-content{height:auto;padding:5px 11px}.ant-mention-dropdown{box-sizing:border-box;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;min-width:120px;max-height:250px;margin:1.5em 0 0;overflow-x:hidden;overflow-y:auto;background-color:#fff;border-radius:4px;outline:none;box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-mention-dropdown-placement-top{margin-top:-.1em}.ant-mention-dropdown-notfound.ant-mention-dropdown-item{color:rgba(0,0,0,.25)}.ant-mention-dropdown-notfound.ant-mention-dropdown-item .anticon-loading{display:block;color:#1890ff;text-align:center}.ant-mention-dropdown-item{position:relative;display:block;padding:5px 12px;overflow:hidden;color:rgba(0,0,0,.65);font-weight:400;line-height:22px;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;-webkit-transition:background .3s;transition:background .3s}.ant-mention-dropdown-item-active,.ant-mention-dropdown-item.focus,.ant-mention-dropdown-item:hover{background-color:#e6f7ff}.ant-mention-dropdown-item-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-mention-dropdown-item-disabled:hover{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-mention-dropdown-item-selected,.ant-mention-dropdown-item-selected:hover{color:rgba(0,0,0,.65);font-weight:700;background-color:#f5f5f5}.ant-mention-dropdown-item-divider{height:1px;margin:1px 0;overflow:hidden;line-height:0;background-color:#e8e8e8}.ant-message{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:fixed;top:16px;left:0;z-index:1010;width:100%;pointer-events:none}.ant-message-notice{padding:8px;text-align:center}.ant-message-notice:first-child{margin-top:-8px}.ant-message-notice-content{display:inline-block;padding:10px 16px;background:#fff;border-radius:4px;box-shadow:0 4px 12px rgba(0,0,0,.15);pointer-events:all}.ant-message-success .anticon{color:#52c41a}.ant-message-error .anticon{color:#f5222d}.ant-message-warning .anticon{color:#faad14}.ant-message-info .anticon,.ant-message-loading .anticon{color:#1890ff}.ant-message .anticon{position:relative;top:1px;margin-right:8px;font-size:16px}.ant-message-notice.move-up-leave.move-up-leave-active{overflow:hidden;-webkit-animation-name:MessageMoveOut;animation-name:MessageMoveOut;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes MessageMoveOut{0%{max-height:150px;padding:8px;opacity:1}to{max-height:0;padding:0;opacity:0}}@keyframes MessageMoveOut{0%{max-height:150px;padding:8px;opacity:1}to{max-height:0;padding:0;opacity:0}}.ant-modal{box-sizing:border-box;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;top:100px;width:auto;margin:0 auto;padding:0 0 24px}.ant-modal-wrap{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;overflow:auto;outline:0;-webkit-overflow-scrolling:touch}.ant-modal-title{margin:0;color:rgba(0,0,0,.85);font-weight:500;font-size:16px;line-height:22px;word-wrap:break-word}.ant-modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:0;border-radius:4px;box-shadow:0 4px 12px rgba(0,0,0,.15)}.ant-modal-close{position:absolute;top:0;right:0;z-index:10;padding:0;color:rgba(0,0,0,.45);font-weight:700;line-height:1;text-decoration:none;background:transparent;border:0;outline:0;cursor:pointer;-webkit-transition:color .3s;transition:color .3s}.ant-modal-close-x{display:block;width:56px;height:56px;font-size:16px;font-style:normal;line-height:56px;text-align:center;text-transform:none;text-rendering:auto}.ant-modal-close:focus,.ant-modal-close:hover{color:rgba(0,0,0,.75);text-decoration:none}.ant-modal-header{padding:16px 24px;color:rgba(0,0,0,.65);background:#fff;border-bottom:1px solid #e8e8e8;border-radius:4px 4px 0 0}.ant-modal-body{padding:24px;font-size:14px;line-height:1.5;word-wrap:break-word}.ant-modal-footer{padding:10px 16px;text-align:right;background:transparent;border-top:1px solid #e8e8e8;border-radius:0 0 4px 4px}.ant-modal-footer button+button{margin-bottom:0;margin-left:8px}.ant-modal.zoom-appear,.ant-modal.zoom-enter{-webkit-transform:none;transform:none;opacity:0;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;height:100%;background-color:rgba(0,0,0,.65);filter:alpha(opacity=50)}.ant-modal-mask-hidden{display:none}.ant-modal-open{overflow:hidden}.ant-modal-centered{text-align:center}.ant-modal-centered:before{display:inline-block;width:0;height:100%;vertical-align:middle;content:""}.ant-modal-centered .ant-modal{top:0;display:inline-block;text-align:left;vertical-align:middle}@media (max-width:767px){.ant-modal{max-width:calc(100vw - 16px);margin:8px auto}.ant-modal-centered .ant-modal{flex:1 1}}.ant-modal-confirm .ant-modal-close,.ant-modal-confirm .ant-modal-header{display:none}.ant-modal-confirm .ant-modal-body{padding:32px 32px 24px}.ant-modal-confirm-body-wrapper{zoom:1}.ant-modal-confirm-body-wrapper:after,.ant-modal-confirm-body-wrapper:before{display:table;content:""}.ant-modal-confirm-body-wrapper:after{clear:both}.ant-modal-confirm-body .ant-modal-confirm-title{display:block;overflow:hidden;color:rgba(0,0,0,.85);font-weight:500;font-size:16px;line-height:1.4}.ant-modal-confirm-body .ant-modal-confirm-content{margin-top:8px;color:rgba(0,0,0,.65);font-size:14px}.ant-modal-confirm-body>.anticon{float:left;margin-right:16px;font-size:22px}.ant-modal-confirm-body>.anticon+.ant-modal-confirm-title+.ant-modal-confirm-content{margin-left:38px}.ant-modal-confirm .ant-modal-confirm-btns{float:right;margin-top:24px}.ant-modal-confirm .ant-modal-confirm-btns button+button{margin-bottom:0;margin-left:8px}.ant-modal-confirm-error .ant-modal-confirm-body>.anticon{color:#f5222d}.ant-modal-confirm-confirm .ant-modal-confirm-body>.anticon,.ant-modal-confirm-warning .ant-modal-confirm-body>.anticon{color:#faad14}.ant-modal-confirm-info .ant-modal-confirm-body>.anticon{color:#1890ff}.ant-modal-confirm-success .ant-modal-confirm-body>.anticon{color:#52c41a}.ant-notification{box-sizing:border-box;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:fixed;z-index:1010;width:384px;max-width:calc(100vw - 32px);margin:0 24px 0 0}.ant-notification-bottomLeft,.ant-notification-topLeft{margin-right:0;margin-left:24px}.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active{-webkit-animation-name:NotificationLeftFadeIn;animation-name:NotificationLeftFadeIn}.ant-notification-close-icon{font-size:14px;cursor:pointer}.ant-notification-notice{position:relative;margin-bottom:16px;padding:16px 24px;overflow:hidden;line-height:1.5;background:#fff;border-radius:4px;box-shadow:0 4px 12px rgba(0,0,0,.15)}.ant-notification-notice-message{display:inline-block;margin-bottom:8px;color:rgba(0,0,0,.85);font-size:16px;line-height:24px}.ant-notification-notice-message-single-line-auto-margin{display:block;width:calc(264px - 100%);max-width:4px;background-color:initial;pointer-events:none}.ant-notification-notice-message-single-line-auto-margin:before{display:block;content:""}.ant-notification-notice-description{font-size:14px}.ant-notification-notice-closable .ant-notification-notice-message{padding-right:24px}.ant-notification-notice-with-icon .ant-notification-notice-message{margin-bottom:4px;margin-left:48px;font-size:16px}.ant-notification-notice-with-icon .ant-notification-notice-description{margin-left:48px;font-size:14px}.anticon.ant-notification-notice-icon{position:absolute;margin-left:4px;font-size:24px;line-height:24px}.anticon.ant-notification-notice-icon-success{color:#52c41a}.anticon.ant-notification-notice-icon-info{color:#1890ff}.anticon.ant-notification-notice-icon-warning{color:#faad14}.anticon.ant-notification-notice-icon-error{color:#f5222d}.ant-notification-notice-close{position:absolute;top:16px;right:22px;color:rgba(0,0,0,.45);outline:none}.ant-notification-notice-close:hover{color:rgba(0,0,0,.67)}.ant-notification-notice-btn{float:right;margin-top:16px}.ant-notification .notification-fade-effect{-webkit-animation-duration:.24s;animation-duration:.24s;-webkit-animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-timing-function:cubic-bezier(.645,.045,.355,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-notification-fade-appear,.ant-notification-fade-enter{opacity:0;-webkit-animation-play-state:paused;animation-play-state:paused}.ant-notification-fade-appear,.ant-notification-fade-enter,.ant-notification-fade-leave{-webkit-animation-duration:.24s;animation-duration:.24s;-webkit-animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-timing-function:cubic-bezier(.645,.045,.355,1);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-notification-fade-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-play-state:paused;animation-play-state:paused}.ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-fade-enter.ant-notification-fade-enter-active{-webkit-animation-name:NotificationFadeIn;animation-name:NotificationFadeIn;-webkit-animation-play-state:running;animation-play-state:running}.ant-notification-fade-leave.ant-notification-fade-leave-active{-webkit-animation-name:NotificationFadeOut;animation-name:NotificationFadeOut;-webkit-animation-play-state:running;animation-play-state:running}@-webkit-keyframes NotificationFadeIn{0%{left:384px;opacity:0}to{left:0;opacity:1}}@keyframes NotificationFadeIn{0%{left:384px;opacity:0}to{left:0;opacity:1}}@-webkit-keyframes NotificationLeftFadeIn{0%{right:384px;opacity:0}to{right:0;opacity:1}}@keyframes NotificationLeftFadeIn{0%{right:384px;opacity:0}to{right:0;opacity:1}}@-webkit-keyframes NotificationFadeOut{0%{max-height:150px;margin-bottom:16px;padding-top:16px 24px;padding-bottom:16px 24px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}@keyframes NotificationFadeOut{0%{max-height:150px;margin-bottom:16px;padding-top:16px 24px;padding-bottom:16px 24px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}.ant-page-header{box-sizing:border-box;margin:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;padding:16px 24px;background:#fff}.ant-page-header.ant-page-header-has-footer{padding-bottom:0}.ant-page-header-back{display:inline-block;padding:4px 0;font-size:16px;line-height:100%;cursor:pointer}.ant-page-header-back-button{color:#1890ff;text-decoration:none;outline:none;cursor:pointer;-webkit-transition:color .3s;transition:color .3s;color:rgba(0,0,0,.65)}.ant-page-header-back-button:focus,.ant-page-header-back-button:hover{color:#40a9ff}.ant-page-header-back-button:active{color:#096dd9}.ant-page-header .ant-divider{height:14px;margin:0 12px}.ant-page-header .ant-breadcrumb{margin-bottom:12px}.ant-page-header-title-view{display:inline-block}.ant-page-header-title-view-title{display:inline-block;padding-right:12px;color:rgba(0,0,0,.85);font-weight:700;font-size:16px;line-height:1.4}.ant-page-header-title-view-sub-title{display:inline-block;padding-right:12px;color:rgba(0,0,0,.45);font-size:14px;line-height:1.8}.ant-page-header-title-view-tags{display:inline-block;vertical-align:top}.ant-page-header-title-view-extra{position:absolute;top:16px;right:24px}.ant-page-header-title-view-extra>*{margin-right:8px}.ant-page-header-title-view-extra>:last-child{margin-right:0}.ant-page-header-content-view{padding-top:12px}.ant-page-header-footer{margin:0 -8px;padding-top:24px}.ant-page-header-footer .ant-tabs-bar{margin-bottom:1px;border-bottom:0}.ant-page-header-footer .ant-tabs-bar .ant-tabs-nav .ant-tabs-tab{padding:0 8px 12px}.ant-popover{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:absolute;top:0;left:0;z-index:1030;font-weight:400;white-space:normal;text-align:left;cursor:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ant-popover:after{position:absolute;background:hsla(0,0%,100%,.01);content:""}.ant-popover-hidden{display:none}.ant-popover-placement-top,.ant-popover-placement-topLeft,.ant-popover-placement-topRight{padding-bottom:10px}.ant-popover-placement-right,.ant-popover-placement-rightBottom,.ant-popover-placement-rightTop{padding-left:10px}.ant-popover-placement-bottom,.ant-popover-placement-bottomLeft,.ant-popover-placement-bottomRight{padding-top:10px}.ant-popover-placement-left,.ant-popover-placement-leftBottom,.ant-popover-placement-leftTop{padding-right:10px}.ant-popover-inner{background-color:#fff;background-clip:padding-box;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 0 8px rgba(0,0,0,.15)\9}@media (-ms-high-contrast:none),screen and (-ms-high-contrast:active){.ant-popover-inner{box-shadow:0 2px 8px rgba(0,0,0,.15)}}.ant-popover-title{min-width:177px;min-height:32px;margin:0;padding:5px 16px 4px;color:rgba(0,0,0,.85);font-weight:500;border-bottom:1px solid #e8e8e8}.ant-popover-inner-content{padding:12px 16px;color:rgba(0,0,0,.65)}.ant-popover-message{position:relative;padding:4px 0 12px;color:rgba(0,0,0,.65);font-size:14px}.ant-popover-message>.anticon{position:absolute;top:8px;color:#faad14;font-size:14px}.ant-popover-message-title{padding-left:22px}.ant-popover-buttons{margin-bottom:4px;text-align:right}.ant-popover-buttons button{margin-left:8px}.ant-popover-arrow{position:absolute;display:block;width:8.48528137px;height:8.48528137px;background:transparent;border-style:solid;border-width:4.24264069px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ant-popover-placement-top>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-topLeft>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-topRight>.ant-popover-content>.ant-popover-arrow{bottom:6.2px;border-color:transparent #fff #fff transparent;box-shadow:3px 3px 7px rgba(0,0,0,.07)}.ant-popover-placement-top>.ant-popover-content>.ant-popover-arrow{left:50%;-webkit-transform:translateX(-50%) rotate(45deg);transform:translateX(-50%) rotate(45deg)}.ant-popover-placement-topLeft>.ant-popover-content>.ant-popover-arrow{left:16px}.ant-popover-placement-topRight>.ant-popover-content>.ant-popover-arrow{right:16px}.ant-popover-placement-right>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-rightBottom>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-rightTop>.ant-popover-content>.ant-popover-arrow{left:6px;border-color:transparent transparent #fff #fff;box-shadow:-3px 3px 7px rgba(0,0,0,.07)}.ant-popover-placement-right>.ant-popover-content>.ant-popover-arrow{top:50%;-webkit-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg)}.ant-popover-placement-rightTop>.ant-popover-content>.ant-popover-arrow{top:12px}.ant-popover-placement-rightBottom>.ant-popover-content>.ant-popover-arrow{bottom:12px}.ant-popover-placement-bottom>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-bottomLeft>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-bottomRight>.ant-popover-content>.ant-popover-arrow{top:6px;border-color:#fff transparent transparent #fff;box-shadow:-2px -2px 5px rgba(0,0,0,.06)}.ant-popover-placement-bottom>.ant-popover-content>.ant-popover-arrow{left:50%;-webkit-transform:translateX(-50%) rotate(45deg);transform:translateX(-50%) rotate(45deg)}.ant-popover-placement-bottomLeft>.ant-popover-content>.ant-popover-arrow{left:16px}.ant-popover-placement-bottomRight>.ant-popover-content>.ant-popover-arrow{right:16px}.ant-popover-placement-left>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-leftBottom>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-leftTop>.ant-popover-content>.ant-popover-arrow{right:6px;border-color:#fff #fff transparent transparent;box-shadow:3px -3px 7px rgba(0,0,0,.07)}.ant-popover-placement-left>.ant-popover-content>.ant-popover-arrow{top:50%;-webkit-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg)}.ant-popover-placement-leftTop>.ant-popover-content>.ant-popover-arrow{top:12px}.ant-popover-placement-leftBottom>.ant-popover-content>.ant-popover-arrow{bottom:12px}.ant-progress{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block}.ant-progress-line{position:relative;width:100%;font-size:14px}.ant-progress-small.ant-progress-line,.ant-progress-small.ant-progress-line .ant-progress-text .anticon{font-size:12px}.ant-progress-outer{display:inline-block;width:100%;margin-right:0;padding-right:0}.ant-progress-show-info .ant-progress-outer{margin-right:calc(-2em - 8px);padding-right:calc(2em + 8px)}.ant-progress-inner{position:relative;display:inline-block;width:100%;vertical-align:middle;background-color:#f5f5f5;border-radius:100px}.ant-progress-circle-trail{stroke:#f5f5f5}.ant-progress-circle-path{-webkit-animation:ant-progress-appear .3s;animation:ant-progress-appear .3s;stroke:#1890ff}.ant-progress-bg,.ant-progress-success-bg{position:relative;background-color:#1890ff;-webkit-transition:all .4s cubic-bezier(.08,.82,.17,1) 0s;transition:all .4s cubic-bezier(.08,.82,.17,1) 0s}.ant-progress-success-bg{position:absolute;top:0;left:0;background-color:#52c41a}.ant-progress-text{display:inline-block;width:2em;margin-left:8px;color:rgba(0,0,0,.45);font-size:1em;line-height:1;white-space:nowrap;text-align:left;vertical-align:middle;word-break:normal}.ant-progress-text .anticon{font-size:14px}.ant-progress-status-active .ant-progress-bg:before{position:absolute;top:0;right:0;bottom:0;left:0;background:#fff;border-radius:10px;opacity:0;-webkit-animation:ant-progress-active 2.4s cubic-bezier(.23,1,.32,1) infinite;animation:ant-progress-active 2.4s cubic-bezier(.23,1,.32,1) infinite;content:""}.ant-progress-status-exception .ant-progress-bg{background-color:#f5222d}.ant-progress-status-exception .ant-progress-text{color:#f5222d}.ant-progress-status-exception .ant-progress-circle-path{stroke:#f5222d}.ant-progress-status-success .ant-progress-bg{background-color:#52c41a}.ant-progress-status-success .ant-progress-text{color:#52c41a}.ant-progress-status-success .ant-progress-circle-path{stroke:#52c41a}.ant-progress-circle .ant-progress-inner{position:relative;line-height:1;background-color:initial}.ant-progress-circle .ant-progress-text{position:absolute;top:50%;left:50%;width:100%;margin:0;padding:0;color:rgba(0,0,0,.65);line-height:1;white-space:normal;text-align:center;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ant-progress-circle .ant-progress-text .anticon{font-size:1.16666667em}.ant-progress-circle.ant-progress-status-exception .ant-progress-text{color:#f5222d}.ant-progress-circle.ant-progress-status-success .ant-progress-text{color:#52c41a}@-webkit-keyframes ant-progress-active{0%{width:0;opacity:.1}20%{width:0;opacity:.5}to{width:100%;opacity:0}}@keyframes ant-progress-active{0%{width:0;opacity:.1}20%{width:0;opacity:.5}to{width:100%;opacity:0}}.ant-rate{box-sizing:border-box;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block;margin:0;padding:0;color:#fadb14;font-size:20px;line-height:unset;list-style:none;outline:none}.ant-rate-disabled .ant-rate-star{cursor:default}.ant-rate-disabled .ant-rate-star:hover{-webkit-transform:scale(1);transform:scale(1)}.ant-rate-star{position:relative;display:inline-block;margin:0 8px 0 0;padding:0;color:inherit;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-rate-star>div:focus{outline:0}.ant-rate-star>div:focus,.ant-rate-star>div:hover{-webkit-transform:scale(1.1);transform:scale(1.1)}.ant-rate-star-first,.ant-rate-star-second{color:#e8e8e8;-webkit-transition:all .3s;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-rate-star-first .anticon,.ant-rate-star-second .anticon{vertical-align:middle}.ant-rate-star-first{position:absolute;top:0;left:0;width:50%;height:100%;overflow:hidden;opacity:0}.ant-rate-star-half .ant-rate-star-first,.ant-rate-star-half .ant-rate-star-second{opacity:1}.ant-rate-star-full .ant-rate-star-second,.ant-rate-star-half .ant-rate-star-first{color:inherit}.ant-rate-text{display:inline-block;margin-left:8px;font-size:14px}.ant-skeleton{display:table;width:100%}.ant-skeleton-header{display:table-cell;padding-right:16px;vertical-align:top}.ant-skeleton-header .ant-skeleton-avatar{display:inline-block;vertical-align:top;background:#f2f2f2;width:32px;height:32px;line-height:32px}.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-lg{width:40px;height:40px;line-height:40px}.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-sm{width:24px;height:24px;line-height:24px}.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-content{display:table-cell;width:100%;vertical-align:top}.ant-skeleton-content .ant-skeleton-title{width:100%;height:16px;margin-top:16px;background:#f2f2f2}.ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:24px}.ant-skeleton-content .ant-skeleton-paragraph{padding:0}.ant-skeleton-content .ant-skeleton-paragraph>li{width:100%;height:16px;list-style:none;background:#f2f2f2}.ant-skeleton-content .ant-skeleton-paragraph>li:last-child:not(:first-child):not(:nth-child(2)){width:61%}.ant-skeleton-content .ant-skeleton-paragraph>li+li{margin-top:16px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title{margin-top:12px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:28px}.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar,.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph>li,.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#f2f2f2),color-stop(37%,#e6e6e6),color-stop(63%,#f2f2f2));background:-webkit-linear-gradient(left,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);background:linear-gradient(90deg,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);background-size:400% 100%;-webkit-animation:ant-skeleton-loading 1.4s ease infinite;animation:ant-skeleton-loading 1.4s ease infinite}@-webkit-keyframes ant-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}@keyframes ant-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}.ant-slider{box-sizing:border-box;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;height:12px;margin:14px 6px 10px;padding:4px 0;cursor:pointer;touch-action:none}.ant-slider-vertical{width:12px;height:100%;margin:6px 10px;padding:0 4px}.ant-slider-vertical .ant-slider-rail{width:4px;height:100%}.ant-slider-vertical .ant-slider-track{width:4px}.ant-slider-vertical .ant-slider-handle{margin-bottom:-7px;margin-left:-5px}.ant-slider-vertical .ant-slider-mark{top:0;left:12px;width:18px;height:100%}.ant-slider-vertical .ant-slider-mark-text{left:4px;white-space:nowrap}.ant-slider-vertical .ant-slider-step{width:4px;height:100%}.ant-slider-vertical .ant-slider-dot{top:auto;left:2px;margin-bottom:-4px}.ant-slider-with-marks{margin-bottom:28px}.ant-slider-rail{position:absolute;width:100%;height:4px;background-color:#f5f5f5;border-radius:2px;-webkit-transition:background-color .3s;transition:background-color .3s}.ant-slider-track{position:absolute;height:4px;background-color:#91d5ff;border-radius:4px;-webkit-transition:background-color .3s ease;transition:background-color .3s ease}.ant-slider-handle{position:absolute;width:14px;height:14px;margin-top:-5px;margin-left:-7px;background-color:#fff;border:2px solid #91d5ff;border-radius:50%;box-shadow:0;cursor:pointer;-webkit-transition:border-color .3s,-webkit-box-shadow .6s,-webkit-transform .3s cubic-bezier(.18,.89,.32,1.28);-webkit-transition:border-color .3s,box-shadow .6s,-webkit-transform .3s cubic-bezier(.18,.89,.32,1.28);transition:border-color .3s,box-shadow .6s,-webkit-transform .3s cubic-bezier(.18,.89,.32,1.28);transition:border-color .3s,box-shadow .6s,transform .3s cubic-bezier(.18,.89,.32,1.28);transition:border-color .3s,box-shadow .6s,transform .3s cubic-bezier(.18,.89,.32,1.28),-webkit-transform .3s cubic-bezier(.18,.89,.32,1.28)}.ant-slider-handle:focus{border-color:#46a6ff;outline:none;box-shadow:0 0 0 5px rgba(24,144,255,.2)}.ant-slider-handle.ant-tooltip-open{border-color:#1890ff}.ant-slider:hover .ant-slider-rail{background-color:#e1e1e1}.ant-slider:hover .ant-slider-track{background-color:#69c0ff}.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open){border-color:#69c0ff}.ant-slider-mark{position:absolute;top:14px;left:0;width:100%;font-size:14px}.ant-slider-mark-text{position:absolute;display:inline-block;color:rgba(0,0,0,.45);text-align:center;word-break:keep-all;cursor:pointer}.ant-slider-mark-text-active{color:rgba(0,0,0,.65)}.ant-slider-step{position:absolute;width:100%;height:4px;background:transparent}.ant-slider-dot{position:absolute;top:-2px;width:8px;height:8px;background-color:#fff;border:2px solid #e8e8e8;border-radius:50%;cursor:pointer}.ant-slider-dot,.ant-slider-dot:first-child,.ant-slider-dot:last-child{margin-left:-4px}.ant-slider-dot-active{border-color:#8cc8ff}.ant-slider-disabled{cursor:not-allowed}.ant-slider-disabled .ant-slider-track{background-color:rgba(0,0,0,.25)!important}.ant-slider-disabled .ant-slider-dot,.ant-slider-disabled .ant-slider-handle{background-color:#fff;border-color:rgba(0,0,0,.25)!important;box-shadow:none;cursor:not-allowed}.ant-slider-disabled .ant-slider-dot,.ant-slider-disabled .ant-slider-mark-text{cursor:not-allowed!important}.ant-statistic{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum"}.ant-statistic-title{margin-bottom:4px;font-size:14px}.ant-statistic-content{font-size:24px;font-family:Tahoma,Helvetica Neue,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.ant-statistic-content-value-decimal{font-size:16px}.ant-statistic-content-prefix,.ant-statistic-content-suffix{display:inline-block}.ant-statistic-content-prefix{margin-right:4px}.ant-statistic-content-suffix{margin-left:4px;font-size:16px}.ant-steps{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:flex;width:100%;font-size:0}.ant-steps-item{position:relative;display:inline-block;flex:1 1;overflow:hidden;vertical-align:top}.ant-steps-item:last-child{flex:none}.ant-steps-item:last-child>.ant-steps-item-content>.ant-steps-item-title:after,.ant-steps-item:last-child>.ant-steps-item-tail{display:none}.ant-steps-item-content,.ant-steps-item-icon{display:inline-block;vertical-align:top}.ant-steps-item-icon{width:32px;height:32px;margin-right:8px;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;line-height:32px;text-align:center;border:1px solid rgba(0,0,0,.25);border-radius:32px;-webkit-transition:background-color .3s,border-color .3s;transition:background-color .3s,border-color .3s}.ant-steps-item-icon>.ant-steps-icon{position:relative;top:-1px;color:#1890ff;line-height:1}.ant-steps-item-tail{position:absolute;top:12px;left:0;width:100%;padding:0 10px}.ant-steps-item-tail:after{display:inline-block;width:100%;height:1px;background:#e8e8e8;border-radius:1px;-webkit-transition:background .3s;transition:background .3s;content:""}.ant-steps-item-title{position:relative;display:inline-block;padding-right:16px;color:rgba(0,0,0,.65);font-size:16px;line-height:32px}.ant-steps-item-title:after{position:absolute;top:16px;left:100%;display:block;width:9999px;height:1px;background:#e8e8e8;content:""}.ant-steps-item-description{color:rgba(0,0,0,.45);font-size:14px}.ant-steps-item-wait .ant-steps-item-icon{background-color:#fff;border-color:rgba(0,0,0,.25)}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon{color:rgba(0,0,0,.25)}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:rgba(0,0,0,.25)}.ant-steps-item-wait>.ant-steps-item-content>.ant-steps-item-title{color:rgba(0,0,0,.45)}.ant-steps-item-wait>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#e8e8e8}.ant-steps-item-wait>.ant-steps-item-content>.ant-steps-item-description{color:rgba(0,0,0,.45)}.ant-steps-item-wait>.ant-steps-item-tail:after{background-color:#e8e8e8}.ant-steps-item-process .ant-steps-item-icon{background-color:#fff;border-color:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#1890ff}.ant-steps-item-process>.ant-steps-item-content>.ant-steps-item-title{color:rgba(0,0,0,.85)}.ant-steps-item-process>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#e8e8e8}.ant-steps-item-process>.ant-steps-item-content>.ant-steps-item-description{color:rgba(0,0,0,.65)}.ant-steps-item-process>.ant-steps-item-tail:after{background-color:#e8e8e8}.ant-steps-item-process .ant-steps-item-icon{background:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#fff}.ant-steps-item-process .ant-steps-item-title{font-weight:500}.ant-steps-item-finish .ant-steps-item-icon{background-color:#fff;border-color:#1890ff}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#1890ff}.ant-steps-item-finish>.ant-steps-item-content>.ant-steps-item-title{color:rgba(0,0,0,.65)}.ant-steps-item-finish>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#1890ff}.ant-steps-item-finish>.ant-steps-item-content>.ant-steps-item-description{color:rgba(0,0,0,.45)}.ant-steps-item-finish>.ant-steps-item-tail:after{background-color:#1890ff}.ant-steps-item-error .ant-steps-item-icon{background-color:#fff;border-color:#f5222d}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon{color:#f5222d}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#f5222d}.ant-steps-item-error>.ant-steps-item-content>.ant-steps-item-title{color:#f5222d}.ant-steps-item-error>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#e8e8e8}.ant-steps-item-error>.ant-steps-item-content>.ant-steps-item-description{color:#f5222d}.ant-steps-item-error>.ant-steps-item-tail:after{background-color:#e8e8e8}.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after{background:#f5222d}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{margin-right:16px;white-space:nowrap}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child{margin-right:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title{padding-right:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail{display:none}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description{max-width:140px;white-space:normal}.ant-steps-item-custom .ant-steps-item-icon{height:auto;background:none;border:0}.ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{top:0;left:.5px;width:32px;height:32px;font-size:24px;line-height:32px}.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps:not(.ant-steps-vertical) .ant-steps-item-custom .ant-steps-item-icon{width:auto}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{margin-right:12px}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child{margin-right:0}.ant-steps-small .ant-steps-item-icon{width:24px;height:24px;font-size:12px;line-height:24px;text-align:center;border-radius:24px}.ant-steps-small .ant-steps-item-title{padding-right:12px;font-size:14px;line-height:24px}.ant-steps-small .ant-steps-item-title:after{top:12px}.ant-steps-small .ant-steps-item-description{color:rgba(0,0,0,.45);font-size:14px}.ant-steps-small .ant-steps-item-tail{top:8px;padding:0 8px}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon{width:inherit;height:inherit;line-height:inherit;background:none;border:0;border-radius:0}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{font-size:24px;line-height:24px;-webkit-transform:none;transform:none}.ant-steps-vertical{display:block}.ant-steps-vertical .ant-steps-item{display:block;overflow:visible}.ant-steps-vertical .ant-steps-item-icon{float:left;margin-right:16px}.ant-steps-vertical .ant-steps-item-content{display:block;min-height:48px;overflow:hidden}.ant-steps-vertical .ant-steps-item-title{line-height:32px}.ant-steps-vertical .ant-steps-item-description{padding-bottom:12px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-tail{position:absolute;top:0;left:16px;width:1px;height:100%;padding:38px 0 6px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-tail:after{width:1px;height:100%}.ant-steps-vertical>.ant-steps-item:not(:last-child)>.ant-steps-item-tail{display:block}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-content>.ant-steps-item-title:after{display:none}.ant-steps-vertical.ant-steps-small .ant-steps-item-tail{position:absolute;top:0;left:12px;padding:30px 0 6px}.ant-steps-vertical.ant-steps-small .ant-steps-item-title{line-height:24px}@media (max-width:480px){.ant-steps-horizontal.ant-steps-label-horizontal{display:block}.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item{display:block;overflow:visible}.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-icon{float:left;margin-right:16px}.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-content{display:block;min-height:48px;overflow:hidden}.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-title{line-height:32px}.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-description{padding-bottom:12px}.ant-steps-horizontal.ant-steps-label-horizontal>.ant-steps-item>.ant-steps-item-tail{position:absolute;top:0;left:16px;width:1px;height:100%;padding:38px 0 6px}.ant-steps-horizontal.ant-steps-label-horizontal>.ant-steps-item>.ant-steps-item-tail:after{width:1px;height:100%}.ant-steps-horizontal.ant-steps-label-horizontal>.ant-steps-item:not(:last-child)>.ant-steps-item-tail{display:block}.ant-steps-horizontal.ant-steps-label-horizontal>.ant-steps-item>.ant-steps-item-content>.ant-steps-item-title:after{display:none}.ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-tail{position:absolute;top:0;left:12px;padding:30px 0 6px}.ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-title{line-height:24px}}.ant-steps-label-vertical .ant-steps-item{overflow:visible}.ant-steps-label-vertical .ant-steps-item-tail{margin-left:51px;padding:3.5px 24px}.ant-steps-label-vertical .ant-steps-item-content{display:block;width:104px;margin-top:8px;text-align:center}.ant-steps-label-vertical .ant-steps-item-icon{display:inline-block;margin-left:36px}.ant-steps-label-vertical .ant-steps-item-title{padding-right:0}.ant-steps-label-vertical .ant-steps-item-title:after{display:none}.ant-steps-label-vertical.ant-steps-small:not(.ant-steps-dot) .ant-steps-item-icon{margin-left:40px}.ant-steps-dot .ant-steps-item-title{line-height:1.5}.ant-steps-dot .ant-steps-item-tail{top:2px;width:100%;margin:0 0 0 70px;padding:0}.ant-steps-dot .ant-steps-item-tail:after{width:calc(100% - 20px);height:3px;margin-left:12px}.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{left:2px}.ant-steps-dot .ant-steps-item-icon{width:8px;height:8px;margin-left:67px;padding-right:0;line-height:8px;background:transparent;border:0}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot{position:relative;float:left;width:100%;height:100%;border-radius:100px;-webkit-transition:all .3s;transition:all .3s}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after{position:absolute;top:-12px;left:-26px;width:60px;height:32px;background:rgba(0,0,0,.001);content:""}.ant-steps-dot .ant-steps-item-content{width:140px}.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon{width:10px;height:10px;line-height:10px}.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon .ant-steps-icon-dot{top:-1px}.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon{margin-top:8px;margin-left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-tail{top:2px;left:-9px;margin:0;padding:22px 0 4px}.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot{left:-2px}.ant-steps-flex-not-supported.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item{margin-left:-16px;padding-left:16px;background:#fff}.ant-steps-flex-not-supported.ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item{margin-left:-12px;padding-left:12px}.ant-steps-flex-not-supported.ant-steps-dot .ant-steps-item:last-child{overflow:hidden}.ant-steps-flex-not-supported.ant-steps-dot .ant-steps-item:last-child .ant-steps-icon-dot:after{right:-200px;width:200px}.ant-steps-flex-not-supported.ant-steps-dot .ant-steps-item .ant-steps-icon-dot:after,.ant-steps-flex-not-supported.ant-steps-dot .ant-steps-item .ant-steps-icon-dot:before{position:absolute;top:0;left:-10px;width:10px;height:8px;background:#fff;content:""}.ant-steps-flex-not-supported.ant-steps-dot .ant-steps-item .ant-steps-icon-dot:after{right:-10px;left:auto}.ant-steps-flex-not-supported.ant-steps-dot .ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#ccc}.ant-switch{margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;display:inline-block;box-sizing:border-box;min-width:44px;height:22px;line-height:20px;vertical-align:middle;background-color:rgba(0,0,0,.25);border:1px solid transparent;border-radius:100px;cursor:pointer;-webkit-transition:all .36s;transition:all .36s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-switch-inner{display:block;margin-right:6px;margin-left:24px;color:#fff;font-size:12px}.ant-switch-loading-icon,.ant-switch:after{position:absolute;top:1px;left:1px;width:18px;height:18px;background-color:#fff;border-radius:18px;cursor:pointer;-webkit-transition:all .36s cubic-bezier(.78,.14,.15,.86);transition:all .36s cubic-bezier(.78,.14,.15,.86);content:" "}.ant-switch:after{box-shadow:0 2px 4px 0 rgba(0,35,11,.2)}.ant-switch:not(.ant-switch-disabled):active:after,.ant-switch:not(.ant-switch-disabled):active:before{width:24px}.ant-switch-loading-icon{z-index:1;display:none;font-size:12px;background:transparent}.ant-switch-loading-icon svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.ant-switch-loading .ant-switch-loading-icon{display:inline-block;color:rgba(0,0,0,.65)}.ant-switch-checked.ant-switch-loading .ant-switch-loading-icon{color:#1890ff}.ant-switch:focus{outline:0;box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-switch:focus:hover{box-shadow:none}.ant-switch-small{min-width:28px;height:16px;line-height:14px}.ant-switch-small .ant-switch-inner{margin-right:3px;margin-left:18px;font-size:12px}.ant-switch-small:after{width:12px;height:12px}.ant-switch-small:active:after,.ant-switch-small:active:before{width:16px}.ant-switch-small .ant-switch-loading-icon{width:12px;height:12px}.ant-switch-small.ant-switch-checked .ant-switch-inner{margin-right:18px;margin-left:3px}.ant-switch-small.ant-switch-checked .ant-switch-loading-icon{left:100%;margin-left:-13px}.ant-switch-small.ant-switch-loading .ant-switch-loading-icon{font-weight:700;-webkit-transform:scale(.66667);transform:scale(.66667)}.ant-switch-checked{background-color:#1890ff}.ant-switch-checked .ant-switch-inner{margin-right:24px;margin-left:6px}.ant-switch-checked:after{left:100%;margin-left:-1px;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.ant-switch-checked .ant-switch-loading-icon{left:100%;margin-left:-19px}.ant-switch-disabled,.ant-switch-loading{cursor:not-allowed;opacity:.4}.ant-switch-disabled *,.ant-switch-disabled:after,.ant-switch-disabled:before,.ant-switch-loading *,.ant-switch-loading:after,.ant-switch-loading:before{cursor:not-allowed}@-webkit-keyframes AntSwitchSmallLoadingCircle{0%{-webkit-transform:rotate(0deg) scale(.66667);transform:rotate(0deg) scale(.66667);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}to{-webkit-transform:rotate(1turn) scale(.66667);transform:rotate(1turn) scale(.66667);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}}@keyframes AntSwitchSmallLoadingCircle{0%{-webkit-transform:rotate(0deg) scale(.66667);transform:rotate(0deg) scale(.66667);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}to{-webkit-transform:rotate(1turn) scale(.66667);transform:rotate(1turn) scale(.66667);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}}.ant-table-wrapper{zoom:1}.ant-table-wrapper:after,.ant-table-wrapper:before{display:table;content:""}.ant-table-wrapper:after{clear:both}.ant-table{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;clear:both}.ant-table-body{-webkit-transition:opacity .3s;transition:opacity .3s}.ant-table-empty .ant-table-body{overflow:auto!important}.ant-table table{width:100%;text-align:left;border-radius:4px 4px 0 0;border-collapse:collapse}.ant-table-thead>tr{background:#fafafa}.ant-table-thead>tr>th{color:rgba(0,0,0,.85);font-weight:500;text-align:left;background:transparent;border-bottom:1px solid #e8e8e8;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-table-thead>tr>th[colspan]{text-align:center}.ant-table-thead>tr>th .ant-table-filter-icon,.ant-table-thead>tr>th .anticon-filter{position:absolute;top:0;right:0;width:28px;height:100%;color:#bfbfbf;font-size:12px;text-align:center;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-table-thead>tr>th .ant-table-filter-icon>svg,.ant-table-thead>tr>th .anticon-filter>svg{position:absolute;top:50%;left:50%;margin-top:-5px;margin-left:-6px}.ant-table-thead>tr>th .ant-table-filter-selected.anticon-filter{color:#1890ff}.ant-table-thead>tr>th .ant-table-column-sorter{display:table-cell;vertical-align:middle}.ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner{height:1em;margin-top:.35em;margin-left:.57142857em;color:#bfbfbf;line-height:1em;text-align:center;-webkit-transition:all .3s;transition:all .3s}.ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner .ant-table-column-sorter-down,.ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner .ant-table-column-sorter-up{display:inline-block;font-size:12px;font-size:11px\9;-webkit-transform:scale(.91666667) rotate(0deg);transform:scale(.91666667) rotate(0deg);display:block;height:1em;line-height:1em;-webkit-transition:all .3s;transition:all .3s}:root .ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner .ant-table-column-sorter-down,:root .ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner .ant-table-column-sorter-up{font-size:12px}.ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner .ant-table-column-sorter-down.on,.ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner .ant-table-column-sorter-up.on{color:#1890ff}.ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner-full{margin-top:-.15em}.ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner-full .ant-table-column-sorter-down,.ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner-full .ant-table-column-sorter-up{height:.5em;line-height:.5em}.ant-table-thead>tr>th .ant-table-column-sorter .ant-table-column-sorter-inner-full .ant-table-column-sorter-down{margin-top:.125em}.ant-table-thead>tr>th.ant-table-column-has-actions{position:relative;background-clip:padding-box}.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-filters{padding-right:30px!important}.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-filters .ant-table-filter-icon.ant-table-filter-open,.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-filters .anticon-filter.ant-table-filter-open,.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-filters:hover .ant-table-filter-icon:hover,.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-filters:hover .anticon-filter:hover{color:rgba(0,0,0,.45);background:#e5e5e5}.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-filters:hover .ant-table-filter-icon:active,.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-filters:hover .anticon-filter:active{color:rgba(0,0,0,.65)}.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-sorters{cursor:pointer}.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-sorters:hover,.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-sorters:hover .ant-table-filter-icon,.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-sorters:hover .anticon-filter{background:#f2f2f2}.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-sorters:active .ant-table-column-sorter-down:not(.on),.ant-table-thead>tr>th.ant-table-column-has-actions.ant-table-column-has-sorters:active .ant-table-column-sorter-up:not(.on){color:rgba(0,0,0,.45)}.ant-table-thead>tr>th .ant-table-header-column{display:inline-block;vertical-align:top}.ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters{display:table}.ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>.ant-table-column-title{display:table-cell;vertical-align:middle}.ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>:not(.ant-table-column-sorter){position:relative}.ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters:before{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;-webkit-transition:all .3s;transition:all .3s;content:""}.ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters:hover:before{background:rgba(0,0,0,.04)}.ant-table-thead>tr>th.ant-table-column-has-sorters{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-table-thead>tr:first-child>th:first-child{border-top-left-radius:4px}.ant-table-thead>tr:first-child>th:last-child{border-top-right-radius:4px}.ant-table-thead>tr:not(:last-child)>th[colspan]{border-bottom:0}.ant-table-tbody>tr>td{border-bottom:1px solid #e8e8e8;-webkit-transition:all .3s,border 0s;transition:all .3s,border 0s}.ant-table-tbody>tr,.ant-table-thead>tr{-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s}.ant-table-tbody>tr.ant-table-row-hover:not(.ant-table-expanded-row)>td,.ant-table-tbody>tr:hover:not(.ant-table-expanded-row)>td,.ant-table-thead>tr.ant-table-row-hover:not(.ant-table-expanded-row)>td,.ant-table-thead>tr:hover:not(.ant-table-expanded-row)>td{background:#e6f7ff}.ant-table-footer{position:relative;padding:16px;background:#fafafa;border-top:1px solid #e8e8e8;border-radius:0 0 4px 4px}.ant-table-footer:before{position:absolute;top:-1px;left:0;width:100%;height:1px;background:#fafafa;content:""}.ant-table.ant-table-bordered .ant-table-footer{border:1px solid #e8e8e8}.ant-table-title{position:relative;top:1px;padding:16px 0;border-radius:4px 4px 0 0}.ant-table.ant-table-bordered .ant-table-title{padding-right:16px;padding-left:16px;border:1px solid #e8e8e8}.ant-table-title+.ant-table-content{position:relative;overflow:hidden;border-radius:4px 4px 0 0}.ant-table-bordered .ant-table-title+.ant-table-content,.ant-table-bordered .ant-table-title+.ant-table-content .ant-table-thead>tr:first-child>th,.ant-table-bordered .ant-table-title+.ant-table-content table,.ant-table-without-column-header .ant-table-title+.ant-table-content,.ant-table-without-column-header table{border-radius:0}.ant-table-without-column-header.ant-table-bordered.ant-table-empty .ant-table-placeholder{border-top:1px solid #e8e8e8;border-radius:4px}.ant-table-tbody>tr.ant-table-row-selected td{color:inherit;background:#fafafa}.ant-table-thead>tr>th.ant-table-column-sort{background:#f5f5f5}.ant-table-tbody>tr>td.ant-table-column-sort{background:rgba(0,0,0,.01)}.ant-table-tbody>tr>td,.ant-table-thead>tr>th{padding:16px}.ant-table-expand-icon-th,.ant-table-row-expand-icon-cell{width:50px;min-width:50px;text-align:center}.ant-table-header{overflow:hidden;background:#fafafa}.ant-table-header table{border-radius:4px 4px 0 0}.ant-table-loading{position:relative}.ant-table-loading .ant-table-body{background:#fff;opacity:.5}.ant-table-loading .ant-table-spin-holder{position:absolute;top:50%;left:50%;height:20px;margin-left:-30px;line-height:20px}.ant-table-loading .ant-table-with-pagination{margin-top:-20px}.ant-table-loading .ant-table-without-pagination{margin-top:10px}.ant-table-bordered .ant-table-body>table,.ant-table-bordered .ant-table-fixed-left table,.ant-table-bordered .ant-table-fixed-right table,.ant-table-bordered .ant-table-header>table{border:1px solid #e8e8e8;border-right:0;border-bottom:0}.ant-table-bordered.ant-table-empty .ant-table-placeholder{border-right:1px solid #e8e8e8;border-left:1px solid #e8e8e8}.ant-table-bordered.ant-table-fixed-header .ant-table-header>table{border-bottom:0}.ant-table-bordered.ant-table-fixed-header .ant-table-body>table{border-top-left-radius:0;border-top-right-radius:0}.ant-table-bordered.ant-table-fixed-header .ant-table-body-inner>table,.ant-table-bordered.ant-table-fixed-header .ant-table-header+.ant-table-body>table{border-top:0}.ant-table-bordered .ant-table-thead>tr:not(:last-child)>th{border-bottom:1px solid #e8e8e8}.ant-table-bordered .ant-table-tbody>tr>td,.ant-table-bordered .ant-table-thead>tr>th{border-right:1px solid #e8e8e8}.ant-table-placeholder{position:relative;z-index:1;padding:16px;color:rgba(0,0,0,.25);font-size:14px;text-align:center;background:#fff;border-bottom:1px solid #e8e8e8;border-radius:0 0 4px 4px}.ant-table-placeholder .anticon{margin-right:4px}.ant-table-pagination.ant-pagination{float:right;margin:16px 0}.ant-table-filter-dropdown{position:relative;min-width:96px;margin-left:-8px;background:#fff;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-table-filter-dropdown .ant-dropdown-menu{border:0;border-radius:4px 4px 0 0;box-shadow:none}.ant-table-filter-dropdown .ant-dropdown-menu-without-submenu{max-height:400px;overflow-x:hidden}.ant-table-filter-dropdown .ant-dropdown-menu-item>label+span{padding-right:0}.ant-table-filter-dropdown .ant-dropdown-menu-sub{border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-table-filter-dropdown .ant-dropdown-menu .ant-dropdown-submenu-contain-selected .ant-dropdown-menu-submenu-title:after{color:#1890ff;font-weight:700;text-shadow:0 0 2px #bae7ff}.ant-table-filter-dropdown .ant-dropdown-menu-item{overflow:hidden}.ant-table-filter-dropdown>.ant-dropdown-menu>.ant-dropdown-menu-item:last-child,.ant-table-filter-dropdown>.ant-dropdown-menu>.ant-dropdown-menu-submenu:last-child .ant-dropdown-menu-submenu-title{border-radius:0}.ant-table-filter-dropdown-btns{padding:7px 8px;overflow:hidden;border-top:1px solid #e8e8e8}.ant-table-filter-dropdown-link{color:#1890ff}.ant-table-filter-dropdown-link:hover{color:#40a9ff}.ant-table-filter-dropdown-link:active{color:#096dd9}.ant-table-filter-dropdown-link.confirm{float:left}.ant-table-filter-dropdown-link.clear{float:right}.ant-table-selection{white-space:nowrap}.ant-table-selection-select-all-custom{margin-right:4px!important}.ant-table-selection .anticon-down{color:#bfbfbf;-webkit-transition:all .3s;transition:all .3s}.ant-table-selection-menu{min-width:96px;margin-top:5px;margin-left:-30px;background:#fff;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-table-selection-menu .ant-action-down{color:#bfbfbf}.ant-table-selection-down{display:inline-block;padding:0;line-height:1;cursor:pointer}.ant-table-selection-down:hover .anticon-down{color:rgba(0,0,0,.6)}.ant-table-row-expand-icon{display:inline-block;width:17px;height:17px;line-height:14px;text-align:center;background:#fff;border:1px solid #e8e8e8;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-table-row-expanded:after{content:"-"}.ant-table-row-collapsed:after{content:"+"}.ant-table-row-spaced{visibility:hidden}.ant-table-row-spaced:after{content:"."}tr.ant-table-expanded-row,tr.ant-table-expanded-row:hover{background:#fbfbfb}tr.ant-table-expanded-row td>.ant-table-wrapper{margin:-16px -16px -17px}.ant-table .ant-table-row-indent+.ant-table-row-expand-icon{margin-right:8px}.ant-table-scroll{overflow:auto;overflow-x:hidden}.ant-table-scroll table{width:auto;min-width:100%}.ant-table-scroll table .ant-table-fixed-columns-in-body{visibility:hidden}.ant-table-body-inner{height:100%}.ant-table-fixed-header>.ant-table-content>.ant-table-scroll>.ant-table-body{position:relative;background:#fff}.ant-table-fixed-header .ant-table-body-inner{overflow:scroll}.ant-table-fixed-header .ant-table-scroll .ant-table-header{margin-bottom:-20px;padding-bottom:20px;overflow:scroll;opacity:.9999}.ant-table-fixed-left,.ant-table-fixed-right{position:absolute;top:0;z-index:auto;overflow:hidden;border-radius:0;-webkit-transition:-webkit-box-shadow .3s ease;-webkit-transition:box-shadow .3s ease;transition:box-shadow .3s ease}.ant-table-fixed-left table,.ant-table-fixed-right table{width:auto;background:#fff}.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-outer .ant-table-fixed,.ant-table-fixed-header .ant-table-fixed-right .ant-table-body-outer .ant-table-fixed{border-radius:0}.ant-table-fixed-left{left:0;box-shadow:6px 0 6px -4px rgba(0,0,0,.15)}.ant-table-fixed-left .ant-table-header{overflow-y:hidden}.ant-table-fixed-left .ant-table-body-inner{margin-right:-20px;padding-right:20px}.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-inner{padding-right:0}.ant-table-fixed-left,.ant-table-fixed-left table{border-radius:4px 0 0 0}.ant-table-fixed-left .ant-table-thead>tr>th:last-child{border-top-right-radius:0}.ant-table-fixed-right{right:0;box-shadow:-6px 0 6px -4px rgba(0,0,0,.15)}.ant-table-fixed-right,.ant-table-fixed-right table{border-radius:0 4px 0 0}.ant-table-fixed-right .ant-table-expanded-row{color:transparent;pointer-events:none}.ant-table-fixed-right .ant-table-thead>tr>th:first-child{border-top-left-radius:0}.ant-table.ant-table-scroll-position-left .ant-table-fixed-left,.ant-table.ant-table-scroll-position-right .ant-table-fixed-right{box-shadow:none}.ant-table colgroup>col.ant-table-selection-col{width:60px}.ant-table-thead>tr>th.ant-table-selection-column-custom .ant-table-selection{margin-right:-15px}.ant-table-tbody>tr>td.ant-table-selection-column,.ant-table-thead>tr>th.ant-table-selection-column{text-align:center}.ant-table-tbody>tr>td.ant-table-selection-column .ant-radio-wrapper,.ant-table-thead>tr>th.ant-table-selection-column .ant-radio-wrapper{margin-right:0}.ant-table-row[class*=ant-table-row-level-0] .ant-table-selection-column>span{display:inline-block}.ant-table-middle>.ant-table-content>.ant-table-body>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-footer,.ant-table-middle>.ant-table-title{padding:12px 8px}.ant-table-middle tr.ant-table-expanded-row td>.ant-table-wrapper{margin:-12px -8px -13px}.ant-table-small{border:1px solid #e8e8e8;border-radius:4px}.ant-table-small>.ant-table-footer,.ant-table-small>.ant-table-title{padding:8px}.ant-table-small>.ant-table-title{top:0;border-bottom:1px solid #e8e8e8}.ant-table-small>.ant-table-content>.ant-table-body{margin:0 8px}.ant-table-small>.ant-table-content>.ant-table-body>table,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table,.ant-table-small>.ant-table-content>.ant-table-header>table,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table{border:0}.ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-thead>tr>th{padding:8px}.ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-thead>tr,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-thead>tr,.ant-table-small>.ant-table-content>.ant-table-header>table>.ant-table-thead>tr,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-thead>tr,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-thead>tr{background-color:initial;border-bottom:1px solid #e8e8e8}.ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr>th.ant-table-column-sort,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th.ant-table-column-sort,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-thead>tr>th.ant-table-column-sort,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th.ant-table-column-sort,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-thead>tr>th.ant-table-column-sort,.ant-table-small>.ant-table-content>.ant-table-header>table>.ant-table-thead>tr>th.ant-table-column-sort,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-thead>tr>th.ant-table-column-sort,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-thead>tr>th.ant-table-column-sort{background-color:rgba(0,0,0,.01)}.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table{padding:0}.ant-table-small>.ant-table-content .ant-table-header{background-color:#fff}.ant-table-small>.ant-table-content .ant-table-placeholder,.ant-table-small>.ant-table-content .ant-table-row:last-child td{border-bottom:0}.ant-table-small.ant-table-bordered{border-right:0}.ant-table-small.ant-table-bordered .ant-table-title{border:0;border-right:1px solid #e8e8e8;border-bottom:1px solid #e8e8e8}.ant-table-small.ant-table-bordered .ant-table-content{border-right:1px solid #e8e8e8}.ant-table-small.ant-table-bordered .ant-table-footer{border:0;border-top:1px solid #e8e8e8;border-right:1px solid #e8e8e8}.ant-table-small.ant-table-bordered .ant-table-footer:before{display:none}.ant-table-small.ant-table-bordered .ant-table-placeholder{border-right:0;border-bottom:0;border-left:0}.ant-table-small.ant-table-bordered .ant-table-tbody>tr>td:last-child,.ant-table-small.ant-table-bordered .ant-table-thead>tr>th:last-child{border-right:none}.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-tbody>tr>td:last-child,.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-thead>tr>th:last-child{border-right:1px solid #e8e8e8}.ant-table-small.ant-table-bordered .ant-table-fixed-right{border-right:1px solid #e8e8e8;border-left:1px solid #e8e8e8}.ant-table-small tr.ant-table-expanded-row td>.ant-table-wrapper{margin:-8px -8px -9px}.ant-timeline{box-sizing:border-box;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";margin:0;padding:0;list-style:none}.ant-timeline-item{position:relative;margin:0;padding:0 0 20px;font-size:14px;list-style:none}.ant-timeline-item-tail{position:absolute;top:.75em;left:4px;height:100%;border-left:2px solid #e8e8e8}.ant-timeline-item-pending .ant-timeline-item-head{font-size:12px}.ant-timeline-item-pending .ant-timeline-item-tail{display:none}.ant-timeline-item-head{position:absolute;width:10px;height:10px;background-color:#fff;border:2px solid transparent;border-radius:100px}.ant-timeline-item-head-blue{color:#1890ff;border-color:#1890ff}.ant-timeline-item-head-red{color:#f5222d;border-color:#f5222d}.ant-timeline-item-head-green{color:#52c41a;border-color:#52c41a}.ant-timeline-item-head-custom{position:absolute;top:5.5px;left:5px;width:auto;height:auto;margin-top:0;padding:3px 1px;line-height:1;text-align:center;border:0;border-radius:0;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ant-timeline-item-content{position:relative;top:-6px;margin:0 0 0 18px}.ant-timeline-item-last>.ant-timeline-item-tail{display:none}.ant-timeline-item-last>.ant-timeline-item-content{min-height:48px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-tail{left:50%}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-head{margin-left:-4px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom{margin-left:1px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content{left:50%;width:50%;text-align:left}.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{right:50%;left:-30px;width:50%;margin-right:18px;text-align:right}.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail{left:100%}.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{right:0;left:-30px;width:100%}.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail{display:block;border-left:2px dotted #e8e8e8}.ant-timeline.ant-timeline-reverse .ant-timeline-item-last .ant-timeline-item-tail{display:none}.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail{display:block;border-left:2px dotted #e8e8e8}.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-content{min-height:48px}.ant-transfer{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative}.ant-transfer-disabled .ant-transfer-list{background:#f5f5f5}.ant-transfer-list{position:relative;display:inline-block;width:180px;height:200px;padding-top:34px;vertical-align:middle;border:1px solid #d9d9d9;border-radius:4px}.ant-transfer-list-with-footer{padding-bottom:34px}.ant-transfer-list-search{padding:0 8px}.ant-transfer-list-search-action{position:absolute;top:4px;right:4px;bottom:4px;width:28px;color:rgba(0,0,0,.25);line-height:32px;text-align:center}.ant-transfer-list-search-action .anticon{color:rgba(0,0,0,.25);-webkit-transition:all .3s;transition:all .3s}.ant-transfer-list-search-action .anticon:hover{color:rgba(0,0,0,.45)}span.ant-transfer-list-search-action{pointer-events:none}.ant-transfer-list-header{position:absolute;top:0;left:0;width:100%;padding:6px 12px;overflow:hidden;color:rgba(0,0,0,.65);background:#fff;border-bottom:1px solid #e8e8e8;border-radius:4px 4px 0 0}.ant-transfer-list-header-title{position:absolute;right:12px}.ant-transfer-list-body{position:relative;height:100%;font-size:14px}.ant-transfer-list-body-search-wrapper{position:absolute;top:0;left:0;width:100%;padding:4px}.ant-transfer-list-body-with-search{padding-top:40px}.ant-transfer-list-content{height:100%;margin:0;padding:0;overflow:auto;list-style:none}.ant-transfer-list-content>.LazyLoad{-webkit-animation:transferHighlightIn 1s;animation:transferHighlightIn 1s}.ant-transfer-list-content-item{min-height:32px;padding:6px 12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-transition:all .3s;transition:all .3s}.ant-transfer-list-content-item>span{padding-right:0}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{background-color:#e6f7ff;cursor:pointer}.ant-transfer-list-content-item-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-transfer-list-body-not-found{position:absolute;top:50%;width:100%;padding-top:0;color:rgba(0,0,0,.25);text-align:center;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ant-transfer-list-body-with-search .ant-transfer-list-body-not-found{margin-top:16px}.ant-transfer-list-footer{position:absolute;bottom:0;left:0;width:100%;border-top:1px solid #e8e8e8;border-radius:0 0 4px 4px}.ant-transfer-operation{display:inline-block;margin:0 8px;overflow:hidden;vertical-align:middle}.ant-transfer-operation .ant-btn{display:block}.ant-transfer-operation .ant-btn:first-child{margin-bottom:4px}.ant-transfer-operation .ant-btn .anticon{font-size:12px}@-webkit-keyframes transferHighlightIn{0%{background:#bae7ff}to{background:transparent}}@keyframes transferHighlightIn{0%{background:#bae7ff}to{background:transparent}}.ant-select-tree-checkbox{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;top:-.09em;display:inline-block;line-height:1;white-space:nowrap;vertical-align:middle;outline:none;cursor:pointer}.ant-select-tree-checkbox-input:focus+.ant-select-tree-checkbox-inner,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner,.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner{border-color:#1890ff}.ant-select-tree-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;-webkit-animation:antCheckboxEffect .36s ease-in-out;animation:antCheckboxEffect .36s ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both;content:""}.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox:after,.ant-select-tree-checkbox:hover:after{visibility:visible}.ant-select-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:initial;-webkit-transition:all .3s;transition:all .3s}.ant-select-tree-checkbox-inner:after{position:absolute;top:50%;left:21%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(0) translate(-50%,-50%);transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;-webkit-transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-select-tree-checkbox-input{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(1) translate(-50%,-50%);transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-select-tree-checkbox-disabled{cursor:not-allowed}.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{border-color:rgba(0,0,0,.25);-webkit-animation-name:none;animation-name:none}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input{cursor:not-allowed}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{border-color:#f5f5f5;border-collapse:initial;-webkit-animation-name:none;animation-name:none}.ant-select-tree-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-select-tree-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block;line-height:unset;cursor:pointer}.ant-select-tree-checkbox-wrapper+.ant-select-tree-checkbox-wrapper{margin-left:8px}.ant-select-tree-checkbox+span,.ant-select-tree-checkbox-wrapper+span{padding-right:8px;padding-left:8px}.ant-select-tree-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block}.ant-select-tree-checkbox-group-item{display:inline-block;margin-right:8px}.ant-select-tree-checkbox-group-item:last-child{margin-right:0}.ant-select-tree-checkbox-group-item+.ant-select-tree-checkbox-group-item{margin-left:0}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{background-color:rgba(0,0,0,.25);border-color:rgba(0,0,0,.25)}.ant-select-tree{box-sizing:border-box;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";margin:-4px 0 0;padding:0 4px}.ant-select-tree li{margin:8px 0;padding:0;white-space:nowrap;list-style:none;outline:0}.ant-select-tree li.filter-node>span{font-weight:500}.ant-select-tree li ul{margin:0;padding:0 0 0 18px}.ant-select-tree li .ant-select-tree-node-content-wrapper{display:inline-block;width:calc(100% - 24px);margin:0;padding:3px 5px;color:rgba(0,0,0,.65);text-decoration:none;border-radius:2px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-select-tree li .ant-select-tree-node-content-wrapper:hover{background-color:#e6f7ff}.ant-select-tree li .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected{background-color:#bae7ff}.ant-select-tree li span.ant-select-tree-checkbox{margin:0 4px 0 0}.ant-select-tree li span.ant-select-tree-checkbox+.ant-select-tree-node-content-wrapper{width:calc(100% - 46px)}.ant-select-tree li span.ant-select-tree-iconEle,.ant-select-tree li span.ant-select-tree-switcher{display:inline-block;width:24px;height:24px;margin:0;line-height:22px;text-align:center;vertical-align:middle;border:0;outline:none;cursor:pointer}.ant-select-tree li span.ant-select-icon_loading .ant-select-switcher-loading-icon{position:absolute;left:0;display:inline-block;color:#1890ff;font-size:14px;-webkit-transform:none;transform:none}.ant-select-tree li span.ant-select-icon_loading .ant-select-switcher-loading-icon svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.ant-select-tree li span.ant-select-tree-switcher{position:relative}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher-noop{cursor:auto}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-icon,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-tree-switcher-icon{font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);display:inline-block;font-weight:700}:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-icon,:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-tree-switcher-icon{font-size:12px}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-icon svg,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-tree-switcher-icon{font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);display:inline-block;font-weight:700}:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon,:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-tree-switcher-icon{font-size:12px}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon svg,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon svg{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-loading-icon,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-loading-icon{position:absolute;left:0;display:inline-block;width:24px;height:24px;color:#1890ff;font-size:14px;-webkit-transform:none;transform:none}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-loading-icon svg,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-loading-icon svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.ant-select-tree-child-tree,.ant-select-tree .ant-select-tree-treenode-loading .ant-select-tree-iconEle{display:none}.ant-select-tree-child-tree-open{display:block}li.ant-select-tree-treenode-disabled>.ant-select-tree-node-content-wrapper,li.ant-select-tree-treenode-disabled>.ant-select-tree-node-content-wrapper span,li.ant-select-tree-treenode-disabled>span:not(.ant-select-tree-switcher){color:rgba(0,0,0,.25);cursor:not-allowed}li.ant-select-tree-treenode-disabled>.ant-select-tree-node-content-wrapper:hover{background:transparent}.ant-select-tree-icon__close,.ant-select-tree-icon__open{margin-right:2px;vertical-align:top}.ant-select-tree-dropdown{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum"}.ant-select-tree-dropdown .ant-select-dropdown-search{position:-webkit-sticky;position:sticky;top:0;z-index:1;display:block;padding:4px;background:#fff}.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field__wrap{width:100%}.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field{box-sizing:border-box;width:100%;padding:4px 7px;border:1px solid #d9d9d9;border-radius:4px;outline:none}.ant-select-tree-dropdown .ant-select-dropdown-search.ant-select-search--hide{display:none}.ant-select-tree-dropdown .ant-select-not-found{display:block;padding:7px 16px;color:rgba(0,0,0,.25);cursor:not-allowed}@-webkit-keyframes antCheckboxEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}@keyframes antCheckboxEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}.ant-tree.ant-tree-directory{position:relative}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-switcher,.ant-tree.ant-tree-directory>li span.ant-tree-switcher{position:relative;z-index:1}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-switcher.ant-tree-switcher-noop,.ant-tree.ant-tree-directory>li span.ant-tree-switcher.ant-tree-switcher-noop{pointer-events:none}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-checkbox,.ant-tree.ant-tree-directory>li span.ant-tree-checkbox{position:relative;z-index:1}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper{border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper:hover,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper:hover{background:transparent}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper:hover:before,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper:hover:before{background:#e6f7ff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper.ant-tree-node-selected,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper.ant-tree-node-selected{color:#fff;background:transparent}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper:before,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper:before{position:absolute;right:0;left:0;height:24px;-webkit-transition:all .3s;transition:all .3s;content:""}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper>span,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper>span{position:relative;z-index:1}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-switcher,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-switcher{color:#fff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-checkbox .ant-tree-checkbox-inner,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-checkbox .ant-tree-checkbox-inner{border-color:#1890ff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked:after,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked:after{border-color:#fff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner{background:#fff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{border-color:#1890ff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-node-content-wrapper:before,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-node-content-wrapper:before{background:#1890ff}.ant-tree-checkbox{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";position:relative;top:-.09em;display:inline-block;line-height:1;white-space:nowrap;vertical-align:middle;outline:none;cursor:pointer}.ant-tree-checkbox-input:focus+.ant-tree-checkbox-inner,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,.ant-tree-checkbox:hover .ant-tree-checkbox-inner{border-color:#1890ff}.ant-tree-checkbox-checked:after{top:0;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;-webkit-animation:antCheckboxEffect .36s ease-in-out;animation:antCheckboxEffect .36s ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both;content:""}.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox:after,.ant-tree-checkbox:hover:after{visibility:visible}.ant-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:initial;-webkit-transition:all .3s;transition:all .3s}.ant-tree-checkbox-inner:after{position:absolute;top:50%;left:21%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(0) translate(-50%,-50%);transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;-webkit-transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-tree-checkbox-input{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(1) translate(-50%,-50%);transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-tree-checkbox-checked .ant-tree-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-tree-checkbox-disabled{cursor:not-allowed}.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{border-color:rgba(0,0,0,.25);-webkit-animation-name:none;animation-name:none}.ant-tree-checkbox-disabled .ant-tree-checkbox-input{cursor:not-allowed}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{border-color:#f5f5f5;border-collapse:initial;-webkit-animation-name:none;animation-name:none}.ant-tree-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-tree-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block;line-height:unset;cursor:pointer}.ant-tree-checkbox-wrapper+.ant-tree-checkbox-wrapper{margin-left:8px}.ant-tree-checkbox+span,.ant-tree-checkbox-wrapper+span{padding-right:8px;padding-left:8px}.ant-tree-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";display:inline-block}.ant-tree-checkbox-group-item{display:inline-block;margin-right:8px}.ant-tree-checkbox-group-item:last-child{margin-right:0}.ant-tree-checkbox-group-item+.ant-tree-checkbox-group-item{margin-left:0}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{background-color:rgba(0,0,0,.25);border-color:rgba(0,0,0,.25)}.ant-tree{box-sizing:border-box;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";margin:0;padding:0}.ant-tree-checkbox-checked:after{position:absolute;top:16.67%;left:0;width:100%;height:66.67%}.ant-tree ol,.ant-tree ul{margin:0;padding:0;list-style:none}.ant-tree li{margin:0;padding:4px 0;white-space:nowrap;list-style:none;outline:0}.ant-tree li span[draggable=true],.ant-tree li span[draggable]{line-height:20px;border-top:2px solid transparent;border-bottom:2px solid transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-khtml-user-drag:element;-webkit-user-drag:element}.ant-tree li.drag-over>span[draggable]{color:#fff;background-color:#1890ff;opacity:.8}.ant-tree li.drag-over-gap-top>span[draggable]{border-top-color:#1890ff}.ant-tree li.drag-over-gap-bottom>span[draggable]{border-bottom-color:#1890ff}.ant-tree li.filter-node>span{color:#f5222d!important;font-weight:500!important}.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-loading-icon,.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-loading-icon{position:absolute;left:0;display:inline-block;width:24px;height:24px;color:#1890ff;font-size:14px;-webkit-transform:none;transform:none}.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-loading-icon svg,.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-loading-icon svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}:root .ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close:after,:root .ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open:after{opacity:0}.ant-tree li ul{margin:0;padding:0 0 0 18px}.ant-tree li .ant-tree-node-content-wrapper{display:inline-block;height:24px;margin:0;padding:0 5px;color:rgba(0,0,0,.65);line-height:24px;text-decoration:none;vertical-align:top;border-radius:2px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-tree li .ant-tree-node-content-wrapper:hover{background-color:#e6f7ff}.ant-tree li .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:#bae7ff}.ant-tree li span.ant-tree-checkbox{top:auto;height:24px;margin:0 4px 0 2px;padding:4px 0}.ant-tree li span.ant-tree-iconEle,.ant-tree li span.ant-tree-switcher{display:inline-block;width:24px;height:24px;margin:0;line-height:24px;text-align:center;vertical-align:top;border:0;outline:none;cursor:pointer}.ant-tree li span.ant-tree-switcher{position:relative}.ant-tree li span.ant-tree-switcher.ant-tree-switcher-noop{cursor:default}.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon,.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon{font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);display:inline-block;font-weight:700}:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon,:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon{font-size:12px}.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon svg,.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon,.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon{font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);display:inline-block;font-weight:700}:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon,:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon{font-size:12px}.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon svg,.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon svg{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.ant-tree li:last-child>span.ant-tree-iconEle:before,.ant-tree li:last-child>span.ant-tree-switcher:before{display:none}.ant-tree>li:first-child{padding-top:7px}.ant-tree>li:last-child{padding-bottom:7px}.ant-tree-child-tree>li:first-child{padding-top:8px}.ant-tree-child-tree>li:last-child{padding-bottom:0}li.ant-tree-treenode-disabled>.ant-tree-node-content-wrapper,li.ant-tree-treenode-disabled>.ant-tree-node-content-wrapper span,li.ant-tree-treenode-disabled>span:not(.ant-tree-switcher){color:rgba(0,0,0,.25);cursor:not-allowed}li.ant-tree-treenode-disabled>.ant-tree-node-content-wrapper:hover{background:transparent}.ant-tree-icon__close,.ant-tree-icon__open{margin-right:2px;vertical-align:top}.ant-tree.ant-tree-show-line li{position:relative}.ant-tree.ant-tree-show-line li span.ant-tree-switcher{color:rgba(0,0,0,.45);background:#fff}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-select-switcher-icon,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-tree-switcher-icon{display:inline-block;font-weight:400;font-size:12px}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-select-switcher-icon svg,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon{display:inline-block;font-weight:400;font-size:12px}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon svg,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon{display:inline-block;font-weight:400;font-size:12px}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon svg,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-tree.ant-tree-show-line li:not(:last-child):before{position:absolute;left:12px;width:1px;height:100%;margin:22px 0;border-left:1px solid #d9d9d9;content:" "}.ant-tree.ant-tree-icon-hide .ant-tree-treenode-loading .ant-tree-iconEle{display:none}.ant-tree.ant-tree-block-node li .ant-tree-node-content-wrapper{width:calc(100% - 24px)}.ant-tree.ant-tree-block-node li span.ant-tree-checkbox+.ant-tree-node-content-wrapper{width:calc(100% - 46px)}.ant-typography{color:rgba(0,0,0,.65)}.ant-typography.ant-typography-secondary{color:rgba(0,0,0,.45)}.ant-typography.ant-typography-warning{color:#d48806}.ant-typography.ant-typography-danger{color:#cf1322}.ant-typography.ant-typography-disabled{color:rgba(0,0,0,.25);cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-typography p,div.ant-typography{margin-bottom:1em}.ant-typography h1,h1.ant-typography{margin-bottom:.5em;color:rgba(0,0,0,.85);font-weight:600;font-size:38px;line-height:1.23}.ant-typography h2,h2.ant-typography{margin-bottom:.5em;color:rgba(0,0,0,.85);font-weight:600;font-size:30px;line-height:1.35}.ant-typography h3,h3.ant-typography{margin-bottom:.5em;color:rgba(0,0,0,.85);font-weight:600;font-size:24px;line-height:1.35}.ant-typography h4,h4.ant-typography{margin-bottom:.5em;color:rgba(0,0,0,.85);font-weight:600;font-size:20px;line-height:1.4}.ant-typography+h1.ant-typography,.ant-typography+h2.ant-typography,.ant-typography+h3.ant-typography,.ant-typography+h4.ant-typography,.ant-typography div+h1,.ant-typography div+h2,.ant-typography div+h3,.ant-typography div+h4,.ant-typography h1+h1,.ant-typography h1+h2,.ant-typography h1+h3,.ant-typography h1+h4,.ant-typography h2+h1,.ant-typography h2+h2,.ant-typography h2+h3,.ant-typography h2+h4,.ant-typography h3+h1,.ant-typography h3+h2,.ant-typography h3+h3,.ant-typography h3+h4,.ant-typography h4+h1,.ant-typography h4+h2,.ant-typography h4+h3,.ant-typography h4+h4,.ant-typography li+h1,.ant-typography li+h2,.ant-typography li+h3,.ant-typography li+h4,.ant-typography p+h1,.ant-typography p+h2,.ant-typography p+h3,.ant-typography p+h4,.ant-typography ul+h1,.ant-typography ul+h2,.ant-typography ul+h3,.ant-typography ul+h4{margin-top:1.2em}span.ant-typography-ellipsis{display:inline-block}.ant-typography a{color:#1890ff;text-decoration:none;outline:none;cursor:pointer;-webkit-transition:color .3s;transition:color .3s}.ant-typography a:focus,.ant-typography a:hover{color:#40a9ff}.ant-typography a:active{color:#096dd9}.ant-typography a:active,.ant-typography a:hover{text-decoration:none}.ant-typography a[disabled]{color:rgba(0,0,0,.25);cursor:not-allowed;pointer-events:none}.ant-typography code{margin:0 .2em;padding:.2em .4em .1em;font-size:85%;background:rgba(0,0,0,.06);border:1px solid rgba(0,0,0,.06);border-radius:3px}.ant-typography mark{padding:0;background-color:#ffe58f}.ant-typography ins,.ant-typography u{text-decoration:underline;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.ant-typography del,.ant-typography s{text-decoration:line-through}.ant-typography strong{font-weight:600}.ant-typography-copy,.ant-typography-edit,.ant-typography-expand{color:#1890ff;text-decoration:none;outline:none;cursor:pointer;-webkit-transition:color .3s;transition:color .3s;margin-left:8px}.ant-typography-copy:focus,.ant-typography-copy:hover,.ant-typography-edit:focus,.ant-typography-edit:hover,.ant-typography-expand:focus,.ant-typography-expand:hover{color:#40a9ff}.ant-typography-copy:active,.ant-typography-edit:active,.ant-typography-expand:active{color:#096dd9}.ant-typography-copy-success,.ant-typography-copy-success:focus,.ant-typography-copy-success:hover{color:#52c41a}.ant-typography-edit-content{position:relative}div.ant-typography-edit-content{left:-12px;margin-top:-5px;margin-bottom:calc(1em - 6px)}.ant-typography-edit-content-confirm{position:absolute;right:10px;bottom:8px;color:rgba(0,0,0,.45);pointer-events:none}.ant-typography ol,.ant-typography ul{margin:0 0 1em;padding:0}.ant-typography ol li,.ant-typography ul li{margin:0 0 0 20px;padding:0 0 0 4px}.ant-typography ul li{list-style-type:circle}.ant-typography ul li li{list-style-type:disc}.ant-typography ol li{list-style-type:decimal}.ant-typography-ellipsis-single-line{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-typography-ellipsis-multiple-line{display:-webkit-box;-webkit-line-clamp:3; + /*! autoprefixer: ignore next */-webkit-box-orient:vertical;overflow:hidden}.ant-upload{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";outline:0}.ant-upload p{margin:0}.ant-upload-btn{display:block;width:100%;outline:none}.ant-upload input[type=file]{cursor:pointer}.ant-upload.ant-upload-select{display:inline-block}.ant-upload.ant-upload-select-picture-card{display:table;width:104px;height:104px;margin-right:8px;margin-bottom:8px;text-align:center;vertical-align:top;background-color:#fafafa;border:1px dashed #d9d9d9;border-radius:4px;cursor:pointer;-webkit-transition:border-color .3s ease;transition:border-color .3s ease}.ant-upload.ant-upload-select-picture-card>.ant-upload{display:table-cell;width:100%;height:100%;padding:8px;text-align:center;vertical-align:middle}.ant-upload.ant-upload-select-picture-card:hover{border-color:#1890ff}.ant-upload.ant-upload-drag{position:relative;width:100%;height:100%;text-align:center;background:#fafafa;border:1px dashed #d9d9d9;border-radius:4px;cursor:pointer;-webkit-transition:border-color .3s;transition:border-color .3s}.ant-upload.ant-upload-drag .ant-upload{padding:16px 0}.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled){border-color:#096dd9}.ant-upload.ant-upload-drag.ant-upload-disabled{cursor:not-allowed}.ant-upload.ant-upload-drag .ant-upload-btn{display:table;height:100%}.ant-upload.ant-upload-drag .ant-upload-drag-container{display:table-cell;vertical-align:middle}.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover{border-color:#40a9ff}.ant-upload.ant-upload-drag p.ant-upload-drag-icon{margin-bottom:20px}.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon{color:#40a9ff;font-size:48px}.ant-upload.ant-upload-drag p.ant-upload-text{margin:0 0 4px;color:rgba(0,0,0,.85);font-size:16px}.ant-upload.ant-upload-drag p.ant-upload-hint{color:rgba(0,0,0,.45);font-size:14px}.ant-upload.ant-upload-drag .anticon-plus{color:rgba(0,0,0,.25);font-size:30px;-webkit-transition:all .3s;transition:all .3s}.ant-upload.ant-upload-drag .anticon-plus:hover,.ant-upload.ant-upload-drag:hover .anticon-plus{color:rgba(0,0,0,.45)}.ant-upload-list{box-sizing:border-box;margin:0;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum","tnum";zoom:1}.ant-upload-list:after,.ant-upload-list:before{display:table;content:""}.ant-upload-list:after{clear:both}.ant-upload-list-item{position:relative;height:22px;margin-top:8px;font-size:14px}.ant-upload-list-item-name{display:inline-block;width:100%;padding-left:22px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-upload-list-item-info{height:100%;padding:0 12px 0 4px;-webkit-transition:background-color .3s;transition:background-color .3s}.ant-upload-list-item-info>span{display:block}.ant-upload-list-item-info .anticon-loading,.ant-upload-list-item-info .anticon-paper-clip{position:absolute;top:5px;color:rgba(0,0,0,.45);font-size:14px}.ant-upload-list-item .anticon-close{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);position:absolute;top:6px;right:4px;color:rgba(0,0,0,.45);line-height:0;cursor:pointer;opacity:0;-webkit-transition:all .3s;transition:all .3s}:root .ant-upload-list-item .anticon-close{font-size:12px}.ant-upload-list-item .anticon-close:hover{color:rgba(0,0,0,.65)}.ant-upload-list-item:hover .ant-upload-list-item-info{background-color:#e6f7ff}.ant-upload-list-item:hover .anticon-close{opacity:1}.ant-upload-list-item-error,.ant-upload-list-item-error .ant-upload-list-item-name,.ant-upload-list-item-error .anticon-paper-clip{color:#f5222d}.ant-upload-list-item-error .anticon-close{color:#f5222d!important;opacity:1}.ant-upload-list-item-progress{position:absolute;bottom:-12px;width:100%;padding-left:26px;font-size:14px;line-height:0}.ant-upload-list-picture-card .ant-upload-list-item,.ant-upload-list-picture .ant-upload-list-item{position:relative;height:66px;padding:8px;border:1px solid #d9d9d9;border-radius:4px}.ant-upload-list-picture-card .ant-upload-list-item:hover,.ant-upload-list-picture .ant-upload-list-item:hover{background:transparent}.ant-upload-list-picture-card .ant-upload-list-item-error,.ant-upload-list-picture .ant-upload-list-item-error{border-color:#f5222d}.ant-upload-list-picture-card .ant-upload-list-item-info,.ant-upload-list-picture .ant-upload-list-item-info{padding:0}.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info,.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info{background:transparent}.ant-upload-list-picture-card .ant-upload-list-item-uploading,.ant-upload-list-picture .ant-upload-list-item-uploading{border-style:dashed}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture .ant-upload-list-item-thumbnail{position:absolute;top:8px;left:8px;width:48px;height:48px;font-size:26px;line-height:54px;text-align:center;opacity:.8}.ant-upload-list-picture-card .ant-upload-list-item-icon,.ant-upload-list-picture .ant-upload-list-item-icon{position:absolute;top:50%;left:50%;font-size:26px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img,.ant-upload-list-picture .ant-upload-list-item-thumbnail img{display:block;width:48px;height:48px;overflow:hidden}.ant-upload-list-picture-card .ant-upload-list-item-name,.ant-upload-list-picture .ant-upload-list-item-name{display:inline-block;box-sizing:border-box;max-width:100%;margin:0 0 0 8px;padding-right:8px;padding-left:48px;overflow:hidden;line-height:44px;white-space:nowrap;text-overflow:ellipsis;-webkit-transition:all .3s;transition:all .3s}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name,.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name{line-height:28px}.ant-upload-list-picture-card .ant-upload-list-item-progress,.ant-upload-list-picture .ant-upload-list-item-progress{bottom:14px;width:calc(100% - 24px);margin-top:0;padding-left:56px}.ant-upload-list-picture-card .anticon-close,.ant-upload-list-picture .anticon-close{position:absolute;top:8px;right:8px;line-height:1;opacity:1}.ant-upload-list-picture-card{float:left}.ant-upload-list-picture-card.ant-upload-list:after{display:none}.ant-upload-list-picture-card .ant-upload-list-item{float:left;width:104px;height:104px;margin:0 8px 8px 0}.ant-upload-list-picture-card .ant-upload-list-item-info{position:relative;height:100%;overflow:hidden}.ant-upload-list-picture-card .ant-upload-list-item-info:before{position:absolute;z-index:1;width:100%;height:100%;background-color:rgba(0,0,0,.5);opacity:0;-webkit-transition:all .3s;transition:all .3s;content:" "}.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info:before{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-actions{position:absolute;top:50%;left:50%;z-index:10;white-space:nowrap;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;-webkit-transition:all .3s;transition:all .3s}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o{z-index:10;width:16px;margin:0 4px;color:hsla(0,0%,100%,.85);font-size:16px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o:hover{color:#fff}.ant-upload-list-picture-card .ant-upload-list-item-actions:hover,.ant-upload-list-picture-card .ant-upload-list-item-info:hover+.ant-upload-list-item-actions{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{position:static;display:block;width:100%;height:100%}.ant-upload-list-picture-card .ant-upload-list-item-name{display:none;margin:8px 0 0;padding:0;line-height:1.5;text-align:center}.ant-upload-list-picture-card .anticon-picture+.ant-upload-list-item-name{display:block}.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item{background-color:#fafafa}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info{height:auto}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye-o,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info:before{display:none}.ant-upload-list-picture-card .ant-upload-list-item-uploading-text{margin-top:18px;color:rgba(0,0,0,.45)}.ant-upload-list-picture-card .ant-upload-list-item-progress{bottom:32px;padding-left:0}.ant-upload-list .ant-upload-success-icon{color:#52c41a;font-weight:700}.ant-upload-list .ant-upload-animate-enter,.ant-upload-list .ant-upload-animate-inline-enter,.ant-upload-list .ant-upload-animate-inline-leave,.ant-upload-list .ant-upload-animate-leave{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:cubic-bezier(.78,.14,.15,.86);animation-fill-mode:cubic-bezier(.78,.14,.15,.86)}.ant-upload-list .ant-upload-animate-enter{-webkit-animation-name:uploadAnimateIn;animation-name:uploadAnimateIn}.ant-upload-list .ant-upload-animate-leave{-webkit-animation-name:uploadAnimateOut;animation-name:uploadAnimateOut}.ant-upload-list .ant-upload-animate-inline-enter{-webkit-animation-name:uploadAnimateInlineIn;animation-name:uploadAnimateInlineIn}.ant-upload-list .ant-upload-animate-inline-leave{-webkit-animation-name:uploadAnimateInlineOut;animation-name:uploadAnimateInlineOut}@-webkit-keyframes uploadAnimateIn{0%{height:0;margin:0;padding:0;opacity:0}}@keyframes uploadAnimateIn{0%{height:0;margin:0;padding:0;opacity:0}}@-webkit-keyframes uploadAnimateOut{to{height:0;margin:0;padding:0;opacity:0}}@keyframes uploadAnimateOut{to{height:0;margin:0;padding:0;opacity:0}}@-webkit-keyframes uploadAnimateInlineIn{0%{width:0;height:0;margin:0;padding:0;opacity:0}}@keyframes uploadAnimateInlineIn{0%{width:0;height:0;margin:0;padding:0;opacity:0}}@-webkit-keyframes uploadAnimateInlineOut{to{width:0;height:0;margin:0;padding:0;opacity:0}}@keyframes uploadAnimateInlineOut{to{width:0;height:0;margin:0;padding:0;opacity:0}} \ No newline at end of file diff --git a/pkg/ui/v1alpha2/frontend/build/static/js/2.eeb558c1.chunk.js b/pkg/ui/v1alpha2/frontend/build/static/js/2.eeb558c1.chunk.js new file mode 100644 index 00000000000..050bf426c26 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/build/static/js/2.eeb558c1.chunk.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],[function(e,t,n){"use strict";e.exports=n(357)},function(e,t,n){e.exports=n(361)()},function(e,t){e.exports=function(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){"use strict";n.d(t,"u",function(){return s}),n.d(t,"v",function(){return R}),n.d(t,"w",function(){return u}),n.d(t,"x",function(){return D}),n.d(t,"y",function(){return p}),n.d(t,"z",function(){return d}),n.d(t,"A",function(){return b}),n.d(t,"B",function(){return O}),n.d(t,"C",function(){return P}),n.d(t,"D",function(){return N}),n.d(t,"E",function(){return V}),n.d(t,"F",function(){return j}),n.d(t,"G",function(){return H}),n.d(t,"H",function(){return W}),n.d(t,"I",function(){return G}),n.d(t,"J",function(){return Z}),n.d(t,"K",function(){return U}),n.d(t,"L",function(){return Y}),n.d(t,"M",function(){return Q}),n.d(t,"N",function(){return X}),n.d(t,"O",function(){return J}),n.d(t,"P",function(){return $}),n.d(t,"Q",function(){return C}),n.d(t,"R",function(){return l}),n.d(t,"S",function(){return E}),n.d(t,"T",function(){return y}),n.d(t,"a",function(){return f}),n.d(t,"b",function(){return g}),n.d(t,"c",function(){return _}),n.d(t,"d",function(){return h}),n.d(t,"e",function(){return M}),n.d(t,"f",function(){return k}),n.d(t,"g",function(){return x}),n.d(t,"h",function(){return m}),n.d(t,"i",function(){return w}),n.d(t,"j",function(){return c}),n.d(t,"k",function(){return K}),n.d(t,"l",function(){return ae}),n.d(t,"m",function(){return oe}),n.d(t,"n",function(){return ie}),n.d(t,"o",function(){return se}),n.d(t,"p",function(){return F}),n.d(t,"q",function(){return le}),n.d(t,"r",function(){return ne}),n.d(t,"s",function(){return ee}),n.d(t,"t",function(){return te});var r=n(28),i=n(32),a=n(15),o=n(165),s=function(e){return function(){return e}}(!0),l=function(){},c=function(e){return e};"function"===typeof Symbol&&Symbol.asyncIterator&&Symbol.asyncIterator;function u(e,t,n){if(!t(e))throw new Error(n)}var f=function(e,t){Object(i.a)(e,t),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(function(n){e[n]=t[n]})},h=function(e,t){var n;return(n=[]).concat.apply(n,t.map(e))};function d(e,t){var n=e.indexOf(t);n>=0&&e.splice(n,1)}function p(e){var t=!1;return function(){t||(t=!0,e())}}var A=function(e){throw e},v=function(e){return{value:e,done:!0}};function g(e,t,n){void 0===t&&(t=A),void 0===n&&(n="iterator");var r={meta:{name:n},next:e,throw:t,return:v,isSagaIterator:!0};return"undefined"!==typeof Symbol&&(r[Symbol.iterator]=function(){return r}),r}function m(e,t){var n=t.sagaStack;console.error(e),console.error(n)}var b=function(e){return new Error("\n redux-saga: Error checking hooks detected an inconsistent state. This is likely a bug\n in redux-saga code and not yours. Thanks for reporting this in the project's github repo.\n Error: "+e+"\n")},y=function(e){return Array.apply(null,new Array(e))},w=function(e){return function(t){return e(Object.defineProperty(t,r.f,{value:!0}))}},x=function(e){return e===r.k},k=function(e){return e===r.j},_=function(e){return x(e)||k(e)};function E(e,t){var n=Object.keys(e),r=n.length;var i,o=0,s=Object(a.a)(e)?y(r):{},c={};return n.forEach(function(e){var n=function(n,a){i||(a||_(n)?(t.cancel(),t(n,a)):(s[e]=n,++o===r&&(i=!0,t(s))))};n.cancel=l,c[e]=n}),t.cancel=function(){i||(i=!0,n.forEach(function(e){return c[e].cancel()}))},c}function C(e){return{name:e.name||"anonymous",location:M(e)}}function M(e){return e[r.g]}var T="Channel's Buffer overflow!",L=1,z=3,S=4,B={isEmpty:s,put:l,take:l};function I(e,t){void 0===e&&(e=10);var n=new Array(e),r=0,i=0,a=0,o=function(t){n[i]=t,i=(i+1)%e,r++},s=function(){if(0!=r){var t=n[a];return n[a]=null,r--,a=(a+1)%e,t}},l=function(){for(var e=[];r;)e.push(s());return e};return{isEmpty:function(){return 0==r},put:function(s){var c;if(r1?t-1:0),r=1;r1?t-1:0),r=1;r=0&&"xmlns"!==(t=e.slice(0,n))&&(e=e.slice(n+1)),i.hasOwnProperty(t)?{space:i[t],local:e}:e};var o=function(e){var t=a(e);return(t.local?function(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}:function(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===r&&t.documentElement.namespaceURI===r?t.createElement(e):t.createElementNS(n,e)}})(t)};function s(){}var l=function(e){return null==e?s:function(){return this.querySelector(e)}};function c(){return[]}var u=function(e){return null==e?c:function(){return this.querySelectorAll(e)}},f=function(e){return function(){return this.matches(e)}},h=function(e){return new Array(e.length)};function d(e,t){this.ownerDocument=e.ownerDocument,this.namespaceURI=e.namespaceURI,this._next=null,this._parent=e,this.__data__=t}d.prototype={constructor:d,appendChild:function(e){return this._parent.insertBefore(e,this._next)},insertBefore:function(e,t){return this._parent.insertBefore(e,t)},querySelector:function(e){return this._parent.querySelector(e)},querySelectorAll:function(e){return this._parent.querySelectorAll(e)}};var p="$";function A(e,t,n,r,i,a){for(var o,s=0,l=t.length,c=a.length;st?1:e>=t?0:NaN}var m=function(e){return e.ownerDocument&&e.ownerDocument.defaultView||e.document&&e||e.defaultView};function b(e,t){return e.style.getPropertyValue(t)||m(e).getComputedStyle(e,null).getPropertyValue(t)}function y(e){return e.trim().split(/^|\s+/)}function w(e){return e.classList||new x(e)}function x(e){this._node=e,this._names=y(e.getAttribute("class")||"")}function k(e,t){for(var n=w(e),r=-1,i=t.length;++r=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function E(){this.textContent=""}function C(){this.innerHTML=""}function M(){this.nextSibling&&this.parentNode.appendChild(this)}function T(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function L(){return null}function z(){var e=this.parentNode;e&&e.removeChild(this)}function S(){return this.parentNode.insertBefore(this.cloneNode(!1),this.nextSibling)}function B(){return this.parentNode.insertBefore(this.cloneNode(!0),this.nextSibling)}var I={},D=null;"undefined"!==typeof document&&("onmouseenter"in document.documentElement||(I={mouseenter:"mouseover",mouseleave:"mouseout"}));function F(e,t,n){return e=R(e,t,n),function(t){var n=t.relatedTarget;n&&(n===this||8&n.compareDocumentPosition(this))||e.call(this,t)}}function R(e,t,n){return function(r){var i=D;D=r;try{e.call(this,this.__data__,t,n)}finally{D=i}}}function O(e){return function(){var t=this.__on;if(t){for(var n,r=0,i=-1,a=t.length;r=k&&(k=x+1);!(w=b[k])&&++k=0;)(r=i[a])&&(o&&4^r.compareDocumentPosition(o)&&o.parentNode.insertBefore(r,o),o=r);return this},sort:function(e){function t(t,n){return t&&n?e(t.__data__,n.__data__):!t-!n}e||(e=g);for(var n=this._groups,r=n.length,i=new Array(r),a=0;a1?this.each((null==t?function(e){return function(){this.style.removeProperty(e)}}:"function"===typeof t?function(e,t,n){return function(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(e):this.style.setProperty(e,r,n)}}:function(e,t,n){return function(){this.style.setProperty(e,t,n)}})(e,t,null==n?"":n)):b(this.node(),e)},property:function(e,t){return arguments.length>1?this.each((null==t?function(e){return function(){delete this[e]}}:"function"===typeof t?function(e,t){return function(){var n=t.apply(this,arguments);null==n?delete this[e]:this[e]=n}}:function(e,t){return function(){this[e]=t}})(e,t)):this.node()[e]},classed:function(e,t){var n=y(e+"");if(arguments.length<2){for(var r=w(this.node()),i=-1,a=n.length;++i=0&&(t=e.slice(n+1),e=e.slice(0,n)),{type:e,name:t}})}(e+""),o=a.length;if(!(arguments.length<2)){for(s=t?P:O,null==n&&(n=!1),r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}},function(e,t,n){"use strict";var r=n(103),i=n(0),a=n.n(i),o=n(1),s=n.n(o),l=a.a.createContext(null),c=function(e){function t(t){var n;n=e.call(this,t)||this;var r=t.store;return n.state={storeState:r.getState(),store:r},n}Object(r.a)(t,e);var n=t.prototype;return n.componentDidMount=function(){this._isMounted=!0,this.subscribe()},n.componentWillUnmount=function(){this.unsubscribe&&this.unsubscribe(),this._isMounted=!1},n.componentDidUpdate=function(e){this.props.store!==e.store&&(this.unsubscribe&&this.unsubscribe(),this.subscribe())},n.subscribe=function(){var e=this,t=this.props.store;this.unsubscribe=t.subscribe(function(){var n=t.getState();e._isMounted&&e.setState(function(e){return e.storeState===n?null:{storeState:n}})});var n=t.getState();n!==this.state.storeState&&this.setState({storeState:n})},n.render=function(){var e=this.props.context||l;return a.a.createElement(e.Provider,{value:this.state},this.props.children)},t}(i.Component);c.propTypes={store:s.a.shape({subscribe:s.a.func.isRequired,dispatch:s.a.func.isRequired,getState:s.a.func.isRequired}),context:s.a.object,children:s.a.any};var u=c,f=n(138),h=n(32),d=n(91),p=n(115),A=n.n(p),v=n(65),g=n.n(v),m=n(157);function b(e,t){void 0===t&&(t={});var n=t,o=n.getDisplayName,s=void 0===o?function(e){return"ConnectAdvanced("+e+")"}:o,c=n.methodName,u=void 0===c?"connectAdvanced":c,p=n.renderCountProp,v=void 0===p?void 0:p,b=n.shouldHandleStateChanges,y=void 0===b||b,w=n.storeKey,x=void 0===w?"store":w,k=n.withRef,_=void 0!==k&&k,E=n.forwardRef,C=void 0!==E&&E,M=n.context,T=void 0===M?l:M,L=Object(d.a)(n,["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef","forwardRef","context"]);g()(void 0===v,"renderCountProp is removed. render counting is built into the latest React dev tools profiling extension"),g()(!_,"withRef is removed. To access the wrapped instance, use a ref on the connected component");var z="To use a custom Redux store for specific components, create a custom React context with React.createContext(), and pass the context object to React Redux's Provider and specific components like: . You may also pass a {context : MyContext} option to connect";g()("store"===x,"storeKey has been removed and does not do anything. "+z);var S=T;return function(t){var n=t.displayName||t.name||"Component",o=s(n),l=Object(h.a)({},L,{getDisplayName:s,methodName:u,renderCountProp:v,shouldHandleStateChanges:y,storeKey:x,displayName:o,wrappedComponentName:n,WrappedComponent:t}),c=L.pure,d=i.Component;c&&(d=i.PureComponent);var p=function(n){function i(t){var r;return r=n.call(this,t)||this,g()(C?!t.wrapperProps[x]:!t[x],"Passing redux store in props has been removed and does not do anything. "+z),r.selectDerivedProps=function(){var t,n,r,i,a,o;return function(s,l,u,f){if(c&&t===l&&n===s)return r;u===i&&a===f||(i=u,a=f,o=e(u.dispatch,f)),t=l,n=s;var h=o(s,l);return r=h}}(),r.selectChildElement=function(){var e,t,n,r;return function(i,o,s){return o===e&&s===t&&r===i||(e=o,t=s,r=i,n=a.a.createElement(i,Object(h.a)({},o,{ref:s}))),n}}(),r.indirectRenderWrappedComponent=r.indirectRenderWrappedComponent.bind(Object(f.a)(r)),r}Object(r.a)(i,n);var s=i.prototype;return s.indirectRenderWrappedComponent=function(e){return this.renderWrappedComponent(e)},s.renderWrappedComponent=function(e){g()(e,'Could not find "store" in the context of "'+o+'". Either wrap the root component in a , or pass a custom React context provider to and the corresponding React context consumer to '+o+" in connect options.");var n,r=e.storeState,i=e.store,a=this.props;C&&(a=this.props.wrapperProps,n=this.props.forwardedRef);var s=this.selectDerivedProps(r,a,i,l);return this.selectChildElement(t,s,n)},s.render=function(){var e=this.props.context&&this.props.context.Consumer&&Object(m.isContextConsumer)(a.a.createElement(this.props.context.Consumer,null))?this.props.context:S;return a.a.createElement(e.Consumer,null,this.indirectRenderWrappedComponent)},i}(d);if(p.WrappedComponent=t,p.displayName=o,C){var b=a.a.forwardRef(function(e,t){return a.a.createElement(p,{wrapperProps:e,forwardedRef:t})});return b.displayName=o,b.WrappedComponent=t,A()(b,t)}return A()(p,t)}}var y=Object.prototype.hasOwnProperty;function w(e,t){return e===t?0!==e||0!==t||1/e===1/t:e!==e&&t!==t}function x(e,t){if(w(e,t))return!0;if("object"!==typeof e||null===e||"object"!==typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(var i=0;i=0;r--){var i=t[r](e);if(i)return i}return function(t,r){throw new Error("Invalid value of type "+typeof e+" for "+n+" argument when connecting component "+r.wrappedComponentName+".")}}function F(e,t){return e===t}var R=function(e){var t=void 0===e?{}:e,n=t.connectHOC,r=void 0===n?b:n,i=t.mapStateToPropsFactories,a=void 0===i?T:i,o=t.mapDispatchToPropsFactories,s=void 0===o?M:o,l=t.mergePropsFactories,c=void 0===l?z:l,u=t.selectorFactory,f=void 0===u?I:u;return function(e,t,n,i){void 0===i&&(i={});var o=i,l=o.pure,u=void 0===l||l,p=o.areStatesEqual,A=void 0===p?F:p,v=o.areOwnPropsEqual,g=void 0===v?x:v,m=o.areStatePropsEqual,b=void 0===m?x:m,y=o.areMergedPropsEqual,w=void 0===y?x:y,k=Object(d.a)(o,["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"]),_=D(e,a,"mapStateToProps"),E=D(t,s,"mapDispatchToProps"),C=D(n,c,"mergeProps");return r(f,Object(h.a)({methodName:"connect",getDisplayName:function(e){return"Connect("+e+")"},shouldHandleStateChanges:Boolean(e),initMapStateToProps:_,initMapDispatchToProps:E,initMergeProps:C,pure:u,areStatesEqual:A,areOwnPropsEqual:g,areStatePropsEqual:b,areMergedPropsEqual:w},k))}}();n.d(t,"a",function(){return u}),n.d(t,"b",function(){return R})},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(471))},function(e,t,n){e.exports=n(605)},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.sheetsManager=void 0;var i=r(n(17)),a=r(n(8)),o=r(n(23)),s=r(n(24)),l=r(n(25)),c=r(n(26)),u=r(n(27)),f=r(n(10)),h=r(n(0)),d=r(n(1)),p=(r(n(21)),r(n(115))),A=n(19),v=n(70),g=r(n(403)),m=r(n(236)),b=r(n(237)),y=r(n(416)),w=r(n(184)),x=r(n(185)),k=r(n(239)),_=r(n(431)),E=r(n(432)),C=(0,v.create)((0,m.default)()),M=(0,k.default)(),T=-1e11,L=new Map;t.sheetsManager=L;var z={},S=(0,w.default)({typography:{suppressWarning:!0}});A.ponyfillGlobal.__MUI_STYLES__||(A.ponyfillGlobal.__MUI_STYLES__={}),A.ponyfillGlobal.__MUI_STYLES__.withStyles||(A.ponyfillGlobal.__MUI_STYLES__.withStyles=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(n){var r,A=t.withTheme,v=void 0!==A&&A,m=t.flip,w=void 0===m?null:m,k=t.name,B=(0,f.default)(t,["withTheme","flip","name"]),I=(0,_.default)(e),D=I.themingEnabled||"string"===typeof k||v;T+=1,I.options.index=T;var F=function(e){function t(e,n){var r;(0,o.default)(this,t),(r=(0,l.default)(this,(0,c.default)(t).call(this,e,n))).jss=n[g.default.jss]||C,r.sheetsManager=L,r.unsubscribeId=null;var i=n.muiThemeProviderOptions;return i&&(i.sheetsManager&&(r.sheetsManager=i.sheetsManager),r.sheetsCache=i.sheetsCache,r.disableStylesGeneration=i.disableStylesGeneration),r.stylesCreatorSaved=I,r.sheetOptions=(0,a.default)({generateClassName:M},n[g.default.sheetOptions]),r.theme=D?x.default.initial(n)||S:z,r.attach(r.theme),r.cacheClasses={value:null,lastProp:null,lastJSS:{}},r}return(0,u.default)(t,e),(0,s.default)(t,[{key:"componentDidMount",value:function(){var e=this;D&&(this.unsubscribeId=x.default.subscribe(this.context,function(t){var n=e.theme;e.theme=t,e.attach(e.theme),e.setState({},function(){e.detach(n)})}))}},{key:"componentDidUpdate",value:function(){this.stylesCreatorSaved}},{key:"componentWillUnmount",value:function(){this.detach(this.theme),null!==this.unsubscribeId&&x.default.unsubscribe(this.context,this.unsubscribeId)}},{key:"getClasses",value:function(){if(this.disableStylesGeneration)return this.props.classes||{};var e=!1,t=y.default.get(this.sheetsManager,this.stylesCreatorSaved,this.theme);return t.sheet.classes!==this.cacheClasses.lastJSS&&(this.cacheClasses.lastJSS=t.sheet.classes,e=!0),this.props.classes!==this.cacheClasses.lastProp&&(this.cacheClasses.lastProp=this.props.classes,e=!0),e&&(this.cacheClasses.value=(0,b.default)({baseClasses:this.cacheClasses.lastJSS,newClasses:this.props.classes,Component:n})),this.cacheClasses.value}},{key:"attach",value:function(e){if(!this.disableStylesGeneration){var t=this.stylesCreatorSaved,n=y.default.get(this.sheetsManager,t,e);if(n||(n={refs:0,sheet:null},y.default.set(this.sheetsManager,t,e,n)),0===n.refs){var r;this.sheetsCache&&(r=y.default.get(this.sheetsCache,t,e)),r||((r=this.createSheet(e)).attach(),this.sheetsCache&&y.default.set(this.sheetsCache,t,e,r)),n.sheet=r;var i=this.context[g.default.sheetsRegistry];i&&i.add(r)}n.refs+=1}}},{key:"createSheet",value:function(e){var t=this.stylesCreatorSaved.create(e,k),r=k;return this.jss.createStyleSheet(t,(0,a.default)({meta:r,classNamePrefix:r,flip:"boolean"===typeof w?w:"rtl"===e.direction,link:!1},this.sheetOptions,this.stylesCreatorSaved.options,{name:k||n.displayName},B))}},{key:"detach",value:function(e){if(!this.disableStylesGeneration){var t=y.default.get(this.sheetsManager,this.stylesCreatorSaved,e);if(t.refs-=1,0===t.refs){y.default.delete(this.sheetsManager,this.stylesCreatorSaved,e),this.jss.removeStyleSheet(t.sheet);var n=this.context[g.default.sheetsRegistry];n&&n.remove(t.sheet)}}}},{key:"render",value:function(){var e=this.props,t=(e.classes,e.innerRef),r=(0,f.default)(e,["classes","innerRef"]),i=(0,E.default)({theme:this.theme,name:k,props:r});return v&&!i.theme&&(i.theme=this.theme),h.default.createElement(n,(0,a.default)({},i,{classes:this.getClasses(),ref:t}))}}]),t}(h.default.Component);return F.contextTypes=(0,a.default)((r={muiThemeProviderOptions:d.default.object},(0,i.default)(r,g.default.jss,d.default.object),(0,i.default)(r,g.default.sheetOptions,d.default.object),(0,i.default)(r,g.default.sheetsRegistry,d.default.object),r),D?x.default.contextTypes:{}),(0,p.default)(F,n),F}});t.default=function(e,t){return A.ponyfillGlobal.__MUI_STYLES__.withStyles(e,(0,a.default)({defaultTheme:S},t))}},function(e,t,n){"use strict";n.d(t,"m",function(){return i}),n.d(t,"f",function(){return a}),n.d(t,"c",function(){return o}),n.d(t,"j",function(){return s}),n.d(t,"a",function(){return l}),n.d(t,"g",function(){return c}),n.d(t,"i",function(){return u}),n.d(t,"d",function(){return f}),n.d(t,"h",function(){return h}),n.d(t,"b",function(){return d}),n.d(t,"k",function(){return p}),n.d(t,"l",function(){return A}),n.d(t,"e",function(){return v});var r=n(28),i=function(e){return null===e||void 0===e},a=function(e){return null!==e&&void 0!==e},o=function(e){return"function"===typeof e},s=function(e){return"string"===typeof e},l=Array.isArray,c=function(e){return e&&!l(e)&&"object"===typeof e},u=function(e){return e&&o(e.then)},f=function(e){return e&&o(e.next)&&o(e.throw)},h=function e(t){return t&&(s(t)||A(t)||o(t)||l(t)&&t.every(e))},d=function(e){return e&&o(e.take)&&o(e.close)},p=function(e){return o(e)&&e.hasOwnProperty("toString")},A=function(e){return Boolean(e)&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype},v=function(e){return d(e)&&e[r.e]}},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(489))},function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(494))},function(e,t,n){"use strict";n.r(t);var r=n(223),i=n.n(r);n.d(t,"componentPropType",function(){return i.a});var a=n(224),o=n.n(a);n.d(t,"chainPropTypes",function(){return o.a});var s=n(225),l=n.n(s);n.d(t,"exactProp",function(){return l.a});var c=n(226),u=n.n(c);n.d(t,"getDisplayName",function(){return u.a});var f=n(227),h=n.n(f);n.d(t,"ponyfillGlobal",function(){return h.a})},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=r(n(365)),a=r(n(8)),o=r(n(10)),s=r(n(0)),l=r(n(222)),c=n(139),u=n(49),f=n(234),h=r(n(235)),d={};var p=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.withTheme,r=void 0!==n&&n,p=t.name,A=t.defaultTheme,v=(0,o.default)(t,["withTheme","name","defaultTheme"]),g=(0,h.default)(e),m=g.themingEnabled||"string"===typeof p||r,b=A||d,y=p||"Hook";return g.options={index:(0,f.increment)(),name:p,meta:y,classNamePrefix:y},function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=m&&s.default.useContext(l.default)||b,n=(0,a.default)({},s.default.useContext(c.StylesContext),v),r=!1,o=s.default.useState(function(){return r=!0,{}}),f=(0,i.default)(o,1)[0];return s.default.useMemo(function(){(0,u.attach)({name:p,props:e,state:f,stylesCreator:g,stylesOptions:n,theme:t})},[t]),s.default.useEffect(function(){r||(0,u.update)({props:e,state:f,stylesCreator:g,stylesOptions:n,theme:t})}),s.default.useEffect(function(){return function(){(0,u.detach)({state:f,stylesCreator:g,stylesOptions:n,theme:t})}},[t]),(0,u.getClasses)({classes:e.classes,Component:void 0,state:f,stylesOptions:n})}};t.default=p},function(e,t,n){"use strict";var r=function(){};e.exports=r},function(e,t,n){"use strict";t.__esModule=!0;var r,i=n(267),a=(r=i)&&r.__esModule?r:{default:r};t.default=function(e,t,n){return t in e?(0,a.default)(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t){function n(e,t){for(var n=0;n>8&15|t>>4&240,t>>4&15|240&t,(15&t)<<4|15&t,1):(t=u.exec(e))?b(parseInt(t[1],16)):(t=f.exec(e))?new k(t[1],t[2],t[3],1):(t=h.exec(e))?new k(255*t[1]/100,255*t[2]/100,255*t[3]/100,1):(t=d.exec(e))?y(t[1],t[2],t[3],t[4]):(t=p.exec(e))?y(255*t[1]/100,255*t[2]/100,255*t[3]/100,t[4]):(t=A.exec(e))?E(t[1],t[2]/100,t[3]/100,1):(t=v.exec(e))?E(t[1],t[2]/100,t[3]/100,t[4]):g.hasOwnProperty(e)?b(g[e]):"transparent"===e?new k(NaN,NaN,NaN,0):null}function b(e){return new k(e>>16&255,e>>8&255,255&e,1)}function y(e,t,n,r){return r<=0&&(e=t=n=NaN),new k(e,t,n,r)}function w(e){return e instanceof a||(e=m(e)),e?new k((e=e.rgb()).r,e.g,e.b,e.opacity):new k}function x(e,t,n,r){return 1===arguments.length?w(e):new k(e,t,n,null==r?1:r)}function k(e,t,n,r){this.r=+e,this.g=+t,this.b=+n,this.opacity=+r}function _(e){return((e=Math.max(0,Math.min(255,Math.round(e)||0)))<16?"0":"")+e.toString(16)}function E(e,t,n,r){return r<=0?e=t=n=NaN:n<=0||n>=1?e=t=NaN:t<=0&&(e=NaN),new M(e,t,n,r)}function C(e,t,n,r){return 1===arguments.length?function(e){if(e instanceof M)return new M(e.h,e.s,e.l,e.opacity);if(e instanceof a||(e=m(e)),!e)return new M;if(e instanceof M)return e;var t=(e=e.rgb()).r/255,n=e.g/255,r=e.b/255,i=Math.min(t,n,r),o=Math.max(t,n,r),s=NaN,l=o-i,c=(o+i)/2;return l?(s=t===o?(n-r)/l+6*(n0&&c<1?0:s,new M(s,l,c,e.opacity)}(e):new M(e,t,n,null==r?1:r)}function M(e,t,n,r){this.h=+e,this.s=+t,this.l=+n,this.opacity=+r}function T(e,t,n){return 255*(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)}r(a,m,{displayable:function(){return this.rgb().displayable()},hex:function(){return this.rgb().hex()},toString:function(){return this.rgb()+""}}),r(k,x,i(a,{brighter:function(e){return e=null==e?1/.7:Math.pow(1/.7,e),new k(this.r*e,this.g*e,this.b*e,this.opacity)},darker:function(e){return e=null==e?.7:Math.pow(.7,e),new k(this.r*e,this.g*e,this.b*e,this.opacity)},rgb:function(){return this},displayable:function(){return 0<=this.r&&this.r<=255&&0<=this.g&&this.g<=255&&0<=this.b&&this.b<=255&&0<=this.opacity&&this.opacity<=1},hex:function(){return"#"+_(this.r)+_(this.g)+_(this.b)},toString:function(){var e=this.opacity;return(1===(e=isNaN(e)?1:Math.max(0,Math.min(1,e)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===e?")":", "+e+")")}})),r(M,C,i(a,{brighter:function(e){return e=null==e?1/.7:Math.pow(1/.7,e),new M(this.h,this.s,this.l*e,this.opacity)},darker:function(e){return e=null==e?.7:Math.pow(.7,e),new M(this.h,this.s,this.l*e,this.opacity)},rgb:function(){var e=this.h%360+360*(this.h<0),t=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*t,i=2*n-r;return new k(T(e>=240?e-240:e+120,i,r),T(e,i,r),T(e<120?e+240:e-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));var L=Math.PI/180,z=180/Math.PI,S=.96422,B=1,I=.82521,D=4/29,F=6/29,R=3*F*F,O=F*F*F;function P(e){if(e instanceof V)return new V(e.l,e.a,e.b,e.opacity);if(e instanceof Y){if(isNaN(e.h))return new V(e.l,0,0,e.opacity);var t=e.h*L;return new V(e.l,Math.cos(t)*e.c,Math.sin(t)*e.c,e.opacity)}e instanceof k||(e=w(e));var n,r,i=G(e.r),a=G(e.g),o=G(e.b),s=j((.2225045*i+.7168786*a+.0606169*o)/B);return i===a&&a===o?n=r=s:(n=j((.4360747*i+.3850649*a+.1430804*o)/S),r=j((.0139322*i+.0971045*a+.7141733*o)/I)),new V(116*s-16,500*(n-s),200*(s-r),e.opacity)}function N(e,t,n,r){return 1===arguments.length?P(e):new V(e,t,n,null==r?1:r)}function V(e,t,n,r){this.l=+e,this.a=+t,this.b=+n,this.opacity=+r}function j(e){return e>O?Math.pow(e,1/3):e/R+D}function H(e){return e>F?e*e*e:R*(e-D)}function W(e){return 255*(e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055)}function G(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function Z(e){if(e instanceof Y)return new Y(e.h,e.c,e.l,e.opacity);if(e instanceof V||(e=P(e)),0===e.a&&0===e.b)return new Y(NaN,0,e.l,e.opacity);var t=Math.atan2(e.b,e.a)*z;return new Y(t<0?t+360:t,Math.sqrt(e.a*e.a+e.b*e.b),e.l,e.opacity)}function U(e,t,n,r){return 1===arguments.length?Z(e):new Y(e,t,n,null==r?1:r)}function Y(e,t,n,r){this.h=+e,this.c=+t,this.l=+n,this.opacity=+r}r(V,N,i(a,{brighter:function(e){return new V(this.l+18*(null==e?1:e),this.a,this.b,this.opacity)},darker:function(e){return new V(this.l-18*(null==e?1:e),this.a,this.b,this.opacity)},rgb:function(){var e=(this.l+16)/116,t=isNaN(this.a)?e:e+this.a/500,n=isNaN(this.b)?e:e-this.b/200;return new k(W(3.1338561*(t=S*H(t))-1.6168667*(e=B*H(e))-.4906146*(n=I*H(n))),W(-.9787684*t+1.9161415*e+.033454*n),W(.0719453*t-.2289914*e+1.4052427*n),this.opacity)}})),r(Y,U,i(a,{brighter:function(e){return new Y(this.h,this.c,this.l+18*(null==e?1:e),this.opacity)},darker:function(e){return new Y(this.h,this.c,this.l-18*(null==e?1:e),this.opacity)},rgb:function(){return P(this).rgb()}}));var Q=-.14861,X=1.78277,J=-.29227,$=-.90649,q=1.97294,K=q*$,ee=q*X,te=X*J-$*Q;function ne(e,t,n,r){return 1===arguments.length?function(e){if(e instanceof re)return new re(e.h,e.s,e.l,e.opacity);e instanceof k||(e=w(e));var t=e.r/255,n=e.g/255,r=e.b/255,i=(te*r+K*t-ee*n)/(te+K-ee),a=r-i,o=(q*(n-i)-J*a)/$,s=Math.sqrt(o*o+a*a)/(q*i*(1-i)),l=s?Math.atan2(o,a)*z-120:NaN;return new re(l<0?l+360:l,s,i,e.opacity)}(e):new re(e,t,n,null==r?1:r)}function re(e,t,n,r){this.h=+e,this.s=+t,this.l=+n,this.opacity=+r}r(re,ne,i(a,{brighter:function(e){return e=null==e?1/.7:Math.pow(1/.7,e),new re(this.h,this.s,this.l*e,this.opacity)},darker:function(e){return e=null==e?.7:Math.pow(.7,e),new re(this.h,this.s,this.l*e,this.opacity)},rgb:function(){var e=isNaN(this.h)?0:(this.h+120)*L,t=+this.l,n=isNaN(this.s)?0:this.s*t*(1-t),r=Math.cos(e),i=Math.sin(e);return new k(255*(t+n*(Q*r+X*i)),255*(t+n*(J*r+$*i)),255*(t+n*(q*r)),this.opacity)}})),n.d(t,"a",function(){return m}),n.d(t,"f",function(){return x}),n.d(t,"d",function(){return C}),n.d(t,"e",function(){return N}),n.d(t,"c",function(){return U}),n.d(t,"b",function(){return ne})},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createGenerateClassName",{enumerable:!0,get:function(){return i.default}}),Object.defineProperty(t,"createMuiTheme",{enumerable:!0,get:function(){return a.default}}),Object.defineProperty(t,"jssPreset",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(t,"MuiThemeProvider",{enumerable:!0,get:function(){return s.default}}),Object.defineProperty(t,"createStyles",{enumerable:!0,get:function(){return l.default}}),Object.defineProperty(t,"withStyles",{enumerable:!0,get:function(){return c.default}}),Object.defineProperty(t,"withTheme",{enumerable:!0,get:function(){return u.default}});var i=r(n(239)),a=r(n(184)),o=r(n(236)),s=r(n(501)),l=r(n(504)),c=r(n(14)),u=r(n(146))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(490))},function(e,t,n){"use strict";function r(){return(r=Object.assign||function(e){for(var t=1;t=1?(n=1,t-1):Math.floor(n*t),a=e[r],o=e[r+1],s=r>0?e[r-1]:2*a-o,l=r180||n<-180?n-360*Math.round(n/360):n):s(isNaN(e)?t:e)}function u(e){return 1===(e=+e)?f:function(t,n){return n-t?function(e,t,n){return e=Math.pow(e,n),t=Math.pow(t,n)-e,n=1/n,function(r){return Math.pow(e+r*t,n)}}(t,n,e):s(isNaN(t)?n:t)}}function f(e,t){var n=t-e;return n?l(e,n):s(isNaN(e)?t:e)}var h=function e(t){var n=u(t);function i(e,t){var i=n((e=Object(r.f)(e)).r,(t=Object(r.f)(t)).r),a=n(e.g,t.g),o=n(e.b,t.b),s=f(e.opacity,t.opacity);return function(t){return e.r=i(t),e.g=a(t),e.b=o(t),e.opacity=s(t),e+""}}return i.gamma=e,i}(1);function d(e){return function(t){var n,i,a=t.length,o=new Array(a),s=new Array(a),l=new Array(a);for(n=0;na&&(i=t.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(n=n[0])===(r=r[0])?s[o]?s[o]+=r:s[++o]=r:(s[++o]=null,l.push({i:o,x:m(n,r)})),a=w.lastIndex;return a180?t+=360:t-e>180&&(e+=360),a.push({i:n.push(i(n)+"rotate(",null,r)-2,x:m(e,t)})):t&&n.push(i(n)+"rotate("+t+r)}(a.rotate,o.rotate,s,l),function(e,t,n,a){e!==t?a.push({i:n.push(i(n)+"skewX(",null,r)-2,x:m(e,t)}):t&&n.push(i(n)+"skewX("+t+r)}(a.skewX,o.skewX,s,l),function(e,t,n,r,a,o){if(e!==n||t!==r){var s=a.push(i(a)+"scale(",null,",",null,")");o.push({i:s-4,x:m(e,n)},{i:s-2,x:m(t,r)})}else 1===n&&1===r||a.push(i(a)+"scale("+n+","+r+")")}(a.scaleX,a.scaleY,o.scaleX,o.scaleY,s,l),a=o=null,function(e){for(var t,n=-1,r=l.length;++n-1?e[n]:void 0},t.createChainedFunction=function(){for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return function(n){var r=t.withTheme,h=void 0!==r&&r,p=t.name,A=t.defaultTheme,C=(0,c.default)(t,["withTheme","name","defaultTheme"]),M=(0,v.default)(e),T=M.themingEnabled||"string"===typeof p||h,L=A||w,z=p;M.options={index:(0,d.increment)(),name:p||n.displayName,meta:z,classNamePrefix:z};var S=function(e){function t(){var e;return(0,i.default)(this,t),(e=(0,o.default)(this,(0,s.default)(t).call(this))).state={styles:{}},e}return(0,l.default)(t,e),(0,a.default)(t,[{key:"componentDidUpdate",value:function(){_({props:this.props,state:this.state.styles})}},{key:"componentWillUnmount",value:function(){E({state:this.state.styles,stylesCreator:M,stylesOptions:this.props.stylesOptions,theme:this.props.theme})}},{key:"render",value:function(){var e=this,t=this.props,r=t.classes,i=t.theme,a=t.innerRef,o=t.stylesOptions,s=(0,c.default)(t,["classes","theme","innerRef","stylesOptions"]),l=this.theme;this.theme=i,l!==i&&(k({name:p,props:this.props,state:this.state.styles,stylesCreator:M,stylesOptions:o,theme:i}),l&&setTimeout(function(){E({state:e.state.styles,stylesCreator:M,stylesOptions:o,theme:l})}));var d=(0,g.default)({theme:i,name:p,props:s});return h&&(d.theme=i),f.default.createElement(n,(0,u.default)({ref:a,classes:x({classes:r,Component:n,state:this.state.styles,stylesOptions:o})},d))}}]),t}(f.default.Component),B=f.default.forwardRef(function(e,t){return f.default.createElement(b.StylesContext.Consumer,null,function(n){var r=(0,u.default)({},n,C);return T?f.default.createElement(y.default.Consumer,null,function(n){return f.default.createElement(S,(0,u.default)({stylesOptions:r,ref:t,theme:n||L},e))}):f.default.createElement(S,(0,u.default)({stylesOptions:r,ref:t,theme:L},e))})});return(0,m.default)(B,n),B}};t.default=C},function(e,t,n){"use strict";!function e(){if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(358)},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(449))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(462))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(470))},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,"a",function(){return r})},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"===typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(499))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(505))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(507))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(509))},function(e,t,n){"use strict";n.r(t);var r=Math.PI,i=2*r,a=i-1e-6;function o(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function s(){return new o}o.prototype=s.prototype={constructor:o,moveTo:function(e,t){this._+="M"+(this._x0=this._x1=+e)+","+(this._y0=this._y1=+t)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(e,t){this._+="L"+(this._x1=+e)+","+(this._y1=+t)},quadraticCurveTo:function(e,t,n,r){this._+="Q"+ +e+","+ +t+","+(this._x1=+n)+","+(this._y1=+r)},bezierCurveTo:function(e,t,n,r,i,a){this._+="C"+ +e+","+ +t+","+ +n+","+ +r+","+(this._x1=+i)+","+(this._y1=+a)},arcTo:function(e,t,n,i,a){e=+e,t=+t,n=+n,i=+i,a=+a;var o=this._x1,s=this._y1,l=n-e,c=i-t,u=o-e,f=s-t,h=u*u+f*f;if(a<0)throw new Error("negative radius: "+a);if(null===this._x1)this._+="M"+(this._x1=e)+","+(this._y1=t);else if(h>1e-6)if(Math.abs(f*l-c*u)>1e-6&&a){var d=n-o,p=i-s,A=l*l+c*c,v=d*d+p*p,g=Math.sqrt(A),m=Math.sqrt(h),b=a*Math.tan((r-Math.acos((A+h-v)/(2*g*m)))/2),y=b/m,w=b/g;Math.abs(y-1)>1e-6&&(this._+="L"+(e+y*u)+","+(t+y*f)),this._+="A"+a+","+a+",0,0,"+ +(f*d>u*p)+","+(this._x1=e+w*l)+","+(this._y1=t+w*c)}else this._+="L"+(this._x1=e)+","+(this._y1=t);else;},arc:function(e,t,n,o,s,l){e=+e,t=+t;var c=(n=+n)*Math.cos(o),u=n*Math.sin(o),f=e+c,h=t+u,d=1^l,p=l?o-s:s-o;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+f+","+h:(Math.abs(this._x1-f)>1e-6||Math.abs(this._y1-h)>1e-6)&&(this._+="L"+f+","+h),n&&(p<0&&(p=p%i+i),p>a?this._+="A"+n+","+n+",0,1,"+d+","+(e-c)+","+(t-u)+"A"+n+","+n+",0,1,"+d+","+(this._x1=f)+","+(this._y1=h):p>1e-6&&(this._+="A"+n+","+n+",0,"+ +(p>=r)+","+d+","+(this._x1=e+n*Math.cos(s))+","+(this._y1=t+n*Math.sin(s))))},rect:function(e,t,n,r){this._+="M"+(this._x0=this._x1=+e)+","+(this._y0=this._y1=+t)+"h"+ +n+"v"+ +r+"h"+-n+"Z"},toString:function(){return this._}};var l=s;n.d(t,"path",function(){return l})},function(e,t,n){e.exports=n(607)},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(447))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(516))},function(e,t,n){"use strict";n.r(t);var r={value:function(){}};function i(){for(var e,t=0,n=arguments.length,r={};t=0&&(t=e.slice(n+1),e=e.slice(0,n)),e&&!r.hasOwnProperty(e))throw new Error("unknown type: "+e);return{type:e,name:t}})),l=-1,c=a.length;if(!(arguments.length<2)){if(null!=t&&"function"!==typeof t)throw new Error("invalid callback: "+t);for(;++l0)for(var n,r,i=new Array(n),a=0;a=0&&t._call.call(null,e),t=t._next;--a}function b(){u=(c=h.now())+f,a=o=0;try{m()}finally{a=0,function(){var e,t,n=r,a=1/0;for(;n;)n._call?(a>n._time&&(a=n._time),e=n,n=n._next):(t=n._next,n._next=null,n=e?e._next=t:r=t);i=e,w(a)}(),u=0}}function y(){var e=h.now(),t=e-c;t>l&&(f-=t,c=e)}function w(e){a||(o&&(o=clearTimeout(o)),e-u>24?(e<1/0&&(o=setTimeout(b,e-h.now()-f)),s&&(s=clearInterval(s))):(s||(c=h.now(),s=setInterval(y,l)),a=1,d(b)))}v.prototype=g.prototype={constructor:v,restart:function(e,t,n){if("function"!==typeof e)throw new TypeError("callback is not a function");n=(null==n?p():+n)+(null==t?0:+t),this._next||i===this||(i?i._next=this:r=this,i=this),this._call=e,this._time=n,w()},stop:function(){this._call&&(this._call=null,this._time=1/0,w())}};var x=function(e,t,n){var r=new v;return t=null==t?0:+t,r.restart(function(n){r.stop(),e(n+t)},t,n),r},k=function(e,t,n){var r=new v,i=t;return null==t?(r.restart(e,t,n),r):(t=+t,n=null==n?p():+n,r.restart(function a(o){o+=i,r.restart(a,i+=t,n),e(o)},t,n),r)};n.d(t,"now",function(){return p}),n.d(t,"timer",function(){return g}),n.d(t,"timerFlush",function(){return m}),n.d(t,"timeout",function(){return x}),n.d(t,"interval",function(){return k})},function(e,t,n){"use strict";n.r(t);var r=function(e,t){if((n=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"))<0)return null;var n,r=e.slice(0,n);return[r.length>1?r[0]+r.slice(2):r,+e.slice(n+1)]},i=function(e){return(e=r(Math.abs(e)))?e[1]:NaN},a=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function o(e){return new s(e)}function s(e){if(!(t=a.exec(e)))throw new Error("invalid format: "+e);var t;this.fill=t[1]||" ",this.align=t[2]||">",this.sign=t[3]||"-",this.symbol=t[4]||"",this.zero=!!t[5],this.width=t[6]&&+t[6],this.comma=!!t[7],this.precision=t[8]&&+t[8].slice(1),this.trim=!!t[9],this.type=t[10]||""}o.prototype=s.prototype,s.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(null==this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(null==this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var l,c,u,f,h=function(e){e:for(var t,n=e.length,r=1,i=-1;r0){if(!+e[r])break e;i=0}}return i>0?e.slice(0,i)+e.slice(t+1):e},d=function(e,t){var n=r(e,t);if(!n)return e+"";var i=n[0],a=n[1];return a<0?"0."+new Array(-a).join("0")+i:i.length>a+1?i.slice(0,a+1)+"."+i.slice(a+1):i+new Array(a-i.length+2).join("0")},p={"%":function(e,t){return(100*e).toFixed(t)},b:function(e){return Math.round(e).toString(2)},c:function(e){return e+""},d:function(e){return Math.round(e).toString(10)},e:function(e,t){return e.toExponential(t)},f:function(e,t){return e.toFixed(t)},g:function(e,t){return e.toPrecision(t)},o:function(e){return Math.round(e).toString(8)},p:function(e,t){return d(100*e,t)},r:d,s:function(e,t){var n=r(e,t);if(!n)return e+"";var i=n[0],a=n[1],o=a-(l=3*Math.max(-8,Math.min(8,Math.floor(a/3))))+1,s=i.length;return o===s?i:o>s?i+new Array(o-s+1).join("0"):o>0?i.slice(0,o)+"."+i.slice(o):"0."+new Array(1-o).join("0")+r(e,Math.max(0,t+o-1))[0]},X:function(e){return Math.round(e).toString(16).toUpperCase()},x:function(e){return Math.round(e).toString(16)}},A=function(e){return e},v=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"],g=function(e){var t,n,r=e.grouping&&e.thousands?(t=e.grouping,n=e.thousands,function(e,r){for(var i=e.length,a=[],o=0,s=t[0],l=0;i>0&&s>0&&(l+s+1>r&&(s=Math.max(1,r-l)),a.push(e.substring(i-=s,i+s)),!((l+=s+1)>r));)s=t[o=(o+1)%t.length];return a.reverse().join(n)}):A,a=e.currency,s=e.decimal,c=e.numerals?function(e){return function(t){return t.replace(/[0-9]/g,function(t){return e[+t]})}}(e.numerals):A,u=e.percent||"%";function f(e){var t=(e=o(e)).fill,n=e.align,i=e.sign,f=e.symbol,d=e.zero,A=e.width,g=e.comma,m=e.precision,b=e.trim,y=e.type;"n"===y?(g=!0,y="g"):p[y]||(null==m&&(m=12),b=!0,y="g"),(d||"0"===t&&"="===n)&&(d=!0,t="0",n="=");var w="$"===f?a[0]:"#"===f&&/[boxX]/.test(y)?"0"+y.toLowerCase():"",x="$"===f?a[1]:/[%p]/.test(y)?u:"",k=p[y],_=/[defgprs%]/.test(y);function E(e){var a,o,u,f=w,p=x;if("c"===y)p=k(e)+p,e="";else{var E=(e=+e)<0;if(e=k(Math.abs(e),m),b&&(e=h(e)),E&&0===+e&&(E=!1),f=(E?"("===i?i:"-":"-"===i||"("===i?"":i)+f,p=("s"===y?v[8+l/3]:"")+p+(E&&"("===i?")":""),_)for(a=-1,o=e.length;++a(u=e.charCodeAt(a))||u>57){p=(46===u?s+e.slice(a+1):e.slice(a))+p,e=e.slice(0,a);break}}g&&!d&&(e=r(e,1/0));var C=f.length+e.length+p.length,M=C>1)+f+e+p+M.slice(C);break;default:e=M+f+e+p}return c(e)}return m=null==m?6:/[gprs]/.test(y)?Math.max(1,Math.min(21,m)):Math.max(0,Math.min(20,m)),E.toString=function(){return e+""},E}return{format:f,formatPrefix:function(e,t){var n=f(((e=o(e)).type="f",e)),r=3*Math.max(-8,Math.min(8,Math.floor(i(t)/3))),a=Math.pow(10,-r),s=v[8+r/3];return function(e){return n(a*e)+s}}}};function m(e){return c=g(e),u=c.format,f=c.formatPrefix,c}m({decimal:".",thousands:",",grouping:[3],currency:["$",""]});var b=function(e){return Math.max(0,-i(Math.abs(e)))},y=function(e,t){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(i(t)/3)))-i(Math.abs(e)))},w=function(e,t){return e=Math.abs(e),t=Math.abs(t)-e,Math.max(0,i(t)-i(e))+1};n.d(t,"formatDefaultLocale",function(){return m}),n.d(t,"format",function(){return u}),n.d(t,"formatPrefix",function(){return f}),n.d(t,"formatLocale",function(){return g}),n.d(t,"formatSpecifier",function(){return o}),n.d(t,"precisionFixed",function(){return b}),n.d(t,"precisionPrefix",function(){return y}),n.d(t,"precisionRound",function(){return w})},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(448))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(473))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(446))},function(e,t,n){"use strict";n.r(t),n.d(t,"isBrowser",function(){return i});var r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i="object"===("undefined"===typeof window?"undefined":r(window))&&"object"===("undefined"===typeof document?"undefined":r(document))&&9===document.nodeType;t.default=i},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(582))},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}},function(e,t,n){"use strict";n.r(t);var r=n(4),i=n(64),a=n(73),o=Object(i.dispatch)("start","end","cancel","interrupt"),s=[],l=0,c=1,u=2,f=3,h=4,d=5,p=6,A=function(e,t,n,r,i,A){var v=e.__transition;if(v){if(n in v)return}else e.__transition={};!function(e,t,n){var r,i=e.__transition;function o(d){var A,v,g,m;if(n.state!==c)return l();for(A in i)if((m=i[A]).name===n.name){if(m.state===f)return Object(a.timeout)(o);m.state===h?(m.state=p,m.timer.stop(),m.on.call("interrupt",e,e.__data__,m.index,m.group),delete i[A]):+Al)throw new Error("too late; already scheduled");return n}function g(e,t){var n=m(e,t);if(n.state>f)throw new Error("too late; already running");return n}function m(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}var b=function(e,t){var n,r,i,a=e.__transition,o=!0;if(a){for(i in t=null==t?null:t+"",a)(n=a[i]).name===t?(r=n.state>u&&n.state=0&&(e=e.slice(0,t)),!e||"start"===e})}(t)?v:g;return function(){var o=a(this,e),s=o.on;s!==r&&(i=(r=s).copy()).on(t,n),o.on=i}}(n,e,t))},attr:function(e,t){var n=Object(r.namespace)(e),i="transform"===n?y.interpolateTransformSvg:k;return this.attrTween(e,"function"===typeof t?(n.local?function(e,t,n){var r,i,a;return function(){var o,s,l=n(this);if(null!=l)return(o=this.getAttributeNS(e.space,e.local))===(s=l+"")?null:o===r&&s===i?a:(i=s,a=t(r=o,l));this.removeAttributeNS(e.space,e.local)}}:function(e,t,n){var r,i,a;return function(){var o,s,l=n(this);if(null!=l)return(o=this.getAttribute(e))===(s=l+"")?null:o===r&&s===i?a:(i=s,a=t(r=o,l));this.removeAttribute(e)}})(n,i,w(this,"attr."+e,t)):null==t?(n.local?function(e){return function(){this.removeAttributeNS(e.space,e.local)}}:function(e){return function(){this.removeAttribute(e)}})(n):(n.local?function(e,t,n){var r,i,a=n+"";return function(){var o=this.getAttributeNS(e.space,e.local);return o===a?null:o===r?i:i=t(r=o,n)}}:function(e,t,n){var r,i,a=n+"";return function(){var o=this.getAttribute(e);return o===a?null:o===r?i:i=t(r=o,n)}})(n,i,t))},attrTween:function(e,t){var n="attr."+e;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==t)return this.tween(n,null);if("function"!==typeof t)throw new Error;var i=Object(r.namespace)(e);return this.tween(n,(i.local?function(e,t){var n,r;function i(){var i=t.apply(this,arguments);return i!==r&&(n=(r=i)&&function(e,t){return function(n){this.setAttributeNS(e.space,e.local,t(n))}}(e,i)),n}return i._value=t,i}:function(e,t){var n,r;function i(){var i=t.apply(this,arguments);return i!==r&&(n=(r=i)&&function(e,t){return function(n){this.setAttribute(e,t(n))}}(e,i)),n}return i._value=t,i})(i,t))},style:function(e,t,n){var i="transform"===(e+="")?y.interpolateTransformCss:k;return null==t?this.styleTween(e,function(e,t){var n,i,a;return function(){var o=Object(r.style)(this,e),s=(this.style.removeProperty(e),Object(r.style)(this,e));return o===s?null:o===n&&s===i?a:a=t(n=o,i=s)}}(e,i)).on("end.style."+e,E(e)):"function"===typeof t?this.styleTween(e,function(e,t,n){var i,a,o;return function(){var s=Object(r.style)(this,e),l=n(this),c=l+"";return null==l&&(this.style.removeProperty(e),c=l=Object(r.style)(this,e)),s===c?null:s===i&&c===a?o:(a=c,o=t(i=s,l))}}(e,i,w(this,"style."+e,t))).each(function(e,t){var n,r,i,a,o="style."+t,s="end."+o;return function(){var l=g(this,e),c=l.on,u=null==l.value[o]?a||(a=E(t)):void 0;c===n&&i===u||(r=(n=c).copy()).on(s,i=u),l.on=r}}(this._id,e)):this.styleTween(e,function(e,t,n){var i,a,o=n+"";return function(){var s=Object(r.style)(this,e);return s===o?null:s===i?a:a=t(i=s,n)}}(e,i,t),n).on("end.style."+e,null)},styleTween:function(e,t,n){var r="style."+(e+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==t)return this.tween(r,null);if("function"!==typeof t)throw new Error;return this.tween(r,function(e,t,n){var r,i;function a(){var a=t.apply(this,arguments);return a!==i&&(r=(i=a)&&function(e,t,n){return function(r){this.style.setProperty(e,t(r),n)}}(e,a,n)),r}return a._value=t,a}(e,t,null==n?"":n))},text:function(e){return this.tween("text","function"===typeof e?function(e){return function(){var t=e(this);this.textContent=null==t?"":t}}(w(this,"text",e)):function(e){return function(){this.textContent=e}}(null==e?"":e+""))},remove:function(){return this.on("end.remove",(e=this._id,function(){var t=this.parentNode;for(var n in this.__transition)if(+n!==e)return;t&&t.removeChild(this)}));var e},tween:function(e,t){var n=this._id;if(e+="",arguments.length<2){for(var r,i=m(this.node(),n).tween,a=0,o=i.length;ac&&n.name===t)return new M([[e]],I,t,+r);return null};n.d(t,"transition",function(){return T}),n.d(t,"active",function(){return D}),n.d(t,"interrupt",function(){return b})},function(e,t,n){"use strict";n.d(t,"e",function(){return s}),n.d(t,"c",function(){return c}),n.d(t,"b",function(){return f}),n.d(t,"a",function(){return p}),n.d(t,"d",function(){return d});var r=n(168),i=function(){return Math.random().toString(36).substring(7).split("").join(".")},a={INIT:"@@redux/INIT"+i(),REPLACE:"@@redux/REPLACE"+i(),PROBE_UNKNOWN_ACTION:function(){return"@@redux/PROBE_UNKNOWN_ACTION"+i()}};function o(e){if("object"!==typeof e||null===e)return!1;for(var t=e;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function s(e,t,n){var i;if("function"===typeof t&&"function"===typeof n||"function"===typeof n&&"function"===typeof arguments[3])throw new Error("It looks like you are passing several store enhancers to createStore(). This is not supported. Instead, compose them together to a single function");if("function"===typeof t&&"undefined"===typeof n&&(n=t,t=void 0),"undefined"!==typeof n){if("function"!==typeof n)throw new Error("Expected the enhancer to be a function.");return n(s)(e,t)}if("function"!==typeof e)throw new Error("Expected the reducer to be a function.");var l=e,c=t,u=[],f=u,h=!1;function d(){f===u&&(f=u.slice())}function p(){if(h)throw new Error("You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store.");return c}function A(e){if("function"!==typeof e)throw new Error("Expected the listener to be a function.");if(h)throw new Error("You may not call store.subscribe() while the reducer is executing. If you would like to be notified after the store has been updated, subscribe from a component and invoke store.getState() in the callback to access the latest state. See https://redux.js.org/api-reference/store#subscribe(listener) for more details.");var t=!0;return d(),f.push(e),function(){if(t){if(h)throw new Error("You may not unsubscribe from a store listener while the reducer is executing. See https://redux.js.org/api-reference/store#subscribe(listener) for more details.");t=!1,d();var n=f.indexOf(e);f.splice(n,1)}}}function v(e){if(!o(e))throw new Error("Actions must be plain objects. Use custom middleware for async actions.");if("undefined"===typeof e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?');if(h)throw new Error("Reducers may not dispatch actions.");try{h=!0,c=l(c,e)}finally{h=!1}for(var t=u=f,n=0;n=0||(i[n]=e[n]);return i}n.d(t,"a",function(){return r})},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(520))},function(e,t,n){"use strict";n(64);var r=n(4);var i=function(){r.event.preventDefault(),r.event.stopImmediatePropagation()},a=function(e){var t=e.document.documentElement,n=Object(r.select)(e).on("dragstart.drag",i,!0);"onselectstart"in t?n.on("selectstart.drag",i,!0):(t.__noselect=t.style.MozUserSelect,t.style.MozUserSelect="none")};function o(e,t){var n=e.document.documentElement,a=Object(r.select)(e).on("dragstart.drag",null);t&&(a.on("click.drag",i,!0),setTimeout(function(){a.on("click.drag",null)},0)),"onselectstart"in n?a.on("selectstart.drag",null):(n.style.MozUserSelect=n.__noselect,delete n.__noselect)}function s(e,t,n,r,i,a,o,s,l,c){this.target=e,this.type=t,this.subject=n,this.identifier=r,this.active=i,this.x=a,this.y=o,this.dx=s,this.dy=l,this._=c}s.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};n.d(t,"a",function(){return a}),n.d(t,"b",function(){return o})},function(e,t,n){"use strict";(function(e){n.d(t,"e",function(){return f}),n.d(t,"d",function(){return h}),n.d(t,"a",function(){return p}),n.d(t,"b",function(){return A}),n.d(t,"c",function(){return v}),n.d(t,"f",function(){return g});var r=n(41),i=n.n(r),a=n(42),o=n.n(a),s=n(43),l=n.n(s),c=n(294),u=n(0);function f(t){e&&Object({NODE_ENV:"production",PUBLIC_URL:"."})||console.error("[@ant-design/icons-react]: "+t+".")}function h(e){return"object"===typeof e&&"string"===typeof e.name&&"string"===typeof e.theme&&("object"===typeof e.icon||"function"===typeof e.icon)}function d(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce(function(t,n){var r=e[n];switch(n){case"class":t.className=r,delete t.class;break;default:t[n]=r}return t},{})}var p=function(){function e(){o()(this,e),this.collection={}}return l()(e,[{key:"clear",value:function(){this.collection={}}},{key:"delete",value:function(e){return delete this.collection[e]}},{key:"get",value:function(e){return this.collection[e]}},{key:"has",value:function(e){return Boolean(this.collection[e])}},{key:"set",value:function(e,t){return this.collection[e]=t,this}},{key:"size",get:function(){return Object.keys(this.collection).length}}]),e}();function A(e,t,n){return n?u.createElement(e.tag,i()({key:t},d(e.attrs),n),(e.children||[]).map(function(n,r){return A(n,t+"-"+e.tag+"-"+r)})):u.createElement(e.tag,i()({key:t},d(e.attrs)),(e.children||[]).map(function(n,r){return A(n,t+"-"+e.tag+"-"+r)}))}function v(e){return Object(c.generate)(e)[0]}function g(e,t){switch(t){case"fill":return e+"-fill";case"outline":return e+"-o";case"twotone":return e+"-twotone";default:throw new TypeError("Unknown theme type: "+t+", name: "+e)}}}).call(this,n(155))},function(e,t){function n(e){return(n="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function r(t){return"function"===typeof Symbol&&"symbol"===n(Symbol.iterator)?e.exports=r=function(e){return n(e)}:e.exports=r=function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":n(e)},r(t)}e.exports=r},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.convertHexToRGB=a,t.rgbToHex=function(e){if(0===e.indexOf("#"))return e;var t=o(e).values;return t=t.map(function(e){return function(e){var t=e.toString(16);return 1===t.length?"0".concat(t):t}(e)}),"#".concat(t.join(""))},t.decomposeColor=o,t.recomposeColor=s,t.getContrastRatio=function(e,t){var n=l(e),r=l(t);return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)},t.getLuminance=l,t.emphasize=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.15;return l(e)>.5?c(e,t):u(e,t)},t.fade=function(e,t){if(!e)return e;e=o(e),t=i(t),("rgb"===e.type||"hsl"===e.type)&&(e.type+="a");return e.values[3]=t,s(e)},t.darken=c,t.lighten=u;r(n(21));function i(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return en?n:e}function a(e){e=e.substr(1);var t=new RegExp(".{1,".concat(e.length/3,"}"),"g"),n=e.match(t);return n&&1===n[0].length&&(n=n.map(function(e){return e+e})),n?"rgb(".concat(n.map(function(e){return parseInt(e,16)}).join(", "),")"):""}function o(e){if("#"===e.charAt(0))return o(a(e));var t=e.indexOf("("),n=e.substring(0,t),r=e.substring(t+1,e.length-1).split(",");return{type:n,values:r=r.map(function(e){return parseFloat(e)})}}function s(e){var t=e.type,n=e.values;return-1!==t.indexOf("rgb")&&(n=n.map(function(e,t){return t<3?parseInt(e,10):e})),-1!==t.indexOf("hsl")&&(n[1]="".concat(n[1],"%"),n[2]="".concat(n[2],"%")),"".concat(e.type,"(").concat(n.join(", "),")")}function l(e){var t=o(e);if(-1!==t.type.indexOf("rgb")){var n=t.values.map(function(e){return(e/=255)<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)});return Number((.2126*n[0]+.7152*n[1]+.0722*n[2]).toFixed(3))}return t.values[2]/100}function c(e,t){if(!e)return e;if(e=o(e),t=i(t),-1!==e.type.indexOf("hsl"))e.values[2]*=1-t;else if(-1!==e.type.indexOf("rgb"))for(var n=0;n<3;n+=1)e.values[n]*=1-t;return s(e)}function u(e,t){if(!e)return e;if(e=o(e),t=i(t),-1!==e.type.indexOf("hsl"))e.values[2]+=(100-e.values[2])*t;else if(-1!==e.type.indexOf("rgb"))for(var n=0;n<3;n+=1)e.values[n]+=(255-e.values[n])*t;return s(e)}},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.isNumber=t.isString=t.formatMs=t.duration=t.easing=void 0;var i=r(n(10)),a=(r(n(21)),{easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"});t.easing=a;var o={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};t.duration=o;var s=function(e){return"".concat(Math.round(e),"ms")};t.formatMs=s;t.isString=function(e){return"string"===typeof e};t.isNumber=function(e){return!isNaN(parseFloat(e))};var l={easing:a,duration:o,create:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["all"],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.duration,r=void 0===n?o.standard:n,l=t.easing,c=void 0===l?a.easeInOut:l,u=t.delay,f=void 0===u?0:u;(0,i.default)(t,["duration","easing","delay"]);return(Array.isArray(e)?e:[e]).map(function(e){return"".concat(e," ").concat("string"===typeof r?r:s(r)," ").concat(c," ").concat("string"===typeof f?f:s(f))}).join(",")},getAutoHeightDuration:function(e){if(!e)return 0;var t=e/36;return Math.round(10*(4+15*Math.pow(t,.25)+t/5))}};t.default=l},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(450))},function(e,t,n){var r=n(134),i=n(261),a=n(200),o=Object.defineProperty;t.f=n(100)?Object.defineProperty:function(e,t,n){if(r(e),t=a(t,!0),r(n),i)try{return o(e,t,n)}catch(s){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){e.exports=!n(135)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(518))},function(e,t,n){"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}n.d(t,"a",function(){return r})},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=r(n(0)),a=(0,r(n(48)).default)(i.default.createElement(i.default.Fragment,null,i.default.createElement("path",{d:"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"}),i.default.createElement("path",{fill:"none",d:"M0 0h24v24H0z"})),"ExpandMore");t.default=a},function(e,t,n){"use strict";e.exports=function(){}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||(i[n]=e[n]);return i}(t,["children"]);if(delete r.in,delete r.mountOnEnter,delete r.unmountOnExit,delete r.appear,delete r.enter,delete r.exit,delete r.timeout,delete r.addEndListener,delete r.onEnter,delete r.onEntering,delete r.onEntered,delete r.onExit,delete r.onExiting,delete r.onExited,"function"===typeof n)return n(e,r);var a=i.default.Children.only(n);return i.default.cloneElement(a,r)},r}(i.default.Component);function d(){}h.contextTypes={transitionGroup:r.object},h.childContextTypes={transitionGroup:function(){}},h.propTypes={},h.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:d,onEntering:d,onEntered:d,onExit:d,onExiting:d,onExited:d},h.UNMOUNTED=0,h.EXITED=1,h.ENTERING=2,h.ENTERED=3,h.EXITING=4;var p=(0,o.polyfill)(h);t.default=p},function(e,t,n){"use strict";function r(e){return e&&"object"===typeof e&&"default"in e?e.default:e}Object.defineProperty(t,"__esModule",{value:!0});var i=r(n(23)),a=r(n(24)),o=r(n(25)),s=r(n(26)),l=r(n(27)),c=r(n(95)),u=r(n(10)),f=r(n(8)),h=r(n(0));r(n(1)),r(n(21));var d=function(){var e=null;return function(){if(null!==e)return e;var t,n,r,i=!1;try{window.addEventListener("test",null,(t={},n="passive",r={get:function(){i=!0}},Object.defineProperty(t,n,r)))}catch(a){}return e=i,i}()}(),p={capture:!1,passive:!1};function A(e){return f({},p,e)}function v(e,t,n){var r=[e,t];return r.push(d?n:n.capture),r}function g(e,t,n,r){e.addEventListener.apply(e,v(t,n,r))}function m(e,t,n,r){e.removeEventListener.apply(e,v(t,n,r))}var b=function(e){function t(){return i(this,t),o(this,s(t).apply(this,arguments))}return l(t,e),a(t,[{key:"componentDidMount",value:function(){this.applyListeners(g)}},{key:"componentDidUpdate",value:function(e){this.applyListeners(m,e),this.applyListeners(g)}},{key:"componentWillUnmount",value:function(){this.applyListeners(m)}},{key:"applyListeners",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.props,n=t.target;if(n){var r=n;"string"===typeof n&&(r=window[n]),function(e,t){e.children,e.target;var n=u(e,["children","target"]);Object.keys(n).forEach(function(e){if("on"===e.substring(0,2)){var r=n[e],i=c(r),a="object"===i;if(a||"function"===i){var o="capture"===e.substr(-7).toLowerCase(),s=e.substring(2).toLowerCase();s=o?s.substring(0,s.length-7):s,a?t(s,r.handler,r.options):t(s,r,A({capture:o}))}}})}(t,e.bind(null,r))}}},{key:"render",value:function(){return this.props.children||null}}]),t}(h.PureComponent);b.propTypes={},t.withOptions=function(e,t){return{handler:e,options:A(t)}},t.default=b},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(495))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(496))},function(e,t,n){var r=n(112);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t){e.exports=function(e){try{return!!e()}catch(t){return!0}}},function(e,t,n){"use strict";n.r(t);var r=!0;t.default=function(e,t){if(!r){if(e)return;var n="Warning: "+t;"undefined"!==typeof console&&console.warn(n);try{throw Error(n)}catch(i){}}}},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(589))},function(e,t,n){"use strict";function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}n.d(t,"a",function(){return r})},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.StylesContext=t.sheetsManager=void 0;var i=r(n(8)),a=r(n(10)),o=r(n(0)),s=(r(n(1)),r(n(21)),n(19),r(n(179))),l=n(228),c=r(n(180)),u=(0,l.create)((0,c.default)()),f=(0,s.default)(),h=new Map;t.sheetsManager=h;var d={disableGeneration:!1,generateClassName:f,jss:u,sheetsCache:"undefined"===typeof window?new Map:null,sheetsManager:h,sheetsRegistry:null},p=o.default.createContext(d);function A(e){var t=e.children,n=(0,a.default)(e,["children"]);return o.default.createElement(p.Consumer,null,function(e){return o.default.createElement(p.Provider,{value:(0,i.default)({},e,n)},t)})}t.StylesContext=p,A.defaultProps={disableGeneration:!1};var v=A;t.default=v},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!Array.isArray(e))return e;var n="";if(Array.isArray(e[0]))for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:"unnamed",t=arguments[1],n=arguments[2],o=n.jss,s=(0,a.default)(t),l=o.plugins.onCreateRule(e,s,n);if(l)return l;"@"===e[0]&&(0,r.default)(!1,"[JSS] Unknown at-rule %s",e);return new i.default(e,s,n)};var r=o(n(105)),i=o(n(106)),a=o(n(374));function o(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(401))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(402))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=r(n(84));var a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:window,n=(0,i.default)(e);return n.defaultView||n.parentView||t};t.default=a},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(444))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i,a=r(n(8)),o=r(n(10)),s=r(n(23)),l=r(n(24)),c=r(n(25)),u=r(n(26)),f=r(n(27)),h=r(n(0)),d=(r(n(1)),r(n(115))),p=n(19),A=r(n(184)),v=r(n(185));p.ponyfillGlobal.__MUI_STYLES__||(p.ponyfillGlobal.__MUI_STYLES__={}),p.ponyfillGlobal.__MUI_STYLES__.withTheme||(p.ponyfillGlobal.__MUI_STYLES__.withTheme=function(){return function(e){var t=function(t){function n(e,t){var r;return(0,s.default)(this,n),(r=(0,c.default)(this,(0,u.default)(n).call(this))).state={theme:v.default.initial(t)||i||(i=(0,A.default)({typography:{suppressWarning:!0}}))},r}return(0,f.default)(n,t),(0,l.default)(n,[{key:"componentDidMount",value:function(){var e=this;this.unsubscribeId=v.default.subscribe(this.context,function(t){e.setState({theme:t})})}},{key:"componentWillUnmount",value:function(){null!==this.unsubscribeId&&v.default.unsubscribe(this.context,this.unsubscribeId)}},{key:"render",value:function(){var t=this.props,n=t.innerRef,r=(0,o.default)(t,["innerRef"]);return h.default.createElement(e,(0,a.default)({theme:this.state.theme,ref:n},r))}}]),n}(h.default.Component);return t.contextTypes=v.default.contextTypes,(0,d.default)(t,e),t}});var g=p.ponyfillGlobal.__MUI_STYLES__.withTheme;t.default=g},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getTransitionProps=function(e,t){var n=e.timeout,r=e.style,i=void 0===r?{}:r;return{duration:i.transitionDuration||"number"===typeof n?n:n[t.mode],delay:i.transitionDelay}},t.reflow=void 0;t.reflow=function(e){return e.scrollTop}},function(e,t,n){"use strict";var r=n(2);t.__esModule=!0,t.default=void 0;var i=r(n(463)),a=r(n(467)),o=(r(n(247)),r(n(248)),function(e){return(0,i.default)(function(e,t){return!(0,a.default)(e,t)})(e)});t.default=o},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(491))},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var r=n(263),i=n(205);e.exports=Object.keys||function(e){return r(e,i)}},function(e,t){e.exports=!0},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t){var n,r,i=e.exports={};function a(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===a||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"===typeof setTimeout?setTimeout:a}catch(e){n=a}try{r="function"===typeof clearTimeout?clearTimeout:o}catch(e){r=o}}();var l,c=[],u=!1,f=-1;function h(){u&&l&&(u=!1,l.length?c=l.concat(c):f=-1,c.length&&d())}function d(){if(!u){var e=s(h);u=!0;for(var t=c.length;t;){for(l=c,c=[];++f1)for(var n=1;n1&&void 0!==arguments[1]?arguments[1]:"",n=e&&e.split("/")||[],r=t&&t.split("/")||[],o=e&&i(e),s=t&&i(t),l=o||s;if(e&&i(e)?r=n:n.length&&(r.pop(),r=r.concat(n)),!r.length)return"/";var c=void 0;if(r.length){var u=r[r.length-1];c="."===u||".."===u||""===u}else c=!1;for(var f=0,h=r.length;h>=0;h--){var d=r[h];"."===d?a(r,h):".."===d?(a(r,h),f++):f&&(a(r,h),f--)}if(!l)for(;f--;f)r.unshift("..");!l||""===r[0]||r[0]&&i(r[0])||r.unshift("");var p=r.join("/");return c&&"/"!==p.substr(-1)&&(p+="/"),p},s="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};var l=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every(function(t,r){return e(t,n[r])});var r="undefined"===typeof t?"undefined":s(t);if(r!==("undefined"===typeof n?"undefined":s(n)))return!1;if("object"===r){var i=t.valueOf(),a=n.valueOf();if(i!==t||a!==n)return e(i,a);var o=Object.keys(t),l=Object.keys(n);return o.length===l.length&&o.every(function(r){return e(t[r],n[r])})}return!1},c=!0,u="Invariant failed";var f=function(e,t){if(!e)throw c?new Error(u):new Error(u+": "+(t||""))};function h(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function p(e,t){return function(e,t){return new RegExp("^"+t+"(\\/|\\?|#|$)","i").test(e)}(e,t)?e.substr(t.length):e}function A(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function v(e){var t=e.pathname,n=e.search,r=e.hash,i=t||"/";return n&&"?"!==n&&(i+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(i+="#"===r.charAt(0)?r:"#"+r),i}function g(e,t,n,i){var a;"string"===typeof e?(a=function(e){var t=e||"/",n="",r="",i=t.indexOf("#");-1!==i&&(r=t.substr(i),t=t.substr(0,i));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e)).state=t:(void 0===(a=Object(r.a)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),i?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=o(a.pathname,i.pathname)):a.pathname=i.pathname:a.pathname||(a.pathname="/"),a}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,i){if(null!=e){var a="function"===typeof e?e(t,n):e;"string"===typeof a?"function"===typeof r?r(a,i):i(!0):i(!1!==a)}else i(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter(function(e){return e!==r})}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r=0?t:0)+"#"+e)}function E(e){void 0===e&&(e={}),b||f(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),i=n.getUserConfirmation,a=void 0===i?y:i,o=n.hashType,s=void 0===o?"slash":o,c=e.basename?A(h(e.basename)):"",u=x[s],d=u.encodePath,E=u.decodePath;function C(){var e=E(k());return c&&(e=p(e,c)),g(e)}var M=m();function T(e){Object(r.a)(V,e),V.length=t.length,M.notifyListeners(V.location,V.action)}var L=!1,z=null;function S(){var e,t,n=k(),r=d(n);if(n!==r)_(r);else{var i=C(),o=V.location;if(!L&&(t=i,(e=o).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&l(e.state,t.state)))return;if(z===v(i))return;z=null,function(e){if(L)L=!1,T();else{M.confirmTransitionTo(e,"POP",a,function(t){t?T({action:"POP",location:e}):function(e){var t=V.location,n=F.lastIndexOf(v(t));-1===n&&(n=0);var r=F.lastIndexOf(v(e));-1===r&&(r=0);var i=n-r;i&&(L=!0,R(i))}(e)})}}(i)}}var B=k(),I=d(B);B!==I&&_(I);var D=C(),F=[v(D)];function R(e){t.go(e)}var O=0;function P(e){1===(O+=e)&&1===e?window.addEventListener(w,S):0===O&&window.removeEventListener(w,S)}var N=!1;var V={length:t.length,action:"POP",location:D,createHref:function(e){return"#"+d(c+v(e))},push:function(e,t){var n=g(e,void 0,void 0,V.location);M.confirmTransitionTo(n,"PUSH",a,function(e){if(e){var t=v(n),r=d(c+t);if(k()!==r){z=t,function(e){window.location.hash=e}(r);var i=F.lastIndexOf(v(V.location)),a=F.slice(0,-1===i?0:i+1);a.push(t),F=a,T({action:"PUSH",location:n})}else T()}})},replace:function(e,t){var n=g(e,void 0,void 0,V.location);M.confirmTransitionTo(n,"REPLACE",a,function(e){if(e){var t=v(n),r=d(c+t);k()!==r&&(z=t,_(r));var i=F.indexOf(v(V.location));-1!==i&&(F[i]=t),T({action:"REPLACE",location:n})}})},go:R,goBack:function(){R(-1)},goForward:function(){R(1)},block:function(e){void 0===e&&(e=!1);var t=M.setPrompt(e);return N||(P(1),N=!0),function(){return N&&(N=!1,P(-1)),t()}},listen:function(e){var t=M.appendListener(e);return P(1),function(){P(-1),t()}}};return V}},function(e,t,n){"use strict";function r(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},t=e.dangerouslyUseGlobalCSS,n=void 0!==t&&t,r=e.productionPrefix,a=void 0===r?"jss":r,l=e.seed,c=void 0===l?"":l,u=0;return function(e,t){var r,l=!t.options.link;if(n&&t&&t.options.name&&l)return"".concat(o(t.options.name),"-").concat(e.key);if(l){var f=s[t.options.theme];f||(f=(0,i.default)(JSON.stringify(t.options.theme)),s[t.theme]=f);var h=t.rules.raw[e.key];r=(0,i.default)("".concat(f).concat(e.key).concat(JSON.stringify(h)))}return r||(r=u+=1),"".concat(a).concat(c).concat(r)}};r(n(21));var i=r(n(370)),a=/([[\].#*$><+~=|^:(),"'`\s])/g;function o(e){return String(e).replace(a,"-")}var s={}},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=r(n(371)),a=r(n(389)),o=r(n(390)),s=r(n(391)),l=r(n(392)),c=r(n(627)),u=r(n(393));var f=function(){return{plugins:[(0,i.default)(),(0,a.default)(),(0,o.default)(),(0,s.default)(),(0,l.default)(),"undefined"===typeof window?null:(0,c.default)(),(0,u.default)()]}};t.default=f},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r="";if(!t)return r;var i=n.indent,s=void 0===i?0:i,l=t.fallbacks;if(s++,l)if(Array.isArray(l))for(var c=0;c0&&void 0!==arguments[0]?arguments[0]:{},t=e.breakpoints,n=void 0===t?{}:t,r=e.mixins,g=void 0===r?{}:r,m=e.palette,b=void 0===m?{}:m,y=e.shadows,w=e.spacing,x=void 0===w?{}:w,k=e.typography,_=void 0===k?{}:k,E=(0,a.default)(e,["breakpoints","mixins","palette","shadows","spacing","typography"]),C=(0,u.default)(b),M=(0,l.default)(n),T=(0,i.default)({},p.default,x);return(0,i.default)({breakpoints:M,direction:"ltr",mixins:(0,c.default)(M,T,g),overrides:{},palette:C,props:{},shadows:y||h.default,typography:(0,f.default)(C,_)},(0,o.default)({shape:d.default,spacing:T,transitions:A.default,zIndex:v.default},E,{isMergeableObject:s.default}))};t.default=g},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.CHANNEL=void 0;var i=r(n(17)),a="__THEMING__";t.CHANNEL=a;var o={contextTypes:(0,i.default)({},a,function(){}),initial:function(e){return e[a]?e[a].getState():null},subscribe:function(e,t){return e[a]?e[a].subscribe(t):null},unsubscribe:function(e,t){e[a]&&e[a].unsubscribe(t)}};t.default=o},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(443))},function(e,t){function n(e,t,n){var r,i,a,o,s;function l(){var c=Date.now()-o;c=0?r=setTimeout(l,t-c):(r=null,n||(s=e.apply(a,i),a=i=null))}null==t&&(t=100);var c=function(){a=this,i=arguments,o=Date.now();var c=n&&!r;return r||(r=setTimeout(l,t)),c&&(s=e.apply(a,i),a=i=null),s};return c.clear=function(){r&&(clearTimeout(r),r=null)},c.flush=function(){r&&(s=e.apply(a,i),a=i=null,clearTimeout(r),r=null)},c}n.debounce=n,e.exports=n},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=r(n(0)).default.createContext({});t.default=i},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(451))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(478))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(479))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(492))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=r(n(0)).default.createContext();t.default=i},function(e,t,n){"use strict";function r(e){return null!=e&&!(Array.isArray(e)&&0===e.length)}Object.defineProperty(t,"__esModule",{value:!0}),t.hasValue=r,t.isFilled=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return e&&(r(e.value)&&""!==e.value||t&&r(e.defaultValue)&&""!==e.defaultValue)},t.isAdornedStart=function(e){return e.startAdornment}},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(498))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(506))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(508))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(512))},function(e,t,n){"use strict";var r=n(2);Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i.default}});var i=r(n(513))},function(e,t,n){var r=n(112);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(204)("keys"),i=n(153);e.exports=function(e){return r[e]||(r[e]=i(e))}},function(e,t,n){var r=n(90),i=n(89),a=i["__core-js_shared__"]||(i["__core-js_shared__"]={});(e.exports=function(e,t){return a[e]||(a[e]=void 0!==t?t:{})})("versions",[]).push({version:r.version,mode:n(152)?"pure":"global",copyright:"\xa9 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t){e.exports={}},function(e,t,n){var r=n(134),i=n(538),a=n(205),o=n(203)("IE_PROTO"),s=function(){},l=function(){var e,t=n(262)("iframe"),r=a.length;for(t.style.display="none",n(539).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" + + + + + + + + + + + + + + + + + Katib UI + + + +

+ + + diff --git a/pkg/ui/v1alpha2/frontend/public/logo.png b/pkg/ui/v1alpha2/frontend/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a0120a540892c8d63fb07ce6a1bd8cc80e29b67e GIT binary patch literal 81189 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
+
+ + + + + + + + + + +
+ ) +}; + +export default App; diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Create/HP.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/HP.jsx new file mode 100644 index 00000000000..4325fed0fe4 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/HP.jsx @@ -0,0 +1,38 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; +import { Tabs } from 'antd'; +import "antd/dist/antd.css"; + +import YAML from './YAML'; +import HPParameters from './HPParameters'; + + +const TabPane = Tabs.TabPane; + + +const useStyles = makeStyles({ + root: { + flexGrow: 1, + marginTop: 40, + }, +}); + + +const HP = (props) => { + const classes = useStyles(); + + return ( +
+ + + + + + + + +
+ ); +}; + +export default HP; diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Create/HPParameters.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/HPParameters.jsx new file mode 100644 index 00000000000..fe66d692a3b --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/HPParameters.jsx @@ -0,0 +1,185 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import withStyles from '@material-ui/styles/withStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; + +import CommonParametersMeta from './Params/CommonMeta'; +import CommonParametersSpec from './Params/CommonSpec'; +import Objective from './Params/Objective' +import TrialSpecParam from './Params/Trial'; +import Parameters from './Params/Parameters'; + +import { submitHPJob } from '../../../actions/hpCreateActions'; + +import { connect } from 'react-redux'; +import Algorithm from './Params/Algorithm'; + +const module = "hpCreate"; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + }, + submit: { + textAlign: 'center', + marginTop: 10, + }, + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + }, + section: { + padding: 4, + }, + parameter: { + padding: 2, + }, + formControl: { + margin: 4, + width: '100%', + }, + selectEmpty: { + marginTop: 10, + }, + button: { + margin: 10, + } +}) + +const SectionInTypography = (name, classes) => { + return ( +
+ + + + {name} + +
+
+
+
+ ) +} + +// probably get render into a function +const deCapitalizeFirstLetterAndAppend = (source, destination) => { + source.map((parameter, i) => { + let value = Number(parameter.value) + let name = parameter.name.charAt(0).toLowerCase() + parameter.name.slice(1) + destination[name] = (isNaN(value) ? parameter.value : value) + }) +} + +const addAlgorithmSettings = (spec, destination) => { + spec.map((parameter, i) => { + destination.push(parameter) + }) +} + +const addParameter = (source, destination) => { + source.map((param, i) => { + let tempParam = {} + tempParam.name = param.name + tempParam.parameterType = param.parameterType + tempParam.feasibleSpace = {} + if (param.feasibleSpace === "list") { + tempParam.feasibleSpace.list = param.list.map((param, i) => param.value) + } else { + tempParam.feasibleSpace.min = param.min + tempParam.feasibleSpace.max = param.max + } + destination.push(tempParam) + }) +} + + +const HPParameters = (props) => { + const submitJob = () => { + let data = {} + data.metadata = {} + deCapitalizeFirstLetterAndAppend(props.commonParametersMetadata, data.metadata) + data.spec = {} + deCapitalizeFirstLetterAndAppend(props.commonParametersSpec, data.spec) + data.spec.objective = {} + deCapitalizeFirstLetterAndAppend(props.objective, data.spec.objective) + data.spec.objective.additionalMetricNames = props.additionalMetricNames.map((metrics, i) => metrics.value) + + data.spec.algorithm = {} + data.spec.algorithm.algorithmName = props.algorithmName + data.spec.algorithm.algorithmSettings = [] + addAlgorithmSettings(props.algorithmSettings, data.spec.algorithm.algorithmSettings) + + data.spec.parameters = [] + addParameter(props.parameters, data.spec.parameters) + + data.spec.trialTemplate = { + goTemplate: { + templatePath: props.trial + } + } + + console.log("DATA BEFORE BACKEND") + console.log(data) + + + props.submitHPJob(data) + } + + const { classes } = props; + + return ( +
+ {/* Common Metadata */} + {SectionInTypography("Metadata", classes)} +
+ + {SectionInTypography("Common Parameters", classes)} + + {SectionInTypography("Objective", classes)} + + {SectionInTypography("Algorithm", classes)} + + + {SectionInTypography("Parameters", classes)} + + {SectionInTypography("Trial Spec", classes)} + + +
+ +
+
+ ) +} + +// TODO: think of a better way of passing those +const mapStateToProps = (state) => ({ + commonParametersMetadata: state[module].commonParametersMetadata, + commonParametersSpec: state[module].commonParametersSpec, + objective: state[module].objective, + additionalMetricNames: state[module].additionalMetricNames, + algorithmName: state[module].algorithmName, + algorithmSettings: state[module].algorithmSettings, + parameters: state[module].parameters, + trial: state[module].trial +}) + +//TODO: Added validation and remove it +// HPParameters.propTypes = { +// trial: PropTypes.string, +// requestNumber: PropTypes.number, +// suggestionAlgorithm: PropTypes.string, +// metricsName: PropTypes.arrayOf(PropTypes.string), +// } + +export default connect(mapStateToProps, { submitHPJob })(withStyles(styles)(HPParameters)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Algorithm.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Algorithm.jsx new file mode 100644 index 00000000000..39c52c90245 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Algorithm.jsx @@ -0,0 +1,160 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; + +import DeleteIcon from '@material-ui/icons/Delete'; + +import { connect } from 'react-redux'; +import { changeAlgorithmName, addAlgorithmSetting, changeAlgorithmSetting, deleteAlgorithmSetting } from '../../../../actions/hpCreateActions'; + +const module = "hpCreate"; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '80%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + icon: { + padding: 4, + margin: '0 auto', + verticalAlign: "middle !important", + }, + formControl: { + margin: 4, + width: '100%', + }, + addButton: { + margin: 10, + } +}) + +const Algorithm = (props) => { + + const classes = useStyles(); + + const onAlgorithmNameChange = (event) => { + props.changeAlgorithmName(event.target.value); + } + + const onAddAlgorithmSetting = () => { + props.addAlgorithmSetting(); + } + + const onChangeAlgorithmSetting = (name, index) => (event) => { + props.changeAlgorithmSetting(index, name, event.target.value); + } + + const onDeleteAlgorithmSetting= (index) => (event) => { + props.deleteAlgorithmSetting(index); + } + return ( +
+ +
+ + + + + + + {"Algorithm Name"} + + + + + + Algorithm Name + + + + + +
+
+ {props.algorithmSettings.map((param, i) => { + return ( +
+ + + + + + + + + + + + + + +
+ ) + })} +
+ ) +} + + +const mapStateToProps = state => { + return { + algorithmName: state[module].algorithmName, + allAlgorithms: state[module].allAlgorithms, + algorithmSettings: state[module].algorithmSettings + } +} + +export default connect(mapStateToProps, { changeAlgorithmName, addAlgorithmSetting, changeAlgorithmSetting, deleteAlgorithmSetting })(Algorithm); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/CommonMeta.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/CommonMeta.jsx new file mode 100644 index 00000000000..ca21672f3f6 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/CommonMeta.jsx @@ -0,0 +1,75 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; + +import { changeMeta } from '../../../../actions/hpCreateActions'; + + +const module = "hpCreate"; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, +}) + +const CommonParametersMeta = (props) => { + const classes = useStyles(); + + const onMetaChange = (param) => (event) => { + props.changeMeta(param, event.target.value); + } + + return ( +
+ {props.commonParametersMetadata.map((param, i) => { + return ( +
+ + + + + + + {param.name} + + + + + + +
+ ) + })} +
+ ) +} + + +const mapStateToProps = state => { + return { + commonParametersMetadata: state[module].commonParametersMetadata, + } +} + +export default connect(mapStateToProps, { changeMeta })(CommonParametersMeta); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/CommonSpec.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/CommonSpec.jsx new file mode 100644 index 00000000000..3039a318a22 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/CommonSpec.jsx @@ -0,0 +1,76 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; + +import { changeSpec } from '../../../../actions/hpCreateActions'; + + +const module = "hpCreate"; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, +}) + +const CommonParametersSpec = (props) => { + + const classes = useStyles(); + + const onSpecChange = (name) => (event) => { + props.changeSpec(name, event.target.value); + } + + return ( +
+ {props.commonParametersSpec.map((param, i) => { + return ( +
+ + + + + + + {param.name} + + + + + + +
+ ) + })} +
+ ) +} + + +const mapStateToProps = state => { + return { + commonParametersSpec: state[module].commonParametersSpec, + } +} + +export default connect(mapStateToProps, { changeSpec })(CommonParametersSpec); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Objective.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Objective.jsx new file mode 100644 index 00000000000..c2168e33985 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Objective.jsx @@ -0,0 +1,134 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; +import DeleteIcon from '@material-ui/icons/Delete'; +import Fab from '@material-ui/core/Fab'; +import AddIcon from '@material-ui/icons/Add'; + + +import { changeObjective, addMetrics, editMetrics, deleteMetrics } from '../../../../actions/hpCreateActions'; + + +const module = "hpCreate"; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, +}) + +const Objective = (props) => { + + const classes = useStyles(); + + const onObjectiveChange = (name) => (event) => { + props.changeObjective(name, event.target.value); + } + const onMetricsEdit = (index) => (event) => { + props.editMetrics(index, event.target.value); + } + + const onMetricsDelete = (index) => (event) => { + props.deleteMetrics(index); + } + + return ( +
+ {props.objective.map((param, i) => { + return ( +
+ + + + + + + {param.name} + + + + + + +
+ ) + })} +
+ + + + + + + AdditionalMetricNames + + + + { + props.additionalMetricNames.map((metrics, mIndex) => { + return ( + + + + + + + + + + + ) + }) + } + + + + + + + +
+
+ ) +} + + +const mapStateToProps = state => { + return { + objective: state[module].objective, + additionalMetricNames: state[module].additionalMetricNames + } +} + +export default connect(mapStateToProps, {changeObjective, addMetrics, editMetrics, deleteMetrics })(Objective); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Parameters.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Parameters.jsx new file mode 100644 index 00000000000..88ef77a0135 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Parameters.jsx @@ -0,0 +1,214 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import TextField from '@material-ui/core/TextField'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; +import IconButton from '@material-ui/core/IconButton'; +import DeleteIcon from '@material-ui/icons/Delete'; +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import Divider from '@material-ui/core/Divider'; +import Fab from '@material-ui/core/Fab'; +import AddIcon from '@material-ui/icons/Add'; + +import { addParameter, editParameter, deleteParameter, addListParameter, editListParameter, deleteListParameter } from '../../../../actions/hpCreateActions'; + + +const module = "hpCreate"; + + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '80%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + formControl: { + margin: 4, + width: '100%', + }, + selectEmpty: { + marginTop: 10, + }, + group: { + flexDirection: 'row', + justifyContent: 'space-around', + }, + divider: { + margin: 5, + }, + addButton: { + margin: 10, + }, + fab: { + margin: 2, + }, +}) + +const Parameters = (props) => { + + const classes = useStyles(); + + const onDelete = (index) => (event) => { + props.deleteParameter(index); + } + + const onGeneralEdit = (index, field) => (event) => { + props.editParameter(index, field, event.target.value); + } + + const onParamAdd = (index) => (event) => { + props.addListParameter(index); + } + + const onParamEdit = (paramIndex, index) => (event) => { + props.editListParameter(paramIndex, index, event.target.value); + } + + const onParamDelete = (paramIndex, index) => (event) => { + props.deleteListParameter(paramIndex, index); + } + + return ( +
+ + {props.parameters.map((param, i) => { + return ( +
+ + + + + + + + Parameter Type + + + + + + + } label="FeasibleSpace" /> + } label="List" /> + + + + {param.feasibleSpace === "list" && + (param.list.map((element, elIndex) => { + return ( +
+ + + + +
+ ) + })) + + } + {param.feasibleSpace === "feasibleSpace" && +
+ + +
+ } +
+ + {param.feasibleSpace === "list" && + + + + } + + + + + + +
+ +
+ ) + })} +
+ ) +} + + +const mapStateToProps = state => { + return { + parameters: state[module].parameters, + allParameterTypes: state[module].allParameterTypes, + } +} + +export default connect(mapStateToProps, { addParameter, editParameter, deleteParameter, addListParameter, editListParameter, deleteListParameter })(Parameters); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Trial.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Trial.jsx new file mode 100644 index 00000000000..0d3595645d6 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/Params/Trial.jsx @@ -0,0 +1,102 @@ +import React from 'react'; +import withStyles from '@material-ui/styles/withStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; + +import { connect } from 'react-redux'; +import { changeTrial } from '../../../../actions/hpCreateActions'; +import { fetchTrialTemplates } from '../../../../actions/templateActions'; + +const module = "hpCreate"; +const templateModule = "template"; + +const styles = theme => ({ + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + section: { + padding: 4, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + formControl: { + margin: 4, + width: '100%', + }, + selectEmpty: { + marginTop: 10, + }, +}) + +class TrialSpecParam extends React.Component { + + componentDidMount() { + this.props.fetchTrialTemplates(); + } + + onTrialChange = (event) => { + this.props.changeTrial(event.target.value); + } + + render() { + const names = this.props.templates.map((template, i) => template.name) + + const { classes } = this.props + return ( +
+ + + + + + + {"TrialSpec"} + + + + + + Trial Spec + + + + + +
+ ) + } +} + + +const mapStateToProps = state => { + return { + trial: state[module].trial, + templates: state[templateModule].trialTemplates, + } +} + +export default connect(mapStateToProps, { changeTrial, fetchTrialTemplates })(withStyles(styles)(TrialSpecParam)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Create/YAML.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/YAML.jsx new file mode 100644 index 00000000000..fa9be6d9da1 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Create/YAML.jsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import 'brace/mode/javascript'; +import 'brace/theme/tomorrow'; +import AceEditor from 'react-ace'; +import Button from '@material-ui/core/Button'; + +import { changeYaml } from '../../../actions/hpCreateActions'; +import { submitYaml } from '../../../actions/generalActions'; + +const module = "hpCreate"; + +const useStyles = makeStyles ({ + root: { + flexGrow: 1, + }, + editor: { + margin: '0 auto', + }, + submit: { + textAlign: 'center', + marginTop: 10, + }, + progress: { + height: 10, + margin: 10, + }, + close: { + padding: 4, + }, +}); + + +const YAML = (props) => { + + const onYamlChange = (value) => { + props.changeYaml(value); + }; + + const submitWholeYaml = () => { + props.submitYaml(props.yaml); + }; + + const classes = useStyles(); + return ( +
+

Generate

+
+ {/* {props.loading && } */} +
+ +
+
+ +
+
+ ); +}; + +const mapStateToProps = (state) => { + return { + yaml: state[module].currentYaml, + }; +}; + + +export default connect(mapStateToProps, { changeYaml, submitYaml })(YAML); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/FilterPanel.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/FilterPanel.jsx new file mode 100644 index 00000000000..b19b7c5b863 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/FilterPanel.jsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { withStyles } from '@material-ui/core/styles'; + +import TextField from '@material-ui/core/TextField'; +import FormGroup from '@material-ui/core/FormGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import Switch from '@material-ui/core/Switch'; +import Button from '@material-ui/core/Button'; + +import { filterJobs, changeType, fetchHPJobs } from '../../../actions/hpMonitorActions'; + + +const module = "hpMonitor"; + + +const styles = theme => ({ + textField: { + marginLeft: theme.spacing.unit, + marginRight: theme.spacing.unit, + }, + filter: { + margin: '0 auto', + textAlign: 'center', + }, +}); + +const FilterPanel = (props) => { + + const { classes } = props; + + const handleType = (name) => (event) => { + props.changeType(name, event.target.checked); + } + + return ( +
+ + props.filterJobs(event.target.value)} + margin="normal" + variant="outlined" + /> + { + Object.keys(props.filterType).map((filter, i) => { + return( + + } + label={filter} + /> + ); + }) + } + + +
+ ) +} + +const mapStateToProps = state => { + return { + filter: state[module].filter, + filterType: state[module].filterType, + } +} + +export default connect(mapStateToProps, { filterJobs, changeType, fetchHPJobs })(withStyles(styles)(FilterPanel)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobInfo.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobInfo.jsx new file mode 100644 index 00000000000..a358870880f --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobInfo.jsx @@ -0,0 +1,71 @@ +import React from 'react' +import { connect } from 'react-redux' +import { withStyles } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; +import Button from '@material-ui/core/Button'; +import { Link } from 'react-router-dom'; +import LinearProgress from '@material-ui/core/LinearProgress'; + + +import { fetchHPJobInfo } from '../../../actions/hpMonitorActions'; + +import HPJobPlot from './HPJobPlot'; +import HPJobTable from './HPJobTable'; +import TrialInfoDialog from './TrialInfoDialog'; + +const module = "hpMonitor"; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + padding: 20, + }, + loading: { + marginTop: 30, + }, + header: { + marginTop: 30, + textAlign: "center" + } +}) + +class HPJobInfo extends React.Component { + + componentDidMount() { + this.props.fetchHPJobInfo(this.props.match.params.name); + } + + render () { + const { classes } = this.props; + return ( +
+ + + + {this.props.loading ? + + : +
+ + Experiment Name: {this.props.match.params.name} + +
+ + + +
+ } +
+ ) + } +} + +const mapStateToProps = (state) => ({ + loading: state[module].loading, +}) + + +export default connect(mapStateToProps, { fetchHPJobInfo })(withStyles(styles)(HPJobInfo)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobList.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobList.jsx new file mode 100644 index 00000000000..5a65ced35d7 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobList.jsx @@ -0,0 +1,92 @@ +import React from 'react'; +import {connect} from 'react-redux'; +import { withStyles } from '@material-ui/core/styles'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import { Link } from 'react-router-dom'; +import { ListItemSecondaryAction, IconButton } from '@material-ui/core'; + +import { openDeleteExperimentDialog } from '../../../actions/generalActions'; +import DeleteDialog from '../../Menu/DeleteDialog'; + +import ScheduleIcon from '@material-ui/icons/Schedule'; +import RestoreIcon from '@material-ui/icons/Restore'; +import HighlightOffIcon from '@material-ui/icons/HighlightOff'; +import DoneIcon from '@material-ui/icons/Done'; +import DeleteIcon from '@material-ui/icons/Delete'; +import HourglassFullIcon from '@material-ui/icons/HourglassFull'; + +const module = "hpMonitor"; + +const styles = theme => ({ + created: { + color: theme.colors.created, + }, + running: { + color: theme.colors.running, + }, + restarting: { + color: theme.colors.restarting + }, + succeeded: { + color: theme.colors.succeeded, + }, + failed: { + color: theme.colors.failed, + }, +}); + + +const HPJobList = (props) => { + + const { classes } = props; + + const onDeleteExperiment = (experimentName) => (event) => { + props.openDeleteExperimentDialog(experimentName); + } + + return ( +
+ + {props.filteredJobsList.map((job, i) => { + let icon; + if (job.status === 'Created') { + icon = () + } else if (job.status === 'Running') { + icon = () + } else if (job.status === 'Restarting') { + icon = () + } else if (job.status === 'Succeeded') { + icon = () + } else if (job.status === 'Failed') { + icon = () + } + return ( + + + {icon} + + + + + + + + + ); + })} + + +
+ ) +} + +const mapStateToProps = (state) => { + return { + filteredJobsList: state[module].filteredJobsList, + } +} + +export default connect(mapStateToProps, { openDeleteExperimentDialog })(withStyles(styles)(HPJobList)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobMonitor.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobMonitor.jsx new file mode 100644 index 00000000000..4f380e44503 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobMonitor.jsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { withStyles } from '@material-ui/core/styles'; + +import FilterPanel from './FilterPanel'; +import HPJobList from './HPJobList'; + +import { fetchHPJobs } from '../../../actions/hpMonitorActions'; +import { connect } from 'react-redux' + + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + }, +}); + +class HPJobMonitor extends React.Component { + + componentDidMount() { + this.props.fetchHPJobs(); + } + + render () { + const { classes } = this.props; + + return ( +
+

Monitor

+ + +
+ ) + } +} + + +export default connect(null, { fetchHPJobs })(withStyles(styles)(HPJobMonitor)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobPlot.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobPlot.jsx new file mode 100644 index 00000000000..d9d5a1aab98 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobPlot.jsx @@ -0,0 +1,92 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; + +import { connect } from 'react-redux'; +import Plot from 'react-plotly.js'; + +const module = "hpMonitor"; + +const useStyles = makeStyles({ + root: { + textAlign: 'center', + } +}) + +const HPJobPlot = (props) => { + const classes = useStyles(); + let dimensions = []; + + if (props.jobData && props.jobData.length !== 0) { + // everything for the third column + let header = props.jobData[0]; + let data = props.jobData.slice(1); + for(let i = 1; i < data[0].length; i++) { + if (header[i] !== '') { + let track = { + label: header[i], + } + let flag = "number"; + let values = []; + for (let j = 0; j < data.length - 1; j++) { + let number = Number(data[j][i]) + if (isNaN(number)) { + flag = "string"; + values.push(data[j][i]); + } else { + values.push(number) + } + } + track.values = values; + if (flag === "number" && flag !== "string") { + track.range = [Math.min.apply(null, values), Math.max.apply(null, values)]; + if (Math.min.apply(null, values) < 1) { + track.tickformat = ".3f" + } else { + track.tickformat = "d" + } + } else { + // check logic + // track.ticktext = values; + let options = new Set(values); + options = [...options] + let mapping = {}; + for (let k = 0; k < options.length; k++) { + mapping[options[k]] = k; + } + track.tickvals = options.map((option, index) => index); + track.ticktext = options.map((option, index) => option); + track.values = values.map((value, index) => mapping[value]) + track.constraintrange = [0, values.length]; + } + dimensions.push(track) + + } + } + } + + + return ( +
+ +
+ ) +} + +const mapStateToProps = (state) => ({ + jobData: state[module].jobData, +}) + +export default connect(mapStateToProps, null)(HPJobPlot); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobTable.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobTable.jsx new file mode 100644 index 00000000000..2b98e6f7014 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/HPJobTable.jsx @@ -0,0 +1,86 @@ +import React from 'react'; +import { withStyles } from '@material-ui/core/styles'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableHead from '@material-ui/core/TableHead'; +import TableRow from '@material-ui/core/TableRow'; +import Paper from '@material-ui/core/Paper'; + +import { connect } from 'react-redux'; +import { fetchHPJobTrialInfo } from '../../../actions/hpMonitorActions'; + +const module = "hpMonitor"; + +const styles = theme => ({ + root: { + width: '100%', + marginTop: theme.spacing.unit * 3, + overflowX: 'auto', + }, + table: { + minWidth: 700, + }, + hover: { + '&:hover': { + cursor: "pointer", + } + } +}); + +class HPJobTable extends React.Component { + + fetchAndOpenDialog = (trialName) => (event) => { + this.props.fetchHPJobTrialInfo(trialName); + } + + render () { + const { classes } = this.props; + + let header = []; + let data = []; + if (this.props.jobData && this.props.jobData.length !== 0) { + header = this.props.jobData[0]; + data = this.props.jobData.slice(1) + } + return ( + + + + + {header.map(header => ( + {header} + ))} + + + + {data.map((row, id) => ( + + {row.map((element, index) => { + if (index === 0) { + return ( + + {element} + + ) + } else { + return ( + {element} + ) + } + })} + + ))} + +
+
+ ); + } +} + + +const mapStateToProps = (state) => ({ + jobData: state[module].jobData, +}) + +export default connect(mapStateToProps, { fetchHPJobTrialInfo })(withStyles(styles)(HPJobTable)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx new file mode 100644 index 00000000000..f1716a392b8 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/HP/Monitor/TrialInfoDialog.jsx @@ -0,0 +1,88 @@ +import React from 'react'; +import { withStyles } from '@material-ui/styles'; +import Dialog from '@material-ui/core/Dialog'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import { connect } from 'react-redux'; + +import { closeDialog } from '../../../actions/hpMonitorActions'; +import Plot from 'react-plotly.js'; + + +const module = "hpMonitor"; + +const styles = theme => ({ + header: { + textAlign: "center" + } +}) + + +const TrialInfoDialog = (props) => { + const { classes } = props; + + let dataToPlot = []; + if (props.trialData.length !== 0) { + let data = props.trialData.slice(1); + let tracks = {}; + for(let i = 0; i < data.length; i++) { + if (typeof tracks[data[i][0]] !== "undefined") { + tracks[data[i][0]].x.push(data[i][1]); + tracks[data[i][0]].y.push(Number(data[i][2])); + } else { + tracks[data[i][0]] = {}; + tracks[data[i][0]].x = [data[i][1]]; + tracks[data[i][0]].y = [Number(data[i][2])]; + } + } + + //For plot legend + let keys = Object.keys(tracks); + keys.map((key, i) => { + if (key !== "") { + dataToPlot.push({ + x: tracks[key].x, + y: tracks[key].y, + type: "scatter", + mode: "line", + name: key, + }) + } + }) + } + return ( + + {"Trial data"} + + + + + ); +} + +const mapStateToProps = state => { + return { + open: state[module].dialogOpen, + trialData: state[module].trialData, + } +} + +export default connect(mapStateToProps, { closeDialog })(withStyles(styles)(TrialInfoDialog)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Menu/DeleteDialog.jsx b/pkg/ui/v1alpha2/frontend/src/components/Menu/DeleteDialog.jsx new file mode 100644 index 00000000000..2c4699e7e92 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Menu/DeleteDialog.jsx @@ -0,0 +1,58 @@ +import React from 'react'; +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import makeStyles from '@material-ui/styles/makeStyles'; + +import { connect } from 'react-redux'; +import { deleteExperiment, closeDeleteExperimentDialog } from '../../actions/generalActions'; + + +const module = "general"; + +const useStyles = makeStyles({ + root: { + } + }) + +const DeleteDialog = (props) => { + const classes = useStyles(); + + const onDelete = () => { + props.deleteExperiment(props.name); + } + + return ( + + {"Delete Experiment?"} + + + Are you sure you want to delete this experiment? + + + + + + + + ) +} + +const mapStateToProps = (state) => ({ + open: state[module].deleteDialog, + deleteExperimentName: state[module].deleteExperimentName, +}) + +export default connect(mapStateToProps, { closeDeleteExperimentDialog, deleteExperiment })(DeleteDialog); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Menu/Header.jsx b/pkg/ui/v1alpha2/frontend/src/components/Menu/Header.jsx new file mode 100644 index 00000000000..267f777985b --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Menu/Header.jsx @@ -0,0 +1,56 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; +import AppBar from '@material-ui/core/AppBar'; +import Toolbar from '@material-ui/core/Toolbar'; +import Typography from '@material-ui/core/Typography'; +import IconButton from '@material-ui/core/IconButton'; +import MenuIcon from '@material-ui/icons/Menu'; +import { Link } from 'react-router-dom'; + +import Menu from './Menu'; + +import { connect } from 'react-redux'; +import { toggleMenu } from '../../actions/generalActions'; + + +const useStyles = makeStyles({ + root: { + flexGrow: 1, + }, + grow: { + flexGrow: 1, + }, + menuButton: { + marginLeft: -12, + marginRight: 20, + }, + link: { + textDecoration: 'none', + } +}); + +const Header = (props) => { + const classes = useStyles(); + + const toggleMenu = (event) => { + props.toggleMenu(true); + } + + return ( +
+ + + + + + + Katib + + + + +
+ ) +} + +export default connect(null, { toggleMenu } )(Header); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Menu/Main.jsx b/pkg/ui/v1alpha2/frontend/src/components/Menu/Main.jsx new file mode 100644 index 00000000000..cfcdc4e18f9 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Menu/Main.jsx @@ -0,0 +1,73 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/styles'; +import Paper from '@material-ui/core/Paper'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; +import Button from '@material-ui/core/Button'; +import { Link } from 'react-router-dom'; + + +const useStyles = makeStyles({ + root: { + margin: '0 auto', + marginTop: 50, + flexGrow: 1, + width: '50%', + height: 400, + textAlign: 'center', + }, + item: { + padding: "40px !important", + }, + block: { + backgroundColor: '#4e4e4e', + height: '100%', + width: '100%', + padding: 40, + '&:hover': { + backgroundColor: 'black', + } + }, +}) + +const Main = (props) => { + + const classes = useStyles(); + + return ( + + + Welcome to Katib + + + Choose type of experiment + +
+ + + + + Hyperparameter Tuning + + + + + + + Neural Architecture Search + + + + +
+ + For additional information on Kubeflow visit
website + + + For additional information on Katib visit github + + + ) +} + +export default Main; diff --git a/pkg/ui/v1alpha2/frontend/src/components/Menu/Menu.jsx b/pkg/ui/v1alpha2/frontend/src/components/Menu/Menu.jsx new file mode 100644 index 00000000000..78a19eeadc8 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Menu/Menu.jsx @@ -0,0 +1,186 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Drawer from '@material-ui/core/Drawer'; +import List from '@material-ui/core/List'; +import Typography from '@material-ui/core/Typography'; +import Divider from '@material-ui/core/Divider'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import Collapse from '@material-ui/core/Collapse'; + + +import TuneIcon from '@material-ui/icons/Tune'; +import NoteAddIcon from '@material-ui/icons/NoteAdd'; +import WatchLaterIcon from '@material-ui/icons/WatchLater'; +import SearchIcon from '@material-ui/icons/Search'; +import SetttingsIcon from '@material-ui/icons/Settings'; +import ExpandLess from '@material-ui/icons/ExpandLess'; +import ExpandMore from '@material-ui/icons/ExpandMore'; +import InfoIcon from '@material-ui/icons/Info'; + +import { Link } from 'react-router-dom'; + +import { connect } from 'react-redux'; +import { toggleMenu } from '../../actions/generalActions'; + +const module = "general"; + +const useStyles = makeStyles({ + list: { + width: 250, + }, + nested: { + paddingLeft: 10 * 4, + }, +}); + +const Menu = (props) => { + + const [hp, setHP] = React.useState(false); + const [nas, setNAS] = React.useState(false); + + const toggleHP = () => { + setHP(!hp); + }; + + const toggleNAS = () => { + setNAS(!nas); + }; + + const classes = useStyles(); + + const closeMenu = () => { + props.toggleMenu(false); + }; + + // Add links + const color = "primary"; + const iconColor = "primary"; + const variant = "title"; + return ( +
+ + + {/* HP */} + + + + + + + HP + + + {hp ? : } + + + + + + + + + + Submit + + + + + + + + + + Monitor + + + + + + + {/* NAS */} + + + + + + + NAS + + + {hp ? : } + + + + + + + + + + Submit + + + + + + + + + + Monitor + + + + + + + {/* TRIAL MANIFESTS */} + + + + + + + Trial Manifests + + + + + {/* METRICS COLLECTOR */} + + + + + + + Metrics Collector Manifests + + + + + {/* ABOUT */} + + + + + + + About + + + + + +
+ ) +} + +const mapStateToProps = (state) => { + return { + menuOpen: state[module].menuOpen, + }; +}; + +export default connect(mapStateToProps, { toggleMenu })(Menu); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Menu/Snack.jsx b/pkg/ui/v1alpha2/frontend/src/components/Menu/Snack.jsx new file mode 100644 index 00000000000..22a37806457 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Menu/Snack.jsx @@ -0,0 +1,66 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Snackbar from '@material-ui/core/Snackbar'; +import IconButton from '@material-ui/core/IconButton'; + +import CloseIcon from '@material-ui/icons/Close'; + +import { connect } from 'react-redux'; +import { closeSnackbar } from '../../actions/generalActions'; + +const module = "general"; + + +const useStyles = makeStyles({ + root: { + flexGrow: 1, + marginTop: 40, + }, + close: { + padding: 4, + } +}); + + +const Snack = (props) => { + + const classes = useStyles(); + + const vertical = "top"; + const horizontal = "center"; + return ( + {props.snackText}} + action={[ + + + , + ]} + /> + ) +}; + +const mapStateToProps = (state) => { + return { + snackText: state[module].snackText, + snackOpen: state[module].snackOpen, + } +} + +export default connect(mapStateToProps, { closeSnackbar })(Snack); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/NAS.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/NAS.jsx new file mode 100644 index 00000000000..a3e59f203c1 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/NAS.jsx @@ -0,0 +1,38 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; +import { Tabs } from 'antd'; +import "antd/dist/antd.css"; + +import YAML from './YAML'; +import NASParameters from './NASParameters'; + + +const TabPane = Tabs.TabPane; + + +const useStyles = makeStyles({ + root: { + flexGrow: 1, + marginTop: 40, + }, +}); + + +const NAS = (props) => { + const classes = useStyles(); + + return ( +
+ + + + + + + + +
+ ); +}; + +export default NAS; diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/NASParameters.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/NASParameters.jsx new file mode 100644 index 00000000000..7e75b5a292a --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/NASParameters.jsx @@ -0,0 +1,202 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; +import withStyles from '@material-ui/styles/withStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; + +import CommonParametersMeta from './Params/CommonMeta'; +import CommonParametersSpec from './Params/CommonSpec'; +import Objective from "./Params/Objective" +import Algorithm from "./Params/Algorithm" +import TrialSpecParam from './Params/Trial'; + +import { submitNASJob } from '../../../actions/nasCreateActions'; + + +import { connect } from 'react-redux'; +import NASConfig from './Params/NASConfig'; + +const module = "nasCreate"; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + }, + submit: { + textAlign: 'center', + marginTop: 10, + }, + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + }, + section: { + padding: 4, + }, + parameter: { + padding: 2, + }, + formControl: { + margin: 4, + width: '100%', + }, + selectEmpty: { + marginTop: 10, + }, + addButton: { + margin: 10, + } +}) + +const SectionInTypography = (name, classes) => { + return ( +
+ + + + {name} + +
+
+
+
+ ) +} + +// probably get render into a function +const deCapitalizeFirstLetterAndAppend = (source, destination) => { + source.map((parameter, i) => { + let value = Number(parameter.value) + let name = parameter.name.charAt(0).toLowerCase() + parameter.name.slice(1) + destination[name] = (isNaN(value) ? parameter.value : value) + }) +} + +const addAlgorithmSettings = (spec, destination) => { + spec.map((parameter, i) => { + destination.push(parameter) + }) +} + +const addOperations = (source, destination) => { + source.map((operation, index) => { + let parameters = [] + operation.parameters.map((param, i) => { + let tempParam = {} + tempParam.name = param.name + tempParam.parametertype = param.parameterType + tempParam.feasibleSpace = {} + if (param.feasibleSpace === "list") { + tempParam.feasibleSpace.list = param.list.map((param, i) => param.value) + } else { + tempParam.feasibleSpace.min = param.min + tempParam.feasibleSpace.max = param.max + tempParam.feasibleSpace.step = param.step + } + parameters.push(tempParam) + }) + destination.push({ + operationType: operation.operationType, + parameters: parameters, + }) + }) +} + +const NASParameters = (props) => { + const submitNASJob = () => { + let data = {} + + data.metadata = {} + deCapitalizeFirstLetterAndAppend(props.commonParametersMetadata, data.metadata) + + data.spec = {} + deCapitalizeFirstLetterAndAppend(props.commonParametersSpec, data.spec) + + data.spec.objective = {} + deCapitalizeFirstLetterAndAppend(props.objective, data.spec.objective) + data.spec.objective.additionalMetricNames = props.additionalMetricNames.map((metrics, i) => metrics.value) + + data.spec.algorithm = {} + data.spec.algorithm.algorithmName = props.algorithmName + data.spec.algorithm.algorithmSettings = [] + addAlgorithmSettings(props.algorithmSettings, data.spec.algorithm.algorithmSettings) + + data.spec.nasConfig = {} + data.spec.nasConfig.graphConfig = { + numLayers: Number(props.numLayers), + inputSize: props.inputSize.map(size => Number(size)), + outputSize: props.outputSize.map(size => Number(size)), + } + data.spec.nasConfig.operations = [] + addOperations(props.operations, data.spec.nasConfig.operations) + + data.spec.trialTemplate = { + goTemplate: { + templatePath: props.trial, + } + } + + console.log("DATA BEFORE BACKEND") + console.log(data) + props.submitNASJob(data) + } + + const { classes } = props; + + return ( +
+ {/* Common Metadata */} + {SectionInTypography("Metadata", classes)} + + {SectionInTypography("Common Parameters", classes)} + + {SectionInTypography("Objective", classes)} + + {SectionInTypography("Algorithm", classes)} + + {SectionInTypography("NAS Config", classes)} + + {SectionInTypography("Trial Spec", classes)} + +
+ +
+
+ ) +} + +// TODO: think of a better way of passing those +const mapStateToProps = (state) => ({ + commonParametersMetadata: state[module].commonParametersMetadata, + commonParametersSpec: state[module].commonParametersSpec, + objective: state[module].objective, + additionalMetricNames: state[module].additionalMetricNames, + algorithmName: state[module].algorithmName, + algorithmSettings: state[module].algorithmSettings, + numLayers: state[module].numLayers, + inputSize: state[module].inputSize, + outputSize: state[module].outputSize, + operations: state[module].operations, + trial: state[module].trial +}) + +//TODO: Added validation and remove it +// NASParameters.propTypes = { +// numLayers: PropTypes.number, +// trial: PropTypes.string, +// requestNumber: PropTypes.number, +// suggestionAlgorithm: PropTypes.string, +// metricsName: PropTypes.arrayOf(PropTypes.string), +// } + +export default connect(mapStateToProps, { submitNASJob })(withStyles(styles)(NASParameters)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Algorithm.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Algorithm.jsx new file mode 100644 index 00000000000..1cb28bc4eeb --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Algorithm.jsx @@ -0,0 +1,160 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; + +import DeleteIcon from '@material-ui/icons/Delete'; + +import { connect } from 'react-redux'; +import { changeAlgorithmName, addAlgorithmSetting, changeAlgorithmSetting, deleteAlgorithmSetting } from '../../../../actions/nasCreateActions'; + +const module = "nasCreate"; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '80%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + icon: { + padding: 4, + margin: '0 auto', + verticalAlign: "middle !important", + }, + formControl: { + margin: 4, + width: '100%', + }, + addButton: { + margin: 10, + } +}) + +const Algorithm = (props) => { + + const classes = useStyles(); + + const onAlgorithmNameChange = (event) => { + props.changeAlgorithmName(event.target.value); + } + + const onAddAlgorithmSetting = () => { + props.addAlgorithmSetting(); + } + + const onChangeAlgorithmSetting = (name, index) => (event) => { + props.changeAlgorithmSetting(index, name, event.target.value); + } + + const onDeleteAlgorithmSetting= (index) => (event) => { + props.deleteAlgorithmSetting(index); + } + + return ( +
+ +
+ + + + + + + {"Algorithm Name"} + + + + + + Algorithm Name + + + + + +
+
+ {props.algorithmSettings.map((param, i) => { + return ( +
+ + + + + + + + + + + + + + +
+ ) + })} +
+ ) +} + + +const mapStateToProps = state => { + return { + algorithmName: state[module].algorithmName, + allAlgorithms: state[module].allAlgorithms, + algorithmSettings: state[module].algorithmSettings + } +} + +export default connect(mapStateToProps, { changeAlgorithmName, addAlgorithmSetting, changeAlgorithmSetting, deleteAlgorithmSetting })(Algorithm); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/CommonMeta.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/CommonMeta.jsx new file mode 100644 index 00000000000..4c0a98fe079 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/CommonMeta.jsx @@ -0,0 +1,75 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; + +import { changeMeta } from '../../../../actions/nasCreateActions'; + + +const module = "nasCreate"; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, +}) + +const CommonParametersMeta = (props) => { + const classes = useStyles(); + + const onMetaChange = (param) => (event) => { + props.changeMeta(param, event.target.value); + } + + return ( +
+ {props.commonParametersMetadata.map((param, i) => { + return ( +
+ + + + + + + {param.name} + + + + + + +
+ ) + })} +
+ ) +} + + +const mapStateToProps = state => { + return { + commonParametersMetadata: state[module].commonParametersMetadata, + } +} + +export default connect(mapStateToProps, { changeMeta })(CommonParametersMeta); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/CommonSpec.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/CommonSpec.jsx new file mode 100644 index 00000000000..3424d9536f2 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/CommonSpec.jsx @@ -0,0 +1,76 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; + +import { changeSpec} from '../../../../actions/nasCreateActions'; + + +const module = "nasCreate"; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, +}) + +const CommonParametersSpec = (props) => { + + const classes = useStyles(); + + const onSpecChange = (name) => (event) => { + props.changeSpec(name, event.target.value); + } + + return ( +
+ {props.commonParametersSpec.map((param, i) => { + return ( +
+ + + + + + + {param.name} + + + + + + +
+ ) + })} +
+ ) +} + + +const mapStateToProps = state => { + return { + commonParametersSpec: state[module].commonParametersSpec + } +} + +export default connect(mapStateToProps, { changeSpec })(CommonParametersSpec); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/NASConfig.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/NASConfig.jsx new file mode 100644 index 00000000000..405bc67d782 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/NASConfig.jsx @@ -0,0 +1,421 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; +import AddIcon from '@material-ui/icons/Add'; +import DeleteIcon from '@material-ui/icons/Delete'; +import Fab from '@material-ui/core/Fab'; +import Divider from '@material-ui/core/Divider'; +import Select from '@material-ui/core/Select'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; + +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; + + +import { editNumLayers, addSize, editSize, deleteSize, addOperation, deleteOperation, changeOperation, addParameter, changeParameter, deleteParameter, addListParameter, editListParameter, deleteListParameter } from '../../../../actions/nasCreateActions'; + +const module = "nasCreate"; + + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '80%' + }, + numLayers: { + padding: 2, + marginBottom: 30, + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + formControl: { + margin: 4, + width: '100%', + }, + selectEmpty: { + marginTop: 10, + }, + group: { + flexDirection: 'row', + justifyContent: 'space-around', + }, + divider: { + margin: 5, + }, + addButton: { + margin: 10, + }, + fab: { + margin: 2, + }, +}) + +const SectionInTypography = (name, classes, variant) => { + return ( +
+ + + + {name} + +
+
+
+
+ ) +} + + +const NASConfig = (props) => { + + const classes = useStyles(); + + const onEditNumLayers = () => (event) => { + props.editNumLayers(event.target.value); + } + const onAddSize = (type) => (event) => { + props.addSize(type); + } + + const onEditSize = (index, type) => (event) => { + props.editSize(type, index, event.target.value); + } + + const onDeleteSize = (index, type) => (event) => { + props.deleteSize(type, index); + } + + const onDeleteOperation = (index) => (event) => { + props.deleteOperation(index); + } + + const onChangeOperation = (index) => (event) => { + props.changeOperation(index, event.target.value); + } + + const onAddParameter = (opIndex) => (event) => { + props.addParameter(opIndex); + } + + const onChangeParameter = (opIndex, paramIndex, name) => (event) => { + props.changeParameter(opIndex, paramIndex, name, event.target.value); + } + + const onDeleteParameter = (opIndex, paramIndex) => (event) => { + props.deleteParameter(opIndex, paramIndex); + } + + const onAddListParameter = (opIndex, paramIndex) => (event) => { + props.addListParameter(opIndex, paramIndex); + } + + const onDeleteListParameter = (opIndex, paramIndex, listIndex) => (event) => { + props.deleteListParameter(opIndex, paramIndex, listIndex); + } + + const onEditListParameter = (opIndex, paramIndex, listIndex) => (event) => { + props.editListParameter(opIndex, paramIndex, listIndex, event.target.value); + } + + return ( +
+ {/* NUM LAYERS */} +
+ + + + + + + {"NumLayers"} + + + + + + +
+ {/* INPUT SIZE */} +
+ + + + + + + {"InputSize"} + + + + {props.inputSize.map((size, index) => { + return ( +
+ + + + +
+ ) + })} +
+ + + + + +
+
+ {/* OUTPUT SIZE */} +
+ + + + + + + {"OutputSize"} + + + + {props.outputSize.map((size, index) => { + return ( +
+ + + + +
+ ) + })} +
+ + + + + +
+
+ {/* OPERATIONS */} + {SectionInTypography("Operations", classes, "h6")} +
+ +
+ { + props.operations.map((operation, opIndex) => { + return ( +
+
+ + + + OperationType + + + + + + + + + + +
+
+
+ +
+
+ {operation.parameters.map((param, paramIndex) => { + return ( +
+ + + + + + + + Parameter Type + + + + + + + } label="FeasibleSpace" /> + } label="List" /> + + + + {param.feasibleSpace === "list" && + (param.list.map((element, elIndex) => { + return ( +
+ + + + +
+ ) + })) + + } + {param.feasibleSpace === "feasibleSpace" && +
+ + + +
+ } +
+ + {param.feasibleSpace === "list" && + + + + } + + + + + + +
+
+ ) + })} + +
+ ) + }) + } +
+ ) +} + + +const mapStateToProps = state => { + return { + numLayers: state[module].numLayers, + inputSize: state[module].inputSize, + outputSize: state[module].outputSize, + operations: state[module].operations, + allParameterTypes: state[module].allParameterTypes, + } +} + +export default connect(mapStateToProps, { editNumLayers, addSize, editSize, deleteSize, addOperation, deleteOperation, changeOperation, addParameter, changeParameter, deleteParameter, addListParameter, editListParameter, deleteListParameter })(NASConfig); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Objective.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Objective.jsx new file mode 100644 index 00000000000..0e98e3dd382 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Objective.jsx @@ -0,0 +1,134 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import TextField from '@material-ui/core/TextField'; +import IconButton from '@material-ui/core/IconButton'; +import DeleteIcon from '@material-ui/icons/Delete'; +import Fab from '@material-ui/core/Fab'; +import AddIcon from '@material-ui/icons/Add'; + + +import { changeObjective, addMetrics, editMetrics, deleteMetrics } from '../../../../actions/nasCreateActions'; + + +const module = "nasCreate"; + +const useStyles = makeStyles({ + textField: { + marginLeft: 4, + marginRight: 4, + width: '100%' + }, + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, +}) + +const Objective = (props) => { + + const classes = useStyles(); + + const onObjectiveChange = (name) => (event) => { + props.changeObjective(name, event.target.value); + } + const onMetricsEdit = (index) => (event) => { + props.editMetrics(index, event.target.value); + } + + const onMetricsDelete = (index) => (event) => { + props.deleteMetrics(index); + } + + return ( +
+ {props.objective.map((param, i) => { + return ( +
+ + + + + + + {param.name} + + + + + + +
+ ) + })} +
+ + + + + + + AdditionalMetricNames + + + + { + props.additionalMetricNames.map((metrics, mIndex) => { + return ( + + + + + + + + + + + ) + }) + } + + + + + + + +
+
+ ) +} + + +const mapStateToProps = state => { + return { + objective: state[module].objective, + additionalMetricNames: state[module].additionalMetricNames + } +} + +export default connect(mapStateToProps, {changeObjective, addMetrics, editMetrics, deleteMetrics })(Objective); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Trial.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Trial.jsx new file mode 100644 index 00000000000..cabe3abe306 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/Params/Trial.jsx @@ -0,0 +1,102 @@ +import React from 'react'; +import withStyles from '@material-ui/styles/withStyles'; +import Grid from '@material-ui/core/Grid'; +import Tooltip from '@material-ui/core/Tooltip'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import Typography from '@material-ui/core/Typography'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import InputLabel from '@material-ui/core/InputLabel'; +import MenuItem from '@material-ui/core/MenuItem'; +import FormControl from '@material-ui/core/FormControl'; +import Select from '@material-ui/core/Select'; + +import { connect } from 'react-redux'; +import { changeTrial } from '../../../../actions/nasCreateActions'; +import { fetchTrialTemplates } from '../../../../actions/templateActions'; + +const module = "nasCreate"; +const templateModule = "template"; + +const styles = theme => ({ + help: { + padding: 4 / 2, + verticalAlign: "middle", + marginRight: 5, + }, + section: { + padding: 4, + }, + parameter: { + padding: 2, + marginBottom: 10, + }, + formControl: { + margin: 4, + width: '100%', + }, + selectEmpty: { + marginTop: 10, + }, +}) + +class TrialSpecParam extends React.Component { + + componentDidMount() { + this.props.fetchTrialTemplates(); + } + + onTrialChange = (event) => { + this.props.changeTrial(event.target.value); + } + + render() { + const names = this.props.templates.map((template, i) => template.name) + + const { classes } = this.props + return ( +
+ + + + + + + {"TrialSpec"} + + + + + + Trial Spec + + + + + +
+ ) + } +} + + +const mapStateToProps = state => { + return { + trial: state[module].trial, + templates: state[templateModule].trialTemplates, + } +} + +export default connect(mapStateToProps, { changeTrial, fetchTrialTemplates })(withStyles(styles)(TrialSpecParam)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/YAML.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/YAML.jsx new file mode 100644 index 00000000000..1882180df4a --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Create/YAML.jsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import makeStyles from '@material-ui/styles/makeStyles'; +import 'brace/mode/javascript'; +import 'brace/theme/tomorrow'; +import AceEditor from 'react-ace'; +import Button from '@material-ui/core/Button'; + +import { changeYaml } from '../../../actions/nasCreateActions'; +import { submitYaml } from '../../../actions/generalActions'; + +const module = "nasCreate"; + +const useStyles = makeStyles ({ + root: { + width: '90%', + margin: '0 auto', + }, + editor: { + margin: '0 auto', + }, + submit: { + textAlign: 'center', + marginTop: 10, + }, + progress: { + height: 10, + margin: 10, + }, + close: { + padding: 4, + }, +}); + + +const YAML = (props) => { + + const onYamlChange = (value) => { + props.changeYaml(value); + }; + + const submitWholeYaml = () => { + props.submitYaml(props.yaml); + }; + + const classes = useStyles(); + return ( +
+

Generate

+
+ {/* {props.loading && } */} +
+ +
+
+ +
+
+ ); +}; + +const mapStateToProps = (state) => { + return { + yaml: state[module].currentYaml, + }; +}; + + +export default connect(mapStateToProps, { changeYaml, submitYaml })(YAML); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/FilterPanel.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/FilterPanel.jsx new file mode 100644 index 00000000000..dc3b6d2a658 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/FilterPanel.jsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { withStyles } from '@material-ui/core/styles'; + +import TextField from '@material-ui/core/TextField'; +import FormGroup from '@material-ui/core/FormGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import Switch from '@material-ui/core/Switch'; +import Button from '@material-ui/core/Button'; + +import { filterJobs, changeType, fetchNASJobs } from '../../../actions/nasMonitorActions'; + + +const module = "nasMonitor"; + + +const styles = theme => ({ + textField: { + marginLeft: theme.spacing.unit, + marginRight: theme.spacing.unit, + }, + filter: { + margin: '0 auto', + textAlign: 'center', + }, +}); + +const FilterPanel = (props) => { + + const { classes } = props; + + const handleType = (name) => (event) => { + props.changeType(name, event.target.checked); + } + + return ( +
+ + props.filterJobs(event.target.value)} + margin="normal" + variant="outlined" + /> + { + Object.keys(props.filterType).map((filter, i) => { + return( + + } + label={filter} + /> + ); + }) + } + + +
+ ) +} + +const mapStateToProps = state => { + return { + filter: state[module].filter, + filterType: state[module].filterType, + } +} + +export default connect(mapStateToProps, { filterJobs, changeType, fetchNASJobs })(withStyles(styles)(FilterPanel)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobInfo.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobInfo.jsx new file mode 100644 index 00000000000..229cdeae55e --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobInfo.jsx @@ -0,0 +1,90 @@ +import React from 'react' +import { connect } from 'react-redux' +import { withStyles } from '@material-ui/core'; +import Button from '@material-ui/core/Button'; +import { Link } from 'react-router-dom'; +import ExpansionPanel from '@material-ui/core/ExpansionPanel'; +import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'; +import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; +import Typography from '@material-ui/core/Typography'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import LinearProgress from '@material-ui/core/LinearProgress'; + +import { fetchNASJobInfo } from '../../../actions/nasMonitorActions'; + +import NASJobStepInfo from './NASJobStepInfo'; + +const module = "nasMonitor"; + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + paddingTop: 20, + }, + heading: { + fontSize: theme.typography.pxToRem(15), + fontWeight: theme.typography.fontWeightRegular, + }, + panel: { + width: '100%', + }, + header: { + marginTop: 30, + textAlign: "center" + } +}) + + +class NASJobInfo extends React.Component { + + componentDidMount() { + this.props.fetchNASJobInfo(this.props.match.params.name); + } + + render () { + const { classes } = this.props; + return ( +
+ + + + {this.props.loading ? + + : +
+ + Experiment Name: {this.props.match.params.name} + +
+ {this.props.steps.map((step, i) => { + return ( + + }> + {step.name} + + + + + + ) + })} +
+ } + +
+ ) + } +} + +const mapStateToProps = (state) => { + return { + steps: state[module].steps, + loading: state[module].loading, + } +} + + +export default connect(mapStateToProps, { fetchNASJobInfo })(withStyles(styles)(NASJobInfo)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobList.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobList.jsx new file mode 100644 index 00000000000..44872b364d0 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobList.jsx @@ -0,0 +1,92 @@ +import React from 'react'; +import {connect} from 'react-redux'; +import { withStyles } from '@material-ui/core/styles'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import { Link } from 'react-router-dom'; +import { ListItemSecondaryAction, IconButton } from '@material-ui/core'; + +import { openDeleteExperimentDialog } from '../../../actions/generalActions'; +import DeleteDialog from '../../Menu/DeleteDialog'; +import ScheduleIcon from '@material-ui/icons/Schedule'; +import RestoreIcon from '@material-ui/icons/Restore'; +import HighlightOffIcon from '@material-ui/icons/HighlightOff'; +import DoneIcon from '@material-ui/icons/Done'; +import DeleteIcon from '@material-ui/icons/Delete'; +import HourglassFullIcon from '@material-ui/icons/HourglassFull'; + +const module = "nasMonitor"; + + +const styles = theme => ({ + created: { + color: theme.colors.created, + }, + running: { + color: theme.colors.running, + }, + restarting: { + color: theme.colors.restarting + }, + succeeded: { + color: theme.colors.succeeded, + }, + failed: { + color: theme.colors.failed, + }, +}); + + +const NASJobList = (props) => { + + const { classes } = props; + + const onDeleteExperiment = (experimentName) => (event) => { + props.openDeleteExperimentDialog(experimentName); + } + + return ( +
+ + {props.filteredJobsList.map((job, i) => { + let icon; + if (job.status === 'Created') { + icon = () + } else if (job.status === 'Running') { + icon = () + } else if (job.status === 'Restarting') { + icon = () + } else if (job.status === 'Succeeded') { + icon = () + } else if (job.status === 'Failed') { + icon = () + } + return ( + + + {icon} + + + + + + + + + ); + })} + + +
+ ) +} + +const mapStateToProps = (state) => { + return { + filteredJobsList: state[module].filteredJobsList, + } +} + +export default connect(mapStateToProps, { openDeleteExperimentDialog })(withStyles(styles)(NASJobList)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx new file mode 100644 index 00000000000..2298d1327f7 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobMonitor.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { withStyles } from '@material-ui/core/styles'; + +import FilterPanel from './FilterPanel'; +import NASJobList from './NASJobList'; + +import { connect } from 'react-redux'; + +import { fetchNASJobs } from '../../../actions/nasMonitorActions'; + + +const styles = theme => ({ + root: { + width: '90%', + margin: '0 auto', + }, +}); + +class NASJobMonitor extends React.Component { + + componentDidMount() { + this.props.fetchNASJobs(); + } + + render() { + + const { classes } = this.props; + return ( +
+

Monitor

+ + +
+ ) + } +} + + +export default connect(null, { fetchNASJobs })(withStyles(styles)(NASJobMonitor)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx b/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx new file mode 100644 index 00000000000..a82d1cbec62 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/NAS/Monitor/NASJobStepInfo.jsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { withStyles } from '@material-ui/core'; +import Typography from '@material-ui/core/Typography'; +import Button from '@material-ui/core/Button'; + +import * as d3 from 'd3' +import * as d3Graphviz from 'd3-graphviz' + + +const styles = theme => ({ + root: { + margin: '0 auto', + textAlign: 'center', + } +}) + +class NASJobStepInfo extends React.Component { + + componentDidMount() { + + const id = `graph${this.props.id}` + d3.select(`#${id}`) + .graphviz() + .renderDot(this.props.step.architecture) + .width(640) + .height(480) + .fit(true) + } + + render() { + + const { step, classes } = this.props; + const id = `graph${this.props.id}` + return ( +
+ + Architecture for Trial: {step.trialname} + +
+
+ {step.metricsname.map((metrics, index) => { + return ( + + {step.metricsname[index]}: {step.metricsvalue[index]}. + + ) + })} +
+ {/* TODO: add link in backend */} + + + +
+ ) + } +} + + +export default withStyles(styles)(NASJobStepInfo); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Templates/Collector.jsx b/pkg/ui/v1alpha2/frontend/src/components/Templates/Collector.jsx new file mode 100644 index 00000000000..dd457b403a5 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Templates/Collector.jsx @@ -0,0 +1,53 @@ +import React from 'react'; +import withStyles from '@material-ui/styles/withStyles'; + +import Typography from '@material-ui/core/Typography'; +import Button from '@material-ui/core/Button'; + +import TemplateList from './Common/TemplateList'; + +import { connect } from 'react-redux'; +import { openDialog, fetchCollectorTemplates } from '../../actions/templateActions'; +import AddDialog from './Common/AddDialog'; + +const styles = theme => ({ + root: { + flexGrow: 1, + marginTop: 40, + }, +}); + + +class Collector extends React.Component{ + + componentDidMount() { + this.props.fetchCollectorTemplates(); + } + + openAddDialog = () => { + this.props.openDialog("add"); + } + + render() { + + const { classes } = this.props; + + const type = "collector"; + + return ( +
+ + Collector Manifests + + + + + + +
+ ) + } +} +export default connect(null, { openDialog, fetchCollectorTemplates })(withStyles(styles)(Collector)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/AddDialog.jsx b/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/AddDialog.jsx new file mode 100644 index 00000000000..5fb64978daa --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/AddDialog.jsx @@ -0,0 +1,120 @@ +import React from 'react'; +import withStyles from '@material-ui/styles/withStyles'; + +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import TextField from '@material-ui/core/TextField'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import Slide from '@material-ui/core/Slide'; +import AceEditor from 'react-ace'; + +import { connect } from 'react-redux'; +import { closeDialog, addTemplate } from '../../../actions/templateActions'; + +const module = "template"; + +const styles = theme => ({ + textField: { + marginLeft: 4, + marginRight: 4, + width: 400, + marginBottom: 10, + }, +}); + +function Transition(props) { + return +} + +// FIX DIALOG TEXTFIELD SIZE + +class AddDialog extends React.Component { + + state = { + name: '', + yaml: '', + } + + onChange = (name) => (event) => { + this.setState({ + [name]: event.target.value + }) + } + + onChangeYaml = (name) => (value) => { + this.setState({ + [name]: value, + }) + } + + addTemplate = () => { + this.props.addTemplate(this.state.name, this.state.yaml, this.props.type, "add"); + } + + render () { + const { classes } = this.props; + + return ( +
+ + + {"Adding a template"} + + + +
+ + {/* */} +
+ + + + +
+
+ ) + } +} + +const mapStateToProps = (state) => { + return { + addOpen: state[module].addOpen, + edittedTemplate: state[module].edittedTemplate, + }; +}; + +export default connect(mapStateToProps, { closeDialog, addTemplate })(withStyles(styles)(AddDialog)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/DeleteDialog.jsx b/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/DeleteDialog.jsx new file mode 100644 index 00000000000..6bdd134675f --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/DeleteDialog.jsx @@ -0,0 +1,71 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; + +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import Slide from '@material-ui/core/Slide'; + +import { connect } from 'react-redux'; +import { closeDialog, deleteTemplate } from '../../../actions/templateActions'; + +const module = "template"; + +const useStyles = makeStyles({ + +}); + +function Transition(props) { + return +} + +const DeleteDialog = (props) => { + const classes = useStyles(); + + const deleteTemplate = (type) => (event) => { + props.deleteTemplate(props.currentTemplateName, type, "delete"); + } + + return ( +
+ + + {"Are you sure?"} + + + + Are you sure you want to delete this template? + + + + + + + +
+ ) +} + +const mapStateToProps = (state) => { + return { + deleteOpen: state[module].deleteOpen, + currentTemplateIndex: state[module].currentTemplateIndex, + currentTemplateName: state[module].currentTemplateName, + }; +}; + +export default connect(mapStateToProps, { closeDialog, deleteTemplate })(DeleteDialog); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/EditDialog.jsx b/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/EditDialog.jsx new file mode 100644 index 00000000000..be500acef11 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/EditDialog.jsx @@ -0,0 +1,110 @@ +import React from 'react'; +import withStyles from '@material-ui/styles/withStyles'; + +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import TextField from '@material-ui/core/TextField'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import Slide from '@material-ui/core/Slide'; + +import { connect } from 'react-redux'; +import { closeDialog, changeTemplate, editTemplate } from '../../../actions/templateActions'; + +const module = "template"; + +const styles = theme => ({ + textField: { + margin: 10, + width: 400, + }, +}); + +function Transition(props) { + return +} + +// FIX DIALOG TEXTFIELD SIZE + +class EditDialog extends React.Component { + + state = { + name: '', + yaml: '', + } + + componentDidMount() { + this.setState({ + name: this.props.edittedTemplate.name, + yaml: this.props.edittedTemplate.yaml + }) + } + + componentWillReceiveProps(newProps) { + this.setState({ + name: newProps.edittedTemplate.name, + yaml: newProps.edittedTemplate.yaml, + }) + } + + submitEditTemplate = () => { + this.props.editTemplate(this.state.name, this.state.yaml, this.props.type, "edit"); + } + + render () { + const { classes } = this.props; + return ( +
+ + + {"Editing a template"} + + + this.setState({ + name: event.target.value + })} + /> +
+ this.setState({ + yaml: event.target.value + })} + /> +
+ + + + +
+
+ ) + } +} + +const mapStateToProps = (state) => { + return { + editOpen: state[module].editOpen, + currentTemplateIndex: state[module].currentTemplateIndex, + edittedTemplate: state[module].edittedTemplate, + }; +}; + +export default connect(mapStateToProps, { closeDialog, changeTemplate, editTemplate })(withStyles(styles)(EditDialog)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/TemplateList.jsx b/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/TemplateList.jsx new file mode 100644 index 00000000000..3055d73fc51 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/TemplateList.jsx @@ -0,0 +1,65 @@ +import React from 'react'; +import { withStyles } from '@material-ui/core/styles'; +import ExpansionPanel from '@material-ui/core/ExpansionPanel'; +import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'; +import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; +import Typography from '@material-ui/core/Typography'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; + +import TemplatePanel from './TemplatePanel'; +import EditDialog from './EditDialog'; +import DeleteDialog from './DeleteDialog'; + +import { connect } from 'react-redux'; + +const module = "template"; + + +const styles = theme => ({ + root: { + marginTop: 40, + width: '100%', + }, + heading: { + fontSize: theme.typography.pxToRem(24), + fontWeight: theme.typography.fontWeightRegular, + }, +}); + +class TemplateList extends React.Component { + + + render () { + const { classes } = this.props; + const templates = (this.props.type === "trial" ? this.props.trialTemplates : this.props.collectorTemplates); + return ( +
+ {templates.map((template, index) => { + return ( + + }> + + {template.name} + + + + + + + + + ) + })} +
+ ) + } +} + +const mapStateToProps = (state) => { + return { + collectorTemplates: state[module].collectorTemplates, + trialTemplates: state[module].trialTemplates, + }; +}; + +export default connect(mapStateToProps, null)(withStyles(styles)(TemplateList)); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/TemplatePanel.jsx b/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/TemplatePanel.jsx new file mode 100644 index 00000000000..150699a0db3 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Templates/Common/TemplatePanel.jsx @@ -0,0 +1,91 @@ +import React from 'react'; +import makeStyles from '@material-ui/styles/makeStyles'; + +import Button from '@material-ui/core/Button'; +import Grid from '@material-ui/core/Grid'; + +import { connect } from 'react-redux'; + +import DeleteIcon from '@material-ui/icons/Delete'; +import CreateIcon from '@material-ui/icons/Create'; +import TextField from '@material-ui/core/TextField'; + +import { openDialog } from '../../../actions/templateActions'; + +// const module = "template"; + +const useStyles = makeStyles({ + root: { + flexGrow: 1, + }, + grid: { + marginTop: 30, + textAlign: 'right', + }, + icon: { + margin: 4, + }, + textField: { + width: '100%', + }, + input: { + color: 'black !important', + fontSize: 24 + } +}); + +const TemplatePanel = (props) => { + + const classes = useStyles(); + + const openEditDialog = (index) => (event) => { + props.openDialog("edit", index, props.type); + }; + + const openDeleteDialog = (index) => (event) => { + props.openDialog("delete", index, props.type, "delete"); + }; + + return ( +
+ + +
+ + + + + + + + +
+ ) +} + +const mapStateToProps = (state) => { + return { + + }; +}; + + +export default connect(mapStateToProps, { openDialog })(TemplatePanel); diff --git a/pkg/ui/v1alpha2/frontend/src/components/Templates/Trial.jsx b/pkg/ui/v1alpha2/frontend/src/components/Templates/Trial.jsx new file mode 100644 index 00000000000..b595799a833 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/Templates/Trial.jsx @@ -0,0 +1,52 @@ +import React from 'react'; +import withStyles from '@material-ui/styles/withStyles'; + +import Typography from '@material-ui/core/Typography'; +import Button from '@material-ui/core/Button'; + +import TemplateList from './Common/TemplateList'; + +import { connect } from 'react-redux'; +import { openDialog, fetchTrialTemplates } from '../../actions/templateActions'; +import AddDialog from './Common/AddDialog'; + + +const styles = theme => ({ + root: { + flexGrow: 1, + marginTop: 40, + }, +}); + +class Trial extends React.Component { + + componentDidMount() { + this.props.fetchTrialTemplates(); + } + + openAddDialog = () => { + this.props.openDialog("add"); + } + + render () { + const { classes } = this.props; + + const type = "trial"; + + return ( +
+ + Trial Manifests + + + + + + +
+ ) + } +} +export default connect(null, { openDialog, fetchTrialTemplates })(withStyles(styles)(Trial)); diff --git a/pkg/ui/v1alpha2/frontend/src/index.js b/pkg/ui/v1alpha2/frontend/src/index.js new file mode 100755 index 00000000000..017fa97e44e --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/index.js @@ -0,0 +1,54 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './components/App'; +import * as serviceWorker from './serviceWorker'; +import CssBaseline from '@material-ui/core/CssBaseline'; +import { createMuiTheme, MuiThemeProvider } from '@material-ui/core/styles'; +import configureStore from './store'; +import rootSaga from './sagas'; + +import { HashRouter as Router } from 'react-router-dom'; + +import { Provider } from 'react-redux'; + +const store = configureStore(); + +store.runSaga(rootSaga); + +const theme = createMuiTheme({ + palette: { + primary: { + main: '#000', + }, + secondary: { + main: '#fff', + }, + }, + colors: { + created: '#2304bd', + running: '#8b8ffb', + restarting: '#1eb9af', + succeeded: '#63f291', + failed: '#f26363', + }, + typography: { + fontFamily: 'open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol', + } +}); + + +ReactDOM.render( + + + + + + + + + , document.getElementById('root')); + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: http://bit.ly/CRA-PWA +serviceWorker.unregister(); diff --git a/pkg/ui/v1alpha2/frontend/src/reducers/general.js b/pkg/ui/v1alpha2/frontend/src/reducers/general.js new file mode 100644 index 00000000000..d0820359025 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/reducers/general.js @@ -0,0 +1,105 @@ +import * as actions from '../actions/generalActions'; +import * as nasCreateActions from '../actions/nasCreateActions'; +import * as hpCreateActions from '../actions/hpCreateActions'; + +const initialState = { + menuOpen: false, + snackOpen: false, + snackText: "", + deleteDialog: false, + deleteId: '', +}; + +const generalReducer = (state = initialState, action) => { + switch (action.type) { + case actions.TOGGLE_MENU: + return { + ...state, + menuOpen: action.state, + }; + case actions.CLOSE_SNACKBAR: + return { + ...state, + snackOpen: false, + }; + case actions.SUBMIT_YAML_SUCCESS: + return { + ...state, + snackOpen: true, + snackText: "Successfully submitted", + } + case actions.SUBMIT_YAML_FAILURE: + return { + ...state, + snackOpen: true, + snackText: action.message, + } + case actions.DELETE_EXPERIMENT_FAILURE: + return { + ...state, + deleteDialog: false, + snackOpen: true, + snackText: "Whoops, something went wrong", + } + case actions.DELETE_EXPERIMENT_SUCCESS: + return { + ...state, + deleteDialog: false, + snackOpen: true, + snackText: "Successfully deleted. Press Update button", + } + case actions.OPEN_DELETE_EXPERIMENT_DIALOG: + return { + ...state, + deleteDialog: true, + deleteExperimentName: action.experimentName, + } + case actions.CLOSE_DELETE_EXPERIMENT_DIALOG: + return { + ...state, + deleteDialog: false, + } + case nasCreateActions.SUBMIT_NAS_JOB_REQUEST: + return { + ...state, + loading: true, + } + case nasCreateActions.SUBMIT_NAS_JOB_SUCCESS: + return { + ...state, + loading: false, + snackOpen: true, + snackText: "Successfully submitted", + } + case nasCreateActions.SUBMIT_NAS_JOB_FAILURE: + return { + ...state, + loading: false, + snackOpen: true, + snackText: action.message, + } + case hpCreateActions.SUBMIT_HP_JOB_REQUEST: + return { + ...state, + loading: true, + } + case hpCreateActions.SUBMIT_HP_JOB_SUCCESS: + return { + ...state, + loading: false, + snackOpen: true, + snackText: "Successfully submitted", + } + case hpCreateActions.SUBMIT_HP_JOB_FAILURE: + return { + ...state, + loading: false, + snackOpen: true, + snackText: action.message, + } + default: + return state; + } +}; + +export default generalReducer; diff --git a/pkg/ui/v1alpha2/frontend/src/reducers/hpCreate.js b/pkg/ui/v1alpha2/frontend/src/reducers/hpCreate.js new file mode 100644 index 00000000000..936686a39fe --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/reducers/hpCreate.js @@ -0,0 +1,248 @@ +import * as actions from '../actions/hpCreateActions'; + +const initialState = { + loading: false, + commonParametersMetadata: [ + { + name: "Name", + value: "random-experiment", + description: "A name of an experiment" + }, + { + name: "Namespace", + value: "kubeflow", + description: "Namespace to deploy an experiment" + } + ], + commonParametersSpec: [ + { + name: "ParallelTrialCount", + value: "3", + description: "How many trials can be processed in parallel" + }, + { + name: "MaxTrialCount", + value: "12", + description: "Max completed trials to mark experiment as succeeded" + }, + { + name: "MaxFailedTrialCount", + value: "3", + description: "Max failed trials to mark experiment as failed" + } + ], + objective: [ + { + name: "Type", + value: "maximize", + description: "Type of optimization" + }, + { + name: "Goal", + value: "0.99", + description: "Goal of optimization" + }, + { + name: "ObjectiveMetricName", + value: "Validation-accuracy", + description: "Name for the objective metric" + } + ], + additionalMetricNames: [ + { + value: "accuracy" + } + ], + algorithmName: [ "random" ], + allAlgorithms: ["grid", "random", "hyperband"], + algorithmSettings: [ + + ], + parameters: [ + { + name: "--lr", + parameterType: "double", + feasibleSpace: "feasibleSpace", + min: "0.01", + max: "0.03", + list: [], + }, + { + name: "--num-layers", + parameterType: "int", + feasibleSpace: "feasibleSpace", + min: "2", + max: "5", + list: [], + }, + { + name: "--optimizer", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + list: [ + { + value: "sgd", + }, + { + value: "adam", + }, + { + value: "ftrl" + } + ], + }, + ], + allParameterTypes: ["int", "double", "categorical"], + trial: "cpuTrialTemplate.yaml", + currentYaml: '', +}; + +const filterValue = (obj, key) => { + return obj.findIndex(p => p.name === key) +}; + +const hpCreateReducer = (state = initialState, action) => { + switch (action.type) { + case actions.CHANGE_YAML_HP: + return { + ...state, + currentYaml: action.payload, + } + case actions.CHANGE_META_HP: + let meta = state.commonParametersMetadata.slice(); + let index = filterValue(meta, action.name); + meta[index].value = action.value; + return { + ...state, + commonParametersMetadata: meta, + } + case actions.CHANGE_SPEC_HP: + let spec = state.commonParametersSpec.slice(); + index = filterValue(spec, action.name); + spec[index].value = action.value; + return { + ...state, + commonParametersSpec: spec, + } + case actions.CHANGE_OBJECTIVE_HP: + let obj = state.objective.slice(); + index = filterValue(obj, action.name); + obj[index].value = action.value; + return { + ...state, + objective: obj, + } + case actions.ADD_METRICS_HP: + let additionalMetricNames = state.additionalMetricNames.slice() + additionalMetricNames.push({ + value: "", + }) + return { + ...state, + additionalMetricNames: additionalMetricNames, + } + case actions.DELETE_METRICS_HP: + additionalMetricNames = state.additionalMetricNames.slice() + additionalMetricNames.splice(action.index, 1) + return { + ...state, + additionalMetricNames: additionalMetricNames, + } + case actions.EDIT_METRICS_HP: + additionalMetricNames = state.additionalMetricNames.slice() + additionalMetricNames[action.index].value = action.value + return { + ...state, + additionalMetricNames: additionalMetricNames, + } + case actions.CHANGE_ALGORITHM_NAME_HP: + return { + ...state, + algorithmName: action.algorithmName, + } + case actions.ADD_ALGORITHM_SETTING_HP: + let algorithmSettings = state.algorithmSettings.slice(); + let setting = {name: "", value: ""}; + algorithmSettings.push(setting); + return { + ...state, + algorithmSettings: algorithmSettings, + } + case actions.CHANGE_ALGORITHM_SETTING_HP: + algorithmSettings = state.algorithmSettings.slice(); + algorithmSettings[action.index][action.field] = action.value; + return { + ...state, + algorithmSettings: algorithmSettings, + } + case actions.DELETE_ALGORITHM_SETTING_HP: + algorithmSettings = state.algorithmSettings.slice(); + algorithmSettings.splice(action.index, 1); + return { + ...state, + algorithmSettings: algorithmSettings, + } + case actions.ADD_PARAMETER_HP: + let parameters = state.parameters.slice(); + parameters.push({ + name: "", + parameterType: "", + feasibleSpace: "feasibleSpace", + min: "", + max: "", + list: [], + }) + return { + ...state, + parameters: parameters, + } + case actions.EDIT_PARAMETER_HP: + parameters = state.parameters.slice(); + parameters[action.index][action.field] = action.value; + return { + ...state, + parameters: parameters, + } + case actions.DELETE_PARAMETER_HP: + parameters = state.parameters.slice(); + parameters.splice(action.index, 1); + return { + ...state, + parameters: parameters, + } + case actions.ADD_LIST_PARAMETER_HP: + parameters = state.parameters.slice(); + parameters[action.paramIndex].list.push({ + value: "", + }) + return { + ...state, + parameters: parameters + } + case actions.EDIT_LIST_PARAMETER_HP: + parameters = state.parameters.slice(); + parameters[action.paramIndex].list[action.index].value = action.value; + return { + ...state, + parameters: parameters + } + case actions.DELETE_LIST_PARAMETER_HP: + parameters = state.parameters.slice(); + parameters[action.paramIndex].list.splice(action.index, 1); + return { + ...state, + parameters: parameters + } + case actions.CHANGE_TRIAL_HP: + return { + ...state, + trial: action.trial, + } + default: + return state; + } +}; + +export default hpCreateReducer; diff --git a/pkg/ui/v1alpha2/frontend/src/reducers/hpMonitor.js b/pkg/ui/v1alpha2/frontend/src/reducers/hpMonitor.js new file mode 100644 index 00000000000..208d34aa17c --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/reducers/hpMonitor.js @@ -0,0 +1,107 @@ +import * as actions from '../actions/hpMonitorActions'; + +const initialState = { + filter: '', + filterType: { + "Created": true, + "Running": true, + "Restarting": true, + "Succeeded": true, + "Failed": true, + }, + jobsList: [ + ], + filteredJobsList: [ + ], + jobData: [ + ], + trialData: [ + ], + dialogOpen: false, + loading: false, +}; + +const hpMonitorReducer = (state = initialState, action) => { + switch (action.type) { + case actions.FILTER_JOBS: + let jobs = state.jobsList.slice(); + let newList = jobs.filter(job => job.name.includes(action.filter)); + + let avTypes = Object.assign({}, state.filterType); + var typeKeys = Object.keys(avTypes); + + var avFilters = typeKeys.filter((key) => { + return avTypes[key] + }); + + let filteredJobs = newList.filter(job => avFilters.includes(job.status)); + + return { + ...state, + filteredJobsList: filteredJobs, + filter: action.filter, + } + case actions.CHANGE_TYPE: + const types = Object.assign({}, state.filterType) + types[action.filter] = action.checked; + var keys = Object.keys(types); + + var filters = keys.filter((key) => { + return types[key] + }); + const jobsList = state.jobsList.slice(); + const filtered = jobsList.filter(job => filters.includes(job.status)); + + return { + ...state, + filterType: types, + filteredJobsList: filtered, + } + case actions.FETCH_HP_JOBS_SUCCESS: + jobs = action.jobs + avTypes = Object.assign({}, state.filterType); + typeKeys = Object.keys(avTypes); + + avFilters = typeKeys.filter((key) => { + return avTypes[key] + }); + + filteredJobs = jobs.filter(job => avFilters.includes(job.status)); + return { + ...state, + jobsList: action.jobs, + filteredJobsList: filteredJobs, + } + case actions.FETCH_HP_JOB_INFO_REQUEST: + return { + ...state, + loading: true, + } + case actions.FETCH_HP_JOB_INFO_SUCCESS: + return { + ...state, + jobData: action.jobData, + loading: false, + } + case actions.FETCH_HP_JOB_INFO_FAILURE: + return { + ...state, + loading: false, + } + case actions.FETCH_HP_JOB_TRIAL_INFO_SUCCESS: + return { + ...state, + trialData: action.trialData, + dialogOpen: true, + } + case actions.CLOSE_DIALOG: + return { + ...state, + dialogOpen: false, + } + default: + return state; + } +}; + +export default hpMonitorReducer; diff --git a/pkg/ui/v1alpha2/frontend/src/reducers/index.js b/pkg/ui/v1alpha2/frontend/src/reducers/index.js new file mode 100644 index 00000000000..6c443a5a1f2 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/reducers/index.js @@ -0,0 +1,18 @@ +import { combineReducers } from 'redux' +import generalReducer from './general'; +import nasCreateReducer from './nasCreate'; +import nasMonitorReducer from './nasMonitor'; +import hpCreateReducer from './hpCreate'; +import templateReducer from './template'; +import hpMonitorReducer from './hpMonitor'; + +const rootReducer = combineReducers({ + ["general"]: generalReducer, + ["template"]: templateReducer, + ["hpCreate"]: hpCreateReducer, + ["hpMonitor"]: hpMonitorReducer, + ["nasCreate"]: nasCreateReducer, + ["nasMonitor"]: nasMonitorReducer, +}) + +export default rootReducer; diff --git a/pkg/ui/v1alpha2/frontend/src/reducers/nasCreate.js b/pkg/ui/v1alpha2/frontend/src/reducers/nasCreate.js new file mode 100644 index 00000000000..f6ddb1eb464 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/reducers/nasCreate.js @@ -0,0 +1,562 @@ +import * as actions from '../actions/nasCreateActions'; + +const initialState = { + commonParametersMetadata: [ + { + name: "Name", + value: "nasrl-example", + description: "A name of an experiment" + }, + { + name: "Namespace", + value: "kubeflow", + description: "Namespace to deploy an experiment" + } + ], + commonParametersSpec: [ + { + name: "ParallelTrialCount", + value: "3", + description: "How many trials can be processed in parallel" + }, + { + name: "MaxTrialCount", + value: "12", + description: "Max completed trials to mark experiment as succeeded" + }, + { + name: "MaxFailedTrialCount", + value: "3", + description: "Max failed trials to mark experiment as failed" + } + ], + objective: [ + { + name: "Type", + value: "maximize", + description: "Type of optimization" + }, + { + name: "Goal", + value: "0.99", + description: "Goal of optimization" + }, + { + name: "ObjectiveMetricName", + value: "Validation-Accuracy", + description: "Name for the objective metric" + } + ], + additionalMetricNames: [], + algorithmName: [ "nasrl" ], + allAlgorithms: ["nasrl", "envelopenet"], + algorithmSettings: [ + { + name: "lstm_num_cells", + value: "64", + }, + { + name: "lstm_num_layers", + value: "1", + }, + { + name: "lstm_keep_prob", + value: "1.0", + }, + { + name: "optimizer", + value: "adam", + }, + { + name: "init_learning_rate", + value: "1e-3", + }, + { + name: "lr_decay_start", + value: "0", + }, + { + name: "lr_decay_every", + value: "1000", + }, + { + name: "lr_decay_rate", + value: "0.9", + }, + { + name: "skip-target", + value: "0.4", + }, + { + name: "skip-weight", + value: "0.8", + }, + { + name: "l2_reg", + value: "0", + }, + { + name: "entropy_weight", + value: "1e-4", + }, + { + name: "baseline_decay", + value: "0.9999", + } + ], + //Graph Config + numLayers: '1', + inputSize: ['32', '32', '3'], + outputSize: ['10'], + operations: [ + { + operationType: "convolution", + parameters: [ + { + name: "filter_size", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "3", + }, + { + value: "5", + }, + { + value: "7", + } + ], + }, + { + name: "num_filter", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "32", + }, + { + value: "48", + }, + { + value: "64", + }, + { + value: "96", + }, + { + value: "128", + } + ], + }, + { + name: "stride", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "1", + }, + { + value: "2", + } + ], + }, + ] + }, + { + operationType: "separable_convolution", + parameters: [ + { + name: "filter_size", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "3", + }, + { + value: "5", + }, + { + value: "7", + }, + ], + }, + { + name: "num_filter", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "32", + }, + { + value: "48", + }, + { + value: "64", + }, + { + value: "96", + }, + { + value: "128", + }, + ], + }, + { + name: "stride", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "1", + }, + { + value: "2", + }, + ], + }, + { + name: "depth_multiplier", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "1", + }, + { + value: "2", + }, + ], + }, + ], + }, + { + operationType: "depthwise_convolution", + parameters: [ + { + name: "filter_size", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "3", + }, + { + value: "5", + }, + { + value: "7", + }, + ], + }, + { + name: "stride", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "1", + }, + { + value: "2", + }, + ], + }, + { + name: "depth_multiplier", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "1", + }, + { + value: "2", + }, + ], + }, + ], + }, + { + operationType: "reduction", + parameters: [ + { + name: "reduction_type", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + { + value: "max_pooling", + }, + { + value: "avg_pooling", + }, + ], + }, + { + name: "pool_size", + parameterType: "int", + feasibleSpace: "feasibleSpace", + min: "2", + max: "3", + step: "1", + list: [], + }, + ], + }, + ], + allParameterTypes: ["int", "double", "categorical"], + trial: 'nasRLTrialTemplate.yaml', + currentYaml: '', + snackText: '', + snackOpen: false, +}; + +const filterValue = (obj, key) => { + return obj.findIndex(p => p.name === key) +}; + +const nasCreateReducer = (state = initialState, action) => { + switch (action.type) { + case actions.CHANGE_YAML_NAS: + return { + ...state, + currentYaml: action.payload, + } + case actions.CHANGE_META_NAS: + let meta = state.commonParametersMetadata.slice(); + let index = filterValue(meta, action.name); + meta[index].value = action.value; + return { + ...state, + commonParametersMetadata: meta, + } + case actions.CHANGE_SPEC_NAS: + let spec = state.commonParametersSpec.slice(); + index = filterValue(spec, action.name); + spec[index].value = action.value; + return { + ...state, + commonParametersSpec: spec, + } + case actions.CHANGE_OBJECTIVE_NAS: + let obj = state.objective.slice(); + index = filterValue(obj, action.name); + obj[index].value = action.value; + return { + ...state, + objective: obj, + } + case actions.ADD_METRICS_NAS: + let additionalMetricNames = state.additionalMetricNames.slice() + additionalMetricNames.push({ + value: "", + }) + return { + ...state, + additionalMetricNames: additionalMetricNames, + } + case actions.DELETE_METRICS_NAS: + additionalMetricNames = state.additionalMetricNames.slice() + additionalMetricNames.splice(action.index, 1) + return { + ...state, + additionalMetricNames: additionalMetricNames, + } + case actions.EDIT_METRICS_NAS: + additionalMetricNames = state.additionalMetricNames.slice() + additionalMetricNames[action.index].value = action.value + return { + ...state, + additionalMetricNames: additionalMetricNames, + } + case actions.CHANGE_ALGORITHM_NAME_NAS: + return { + ...state, + algorithmName: action.algorithmName, + } + case actions.ADD_ALGORITHM_SETTING_NAS: + let algorithmSettings = state.algorithmSettings.slice(); + let setting = {name: "", value: ""}; + algorithmSettings.push(setting); + return { + ...state, + algorithmSettings: algorithmSettings, + } + case actions.CHANGE_ALGORITHM_SETTING_NAS: + algorithmSettings = state.algorithmSettings.slice(); + algorithmSettings[action.index][action.field] = action.value; + return { + ...state, + algorithmSettings: algorithmSettings, + } + case actions.DELETE_ALGORITHM_SETTING_NAS: + algorithmSettings = state.algorithmSettings.slice(); + algorithmSettings.splice(action.index, 1); + return { + ...state, + algorithmSettings: algorithmSettings, + } + case actions.EDIT_NUM_LAYERS: + let numLayers = action.value; + return { + ...state, + numLayers: numLayers + } + case actions.ADD_SIZE: + let size = state[action.sizeType].slice(); + size.push("0") + return { + ...state, + [action.sizeType]: size, + } + case actions.EDIT_SIZE: + size = state[action.sizeType].slice(); + size[action.index] = action.value; + return { + ...state, + [action.sizeType]: size, + } + case actions.DELETE_SIZE: + size = state[action.sizeType].slice(); + size.splice(action.index, 1); + return { + ...state, + [action.sizeType]: size, + } + case actions.ADD_OPERATION: + let operations = state.operations.slice(); + operations.push({ + operationType: "", + parameters: [], + }); + return { + ...state, + operations, + } + case actions.DELETE_OPERATION: + operations = state.operations.slice(); + operations.splice(action.index, 1); + return { + ...state, + operations, + } + case actions.CHANGE_OPERATION: + operations = state.operations.slice(); + operations[action.index].operationType = action.value; + return { + ...state, + operations, + } + case actions.ADD_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters.push( + { + name: "", + parameterType: "categorical", + feasibleSpace: "list", + min: "", + max: "", + step: "", + list: [ + ], + } + ) + return { + ...state, + operations, + } + case actions.CHANGE_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters[action.paramIndex][action.field] = action.value; + return { + ...state, + operations, + } + case actions.DELETE_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters.splice(action.paramIndex, 1); + return { + ...state, + operations, + } + case actions.ADD_LIST_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters[action.paramIndex].list.push( + { + //TODO: Remove it? + // name: "", + value: "", + } + ) + return { + ...state, + operations, + } + case actions.DELETE_LIST_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters[action.paramIndex].list.splice(action.listIndex, 1); + return { + ...state, + operations, + } + case actions.EDIT_LIST_PARAMETER_NAS: + operations = state.operations.slice(); + operations[action.opIndex].parameters[action.paramIndex].list[action.listIndex].value = action.value; + return { + ...state, + operations, + } + case actions.CHANGE_TRIAL_NAS: + return { + ...state, + trial: action.trial, + } + case actions.CLOSE_SNACKBAR: + return { + ...state, + snackOpen: false, + } + default: + return state; + } +}; + +export default nasCreateReducer; diff --git a/pkg/ui/v1alpha2/frontend/src/reducers/nasMonitor.js b/pkg/ui/v1alpha2/frontend/src/reducers/nasMonitor.js new file mode 100644 index 00000000000..87ddcfdff6f --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/reducers/nasMonitor.js @@ -0,0 +1,95 @@ +import * as actions from '../actions/nasMonitorActions'; + +const initialState = { + filter: '', + filterType: { + "Created": true, + "Running": true, + "Restarting": true, + "Succeeded": true, + "Failed": true, + }, + jobsList: [ + ], + filteredJobsList: [ + ], + loading: false, + steps: [ + + ] +}; + +const nasMonitorReducer = (state = initialState, action) => { + switch (action.type) { + case actions.FILTER_JOBS: + let jobs = state.jobsList.slice(); + let newList = jobs.filter(job => job.name.includes(action.filter)); + + let avTypes = Object.assign({}, state.filterType); + var typeKeys = Object.keys(avTypes); + + var avFilters = typeKeys.filter((key) => { + return avTypes[key] + }); + + let filteredJobs = newList.filter(job => avFilters.includes(job.status)); + + return { + ...state, + filteredJobsList: filteredJobs, + filter: action.filter, + } + case actions.CHANGE_TYPE: + const types = Object.assign({}, state.filterType) + types[action.filter] = action.checked; + var keys = Object.keys(types); + + var filters = keys.filter((key) => { + return types[key] + }); + const jobsList = state.jobsList.slice(); + const filtered = jobsList.filter(job => filters.includes(job.status)); + + return { + ...state, + filterType: types, + filteredJobsList: filtered, + } + case actions.FETCH_NAS_JOBS_SUCCESS: + jobs = action.jobs + avTypes = Object.assign({}, state.filterType); + typeKeys = Object.keys(avTypes); + + avFilters = typeKeys.filter((key) => { + return avTypes[key] + }); + + filteredJobs = jobs.filter(job => avFilters.includes(job.status)); + return { + ...state, + jobsList: action.jobs, + filteredJobsList: filteredJobs, + } + case actions.FETCH_NAS_JOB_INFO_REQUEST: + return { + ...state, + loading: true, + } + case actions.FETCH_NAS_JOB_INFO_FAILURE: + return { + ...state, + loading: false, + } + case actions.FETCH_NAS_JOB_INFO_SUCCESS: + return { + ...state, + loading: false, + steps: action.steps, + } + default: + return state; + } +}; + + +export default nasMonitorReducer; diff --git a/pkg/ui/v1alpha2/frontend/src/reducers/template.js b/pkg/ui/v1alpha2/frontend/src/reducers/template.js new file mode 100644 index 00000000000..0d8d196ecca --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/reducers/template.js @@ -0,0 +1,137 @@ +import * as actions from '../actions/templateActions'; + +const initialState = { + menuOpen: false, + addOpen: false, + editOpen: false, + deleteOpen: false, + trialTemplates: [], + collectorTemplates: [], + newTemplateName: '', + newTemplateYaml: '', + currentTemplateIndex: '', + edittedTemplate: { + name: '', + yaml: '', + }, + currentTemplateName: '', +}; + +const rootReducer = (state = initialState, action) => { + switch (action.type) { + case actions.CLOSE_DIALOG: + return { + ...state, + editOpen: false, + addOpen: false, + deleteOpen: false, + } + case actions.OPEN_DIALOG: + switch(action.dialogType) { + case "delete": + switch(action.templateType) { + case "trial": + return { + ...state, + deleteOpen: true, + currentTemplateIndex: action.index, + currentTemplateName: state.trialTemplates[action.index].name, + } + case "collector": + return { + ...state, + deleteOpen: true, + currentTemplateIndex: action.index, + currentTemplateName: state.collectorTemplates[action.index].name, + } + default: + return { + ...state, + } + } + case "edit": + switch(action.templateType) { + case "trial": + return { + ...state, + editOpen: true, + currentTemplateIndex: action.index, + edittedTemplate: state.trialTemplates[action.index], + } + case "collector": + return { + ...state, + editOpen: true, + currentTemplateIndex: action.index, + edittedTemplate: state.collectorTemplates[action.index], + } + default: + return { + ...state, + } + } + case "add": + return { + ...state, + addOpen: true, + }; + default: + return state; + } + case actions.CHANGE_TEMPLATE: + let edittedTemplate = state.edittedTemplate; + edittedTemplate[action.field] = action.value; + return { + ...state, + edittedTemplate: edittedTemplate, + } + case actions.FETCH_TRIAL_TEMPLATES_SUCCESS: + return { + ...state, + trialTemplates: action.templates, + } + case actions.FETCH_COLLECTOR_TEMPLATES_SUCCESS: + return { + ...state, + collectorTemplates: action.templates, + } + case actions.ADD_TEMPLATE_SUCCESS: + case actions.DELETE_TEMPLATE_SUCCESS: + case actions.EDIT_TEMPLATE_SUCCESS: + switch (action.templateType) { + case "trial": + return { + ...state, + addOpen: false, + deleteOpen: false, + editOpen: false, + trialTemplates: action.templates, + } + case "collector": + return { + ...state, + addOpen: false, + deleteOpen: false, + editOpen: false, + collectorTemplates: action.templates, + } + default: + return { + ...state, + } + } + case actions.ADD_TEMPLATE_FAILURE: + case actions.EDIT_TEMPLATE_FAILURE: + case actions.DELETE_TEMPLATE_FAILURE: + return { + ...state, + addOpen: false, + deleteOpen: false, + editOpen: false, + } + default: + return state; + } +}; + +export default rootReducer; diff --git a/pkg/ui/v1alpha2/frontend/src/sagas/index.js b/pkg/ui/v1alpha2/frontend/src/sagas/index.js new file mode 100644 index 00000000000..e015dbe0489 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/sagas/index.js @@ -0,0 +1,690 @@ +import { take, put, call, fork, select, all, takeEvery } from 'redux-saga/effects'; +import axios from 'axios'; +import * as templateActions from '../actions/templateActions'; +import * as hpMonitorActions from '../actions/hpMonitorActions'; +import * as hpCreateActions from '../actions/hpCreateActions'; +import * as nasMonitorActions from '../actions/nasMonitorActions'; +import * as nasCreateActions from '../actions/nasCreateActions'; +import * as generalActions from '../actions/generalActions'; + + +export const submitYaml = function *() { + while (true) { + const action = yield take(generalActions.SUBMIT_YAML_REQUEST); + try { + const result = yield call( + goSubmitYaml, + action.yaml + ) + if (result.status === 200) { + yield put({ + type: generalActions.SUBMIT_YAML_SUCCESS, + }) + } else { + yield put({ + type: generalActions.SUBMIT_YAML_FAILURE, + message: result.message, + }) + } + } catch (err) { + yield put({ + type: generalActions.SUBMIT_YAML_FAILURE, + }) + } + } +} + +const goSubmitYaml = function *(yaml) { + try { + const data = { + yaml + } + const result = yield call( + axios.post, + '/katib/submit_yaml/', + data, + ) + return result + } catch (err) { + return { + status: 500, + message: err.response.data, + } + } +} + +export const deleteExperiment = function *() { + while (true) { + const action = yield take(generalActions.DELETE_EXPERIMENT_REQUEST); + try { + const result = yield call( + goDeleteExperiment, + action.experimentName + ) + if (result.status === 200) { + yield put({ + type: generalActions.DELETE_EXPERIMENT_SUCCESS, + }) + } else { + yield put({ + type: generalActions.DELETE_EXPERIMENT_FAILURE, + }) + } + } catch (err) { + yield put({ + type: generalActions.DELETE_EXPERIMENT_FAILURE, + }) + } + } +} + +const goDeleteExperiment = function *(experimentName) { + try { + const result = yield call( + axios.get, + `/katib/delete_experiment/?experimentName=${experimentName}`, + ) + return result + } catch (err) { + yield put({ + type: generalActions.DELETE_EXPERIMENT_FAILURE, + }) + } +} + +export const submitHPJob = function *() { + while (true) { + const action = yield take(hpCreateActions.SUBMIT_HP_JOB_REQUEST); + try { + const result = yield call( + goSubmitHPJob, + action.data + ) + if (result.status === 200) { + yield put({ + type: hpCreateActions.SUBMIT_HP_JOB_SUCCESS, + }) + } else { + yield put({ + type: hpCreateActions.SUBMIT_HP_JOB_FAILURE, + message: result.message, + }) + } + } catch (err) { + yield put({ + type: hpCreateActions.SUBMIT_HP_JOB_FAILURE, + }) + } + } +} + +const goSubmitHPJob = function *(postData) { + try { + const data = { + postData + } + const result = yield call( + axios.post, + '/katib/submit_hp_job/', + data, + ) + return result + } catch (err) { + return { + status: 500, + message: err.response.data, + } + } +} + +export const fetchHPJobs = function *() { + while (true) { + const action = yield take(hpMonitorActions.FETCH_HP_JOBS_REQUEST); + try { + const result = yield call( + goFetchHPJobs + ) + if (result.status === 200) { + let data = Object.assign(result.data, {}) + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }) + yield put({ + type: hpMonitorActions.FETCH_HP_JOBS_SUCCESS, + jobs: data + }) + } else { + yield put({ + type: hpMonitorActions.FETCH_HP_JOBS_FAILURE, + }) + } + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOBS_FAILURE, + }) + } + } +} + +const goFetchHPJobs = function *() { + try { + const result = yield call( + axios.get, + '/katib/fetch_hp_jobs/', + ) + return result + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOBS_FAILURE, + }) + } +} + +export const fetchHPJobInfo = function *() { + while (true) { + const action = yield take(hpMonitorActions.FETCH_HP_JOB_INFO_REQUEST); + try { + const result = yield call( + goFetchHPJobInfo, + action.experimentName + ) + if (result.status === 200) { + let data = result.data.split("\n").map((line, i) => line.split(',')) + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_INFO_SUCCESS, + jobData: data + }) + } else { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_INFO_FAILURE, + }) + } + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_INFO_FAILURE, + }) + } + } +} + +const goFetchHPJobInfo = function *(experimentName) { + try { + const result = yield call( + axios.get, + `/katib/fetch_hp_job_info/?experimentName=${experimentName}`, + ) + return result + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_INFO_FAILURE, + }) + } +} + +export const fetchHPJobTrialInfo = function *() { + while (true) { + const action = yield take(hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_REQUEST); + try { + const result = yield call( + gofetchHPJobTrialInfo, + action.trialName + ) + if (result.status === 200) { + let data = result.data.split("\n").map((line, i) => line.split(',')) + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_SUCCESS, + trialData: data + }) + } else { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_FAILURE, + }) + } + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_FAILURE, + }) + } + } +} + +const gofetchHPJobTrialInfo = function *(trialName) { + try { + const result = yield call( + axios.get, + `/katib/fetch_hp_job_trial_info/?trialName=${trialName}`, + ) + return result + } catch (err) { + yield put({ + type: hpMonitorActions.FETCH_HP_JOB_TRIAL_INFO_FAILURE, + }) + } +} + +export const submitNASJob = function *() { + while (true) { + const action = yield take(nasCreateActions.SUBMIT_NAS_JOB_REQUEST); + try { + const result = yield call( + goSubmitNASJob, + action.data + ) + if (result.status === 200) { + yield put({ + type: nasCreateActions.SUBMIT_NAS_JOB_SUCCESS, + }) + } else { + yield put({ + type: nasCreateActions.SUBMIT_NAS_JOB_FAILURE, + message: result.message, + }) + } + } catch (err) { + yield put({ + type: nasCreateActions.SUBMIT_NAS_JOB_FAILURE, + }) + } + } +} + +const goSubmitNASJob = function *(postData) { + try { + const data = { + postData + } + const result = yield call( + axios.post, + '/katib/submit_nas_job/', + data, + ) + return result + } catch (err) { + return { + status: 500, + message: err.response.data, + } + } +} + + +export const fetchNASJobs = function *() { + while (true) { + const action = yield take(nasMonitorActions.FETCH_NAS_JOBS_REQUEST); + try { + const result = yield call( + goFetchNASJobs + ) + if (result.status === 200) { + let data = Object.assign(result.data, {}) + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }) + yield put({ + type: nasMonitorActions.FETCH_NAS_JOBS_SUCCESS, + jobs: data + }) + } else { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOBS_FAILURE, + }) + } + } catch (err) { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOBS_FAILURE, + }) + } + } +} + +const goFetchNASJobs = function *() { + try { + const result = yield call( + axios.get, + '/katib/fetch_nas_jobs/', + ) + return result + } catch (err) { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOBS_FAILURE, + }) + } +} + +export const fetchNASJobInfo = function *() { + while (true) { + const action = yield take(nasMonitorActions.FETCH_NAS_JOB_INFO_REQUEST); + try { + const result = yield call( + goFetchNASJobInfo, + action.experimentName + ) + if (result.status === 200) { + let data = Object.assign(result.data, {}) + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }) + yield put({ + type: nasMonitorActions.FETCH_NAS_JOB_INFO_SUCCESS, + steps: data, + }) + } else { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOB_INFO_FAILURE, + }) + } + } catch (err) { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOB_INFO_FAILURE, + }) + } + } +} + +const goFetchNASJobInfo = function *(experimentName) { + try { + const result = yield call( + axios.get, + `/katib/fetch_nas_job_info/?experimentName=${experimentName}`, + ) + return result + } catch (err) { + yield put({ + type: nasMonitorActions.FETCH_NAS_JOB_INFO_FAILURE, + }) + } +} + + +export const fetchTrialTemplates = function *() { + while (true) { + const action = yield take(templateActions.FETCH_TRIAL_TEMPLATES_REQUEST); + try { + const result = yield call( + goFetchTrialTemplates + ) + if (result.status === 200) { + let data = Object.assign(result.data, {}) + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }) + yield put({ + type: templateActions.FETCH_TRIAL_TEMPLATES_SUCCESS, + templates: data + }) + } else { + yield put({ + type: templateActions.FETCH_TRIAL_TEMPLATES_FAILURE, + }) + } + } catch (err) { + yield put({ + type: templateActions.FETCH_TRIAL_TEMPLATES_FAILURE, + }) + } + } +} + +const goFetchTrialTemplates = function *() { + try { + const result = yield call( + axios.get, + '/katib/fetch_trial_templates/', + ) + return result + } catch (err) { + yield put({ + type: templateActions.FETCH_TRIAL_TEMPLATES_FAILURE, + }) + } +} + +export const fetchCollectorTemplates = function *() { + while (true) { + const action = yield take(templateActions.FETCH_COLLECTOR_TEMPLATES_REQUEST); + try { + const result = yield call( + goFetchCollectorTemplates + ) + if (result.status === 200) { + let data = Object.assign(result.data, {}) + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }) + yield put({ + type: templateActions.FETCH_COLLECTOR_TEMPLATES_SUCCESS, + templates: data + }) + } else { + yield put({ + type: templateActions.FETCH_COLLECTOR_TEMPLATES_FAILURE, + }) + } + } catch (err) { + yield put({ + type: templateActions.FETCH_COLLECTOR_TEMPLATES_FAILURE, + }) + } + } +} + +const goFetchCollectorTemplates = function *() { + try { + const result = yield call( + axios.get, + '/katib/fetch_collector_templates/', + ) + return result + } catch (err) { + yield put({ + type: templateActions.FETCH_COLLECTOR_TEMPLATES_FAILURE, + }) + } +} + + +export const addTemplate = function *() { + while (true) { + const action = yield take(templateActions.ADD_TEMPLATE_REQUEST); + try { + const result = yield call( + goAddTemplate, + action.name, + action.yaml, + action.kind, + action.action + ) + if (result.status === 200) { + let data = Object.assign(result.data.Data, {}) + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }) + yield put({ + type: templateActions.ADD_TEMPLATE_SUCCESS, + templates: data, + templateType: result.data.TemplateType + }) + } else { + yield put({ + type: templateActions.ADD_TEMPLATE_FAILURE, + }) + } + } catch (err) { + yield put({ + type: templateActions.ADD_TEMPLATE_FAILURE, + }) + } + } +} + +const goAddTemplate = function *(name, yaml, kind, action) { + try { + const data = { + name, yaml, kind, action + } + const result = yield call( + axios.post, + '/katib/update_template/', + data, + ) + return result + } catch (err) { + yield put({ + type: templateActions.ADD_TEMPLATE_FAILURE, + }) + } +} + +export const editTemplate = function *() { + while (true) { + const action = yield take(templateActions.EDIT_TEMPLATE_REQUEST); + try { + const result = yield call( + goEditTemplate, + action.name, + action.yaml, + action.kind, + action.action + ) + if (result.status === 200) { + let data = Object.assign(result.data.Data, {}) + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }) + yield put({ + type: templateActions.EDIT_TEMPLATE_SUCCESS, + templates: data, + templateType: result.data.TemplateType + }) + } else { + yield put({ + type: templateActions.EDIT_TEMPLATE_FAILURE, + }) + } + } catch (err) { + yield put({ + type: templateActions.EDIT_TEMPLATE_FAILURE, + }) + } + } +} + +const goEditTemplate = function *(name, yaml, kind, action) { + try { + const data = { + name, yaml, kind, action + } + const result = yield call( + axios.post, + '/katib/update_template/', + data, + ) + return result + } catch (err) { + yield put({ + type: templateActions.EDIT_TEMPLATE_FAILURE, + }) + } +} + +export const deleteTemplate = function *() { + while (true) { + const action = yield take(templateActions.DELETE_TEMPLATE_REQUEST); + try { + const result = yield call( + goDeleteTemplate, + action.name, + action.kind, + action.action + ) + if (result.status === 200) { + let data = Object.assign(result.data.Data, {}) + data.map((template, i) => { + Object.keys(template).forEach(key => { + const value = template[key]; + delete template[key]; + template[key.toLowerCase()] = value; + }); + }) + yield put({ + type: templateActions.DELETE_TEMPLATE_SUCCESS, + templates: data, + templateType: result.data.TemplateType + }) + } else { + yield put({ + type: templateActions.DELETE_TEMPLATE_FAILURE, + }) + } + } catch (err) { + yield put({ + type: templateActions.DELETE_TEMPLATE_FAILURE, + }) + } + } +} + +const goDeleteTemplate = function *(name, kind, action) { + try { + const data = { + name, kind, action + } + const result = yield call( + axios.post, + '/katib/update_template/', + data, + ) + return result + } catch (err) { + yield put({ + type: templateActions.DELETE_TEMPLATE_FAILURE, + }) + } +} + +export default function* rootSaga() { + yield all([ + fork(fetchTrialTemplates), + fork(fetchCollectorTemplates), + fork(fetchHPJobs), + fork(fetchNASJobs), + fork(addTemplate), + fork(editTemplate), + fork(deleteTemplate), + fork(submitYaml), + fork(deleteExperiment), + fork(submitHPJob), + fork(submitNASJob), + fork(fetchHPJobInfo), + fork(fetchHPJobTrialInfo), + fork(fetchNASJobInfo) + ]); +}; diff --git a/pkg/ui/v1alpha2/frontend/src/serviceWorker.js b/pkg/ui/v1alpha2/frontend/src/serviceWorker.js new file mode 100755 index 00000000000..2283ff9ced1 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/serviceWorker.js @@ -0,0 +1,135 @@ +// This optional code is used to register a service worker. +// register() is not called by default. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on subsequent visits to a page, after all the +// existing tabs open on the page have been closed, since previously cached +// resources are updated in the background. + +// To learn more about the benefits of this model and instructions on how to +// opt-in, read http://bit.ly/CRA-PWA + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.1/8 is considered localhost for IPv4. + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) +); + +export function register(config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit http://bit.ly/CRA-PWA' + ); + }); + } else { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW(swUrl, config) { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See http://bit.ly/CRA-PWA.' + ); + + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker(swUrl, config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if ( + response.status === 404 || + (contentType != null && contentType.indexOf('javascript') === -1) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.' + ); + }); +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then(registration => { + registration.unregister(); + }); + } +} diff --git a/pkg/ui/v1alpha2/frontend/src/store/index.js b/pkg/ui/v1alpha2/frontend/src/store/index.js new file mode 100644 index 00000000000..efa374fabe9 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/store/index.js @@ -0,0 +1,24 @@ +import { createStore, applyMiddleware, compose } from 'redux'; +import logger from 'redux-logger'; +import createSagaMiddleware, { END } from 'redux-saga'; +import rootReducer from '../reducers'; + + +export default function configureStore(initialState) { + const sagaMiddleware = createSagaMiddleware(); + + const store = createStore( + rootReducer, + initialState, + compose( + applyMiddleware( + sagaMiddleware, + logger + ) + ) + ); + + store.runSaga = sagaMiddleware.run; + store.close = () => store.dispatch(END); + return store; +} diff --git a/pkg/ui/v1alpha2/types.go b/pkg/ui/v1alpha2/types.go new file mode 100644 index 00000000000..3b744725909 --- /dev/null +++ b/pkg/ui/v1alpha2/types.go @@ -0,0 +1,56 @@ +package ui + +import "github.com/kubeflow/katib/pkg/util/v1alpha2/katibclient" + +const maxMsgSize = 1<<31 - 1 + +var ( + // namespace = "default" + allowedHeaders = "Accept, Content-Type, Content-Length, Accept-Encoding, Authorization, X-CSRF-Token" +) + +type Decoder struct { + Layers int `json:"num_layers"` + InputSize []int `json:"input_size"` + OutputSize []int `json:"output_size"` + Embedding map[int]*Block `json:"embedding"` +} + +type Block struct { + ID int `json:"opt_id"` + Type string `json:"opt_type"` + Param Option `json:"opt_params"` +} + +type Option struct { + FilterNumber string `json:"num_filter"` + FilterSize string `json:"filter_size"` + Stride string `json:"stride"` +} + +type JobView struct { + Name string + Status string +} + +type TemplateView struct { + Name string + Yaml string +} + +type KatibUIHandler struct { + katibClient *katibclient.KatibClient +} + +type TemplateResponse struct { + TemplateType string + Data []TemplateView +} + +type NNView struct { + Name string + TrialName string + Architecture string + MetricsName []string + MetricsValue []string +} diff --git a/pkg/ui/v1alpha2/util.go b/pkg/ui/v1alpha2/util.go new file mode 100644 index 00000000000..7e2310f2093 --- /dev/null +++ b/pkg/ui/v1alpha2/util.go @@ -0,0 +1,140 @@ +package ui + +import ( + "encoding/json" + "errors" + "net/http" + "strconv" + "strings" + + gographviz "github.com/awalterschulze/gographviz" +) + +func enableCors(w *http.ResponseWriter) { + (*w).Header().Set("Content-Type", "text/html; charset=utf-8") + (*w).Header().Set("Access-Control-Allow-Origin", "*") + (*w).Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE") + (*w).Header().Set("Access-Control-Allow-Headers", allowedHeaders) + (*w).Header().Set("Access-Control-Expose-Headers", "Access-Control-*") + (*w).Header().Set("Access-Control-Allow-Credentials", "true") +} + +func getTemplatesView(templates map[string]string) []TemplateView { + templatesView := make([]TemplateView, 0) + + for key := range templates { + templatesView = append(templatesView, TemplateView{Name: key, Yaml: templates[key]}) + } + return templatesView +} + +func (k *KatibUIHandler) updateTemplates(newTemplate map[string]interface{}, isDelete bool) (TemplateResponse, error) { + var currentTemplates map[string]string + var err error + + if newTemplate["kind"].(string) == "collector" { + currentTemplates, err = k.katibClient.GetMetricsCollectorTemplates() + if err != nil { + return TemplateResponse{}, errors.New("GetMetricsCollectorTemplates failed: " + err.Error()) + } + } else { + currentTemplates, err = k.katibClient.GetTrialTemplates() + if err != nil { + return TemplateResponse{}, errors.New("GetTrialTemplates failed: " + err.Error()) + } + } + + if isDelete { + delete(currentTemplates, newTemplate["name"].(string)) + } else { + currentTemplates[newTemplate["name"].(string)] = newTemplate["yaml"].(string) + } + + if newTemplate["kind"].(string) == "collector" { + err = k.katibClient.UpdateMetricsCollectorTemplates(currentTemplates) + if err != nil { + return TemplateResponse{}, errors.New("UpdateMetricsCollectorTemplates failed: " + err.Error()) + } + } else { + err = k.katibClient.UpdateTrialTemplates(currentTemplates) + if err != nil { + return TemplateResponse{}, errors.New("UpdateTrialTemplates failed: " + err.Error()) + } + } + + TemplateResponse := TemplateResponse{ + Data: getTemplatesView(currentTemplates), + TemplateType: newTemplate["kind"].(string), + } + return TemplateResponse, nil +} + +func getNodeString(block *Block) string { + var nodeString string + switch block.Type { + case "convolution": + nodeString += block.Param.FilterSize + "x" + block.Param.FilterSize + nodeString += " conv\n" + nodeString += block.Param.FilterSize + " channels" + case "separable_convolution": + nodeString += block.Param.FilterSize + "x" + block.Param.FilterSize + nodeString += " sep_conv\n" + nodeString += block.Param.FilterSize + " channels" + case "depthwise_convolution": + nodeString += block.Param.FilterSize + "x" + block.Param.FilterSize + nodeString += " depth_conv\n" + case "reduction": + // TODO: Need to be fixed + nodeString += "3x3 max_pooling" + } + return strconv.Quote(nodeString) +} + +func generateNNImage(architecture string, decoder string) string { + + var architectureInt [][]int + + if err := json.Unmarshal([]byte(architecture), &architectureInt); err != nil { + panic(err) + } + /* + Always has num_layers, input_size, output_size and embeding + Embeding is a map: int to Parameter + Parameter has id, type, Option + + Beforehand substite all ' to " and wrap the string in ` + */ + + replacedDecoder := strings.Replace(decoder, `'`, `"`, -1) + var decoderParsed Decoder + + err := json.Unmarshal([]byte(replacedDecoder), &decoderParsed) + if err != nil { + panic(err) + } + + graphAst, _ := gographviz.ParseString(`digraph G {}`) + graph := gographviz.NewGraph() + if err := gographviz.Analyse(graphAst, graph); err != nil { + panic(err) + } + graph.AddNode("G", "0", map[string]string{"label": strconv.Quote("Input")}) + var i int + for i = 0; i < len(architectureInt); i++ { + graph.AddNode("G", strconv.Itoa(i+1), map[string]string{"label": getNodeString(decoderParsed.Embedding[architectureInt[i][0]])}) + graph.AddEdge(strconv.Itoa(i), strconv.Itoa(i+1), true, nil) + for j := 1; j < i+1; j++ { + if architectureInt[i][j] == 1 { + graph.AddEdge(strconv.Itoa(j-1), strconv.Itoa(i+1), true, nil) + } + } + } + graph.AddNode("G", strconv.Itoa(i+1), map[string]string{"label": strconv.Quote("GlobalAvgPool")}) + graph.AddEdge(strconv.Itoa(i), strconv.Itoa(i+1), true, nil) + graph.AddNode("G", strconv.Itoa(i+2), map[string]string{"label": strconv.Quote("FullConnect\nSoftmax")}) + graph.AddEdge(strconv.Itoa(i+1), strconv.Itoa(i+2), true, nil) + graph.AddNode("G", strconv.Itoa(i+3), map[string]string{"label": strconv.Quote("Output")}) + graph.AddEdge(strconv.Itoa(i+2), strconv.Itoa(i+3), true, nil) + s := graph.String() + return s +} diff --git a/prow_config.yaml b/prow_config.yaml index 9e31ab84195..f201391f115 100644 --- a/prow_config.yaml +++ b/prow_config.yaml @@ -18,7 +18,7 @@ workflows: - pkg/manager/v1alpha1/* - pkg/manager/modelstore/* - pkg/suggestion/v1alpha1/* - - pkg/ui/* + - pkg/ui/v1alpha1/* - cmd/earlystopping/* - cmd/katib-controller/v1alpha1/* - cmd/manager/v1alpha1/* @@ -31,7 +31,7 @@ workflows: - cmd/suggestion/nasrl/v1alpha1/* - cmd/suggestion/random/v1alpha1/* - cmd/tfevent-metricscollector/v1alpha1/* - - cmd/ui/* + - cmd/ui/v1alpha1/* - pkg/util/v1alpha1/* - test/e2e/v1alpha1/* - test/scripts/v1alpha1/* @@ -59,7 +59,7 @@ workflows: - pkg/manager/v1alpha1/* - pkg/manager/modelstore/* - pkg/suggestion/v1alpha1/* - - pkg/ui/* + - pkg/ui/v1alpha1/* - cmd/earlystopping/* - cmd/katib-controller/v1alpha1/* - cmd/manager/v1alpha1/* @@ -72,7 +72,7 @@ workflows: - cmd/suggestion/nasrl/v1alpha1/* - cmd/suggestion/random/v1alpha1/* - cmd/tfevent-metricscollector/v1alpha1/* - - cmd/ui/* + - cmd/ui/v1alpha1/* - pkg/util/v1alpha1/* - test/scripts/v1alpha1/* - test/workflows/* @@ -98,7 +98,7 @@ workflows: - pkg/manager/v1alpha2/* - pkg/manager/modelstore/* - pkg/suggestion/v1alpha2/* - - pkg/ui/* + - pkg/ui/v1alpha2/* - cmd/earlystopping/* - cmd/katib-controller/v1alpha2/* - cmd/manager/v1alpha2/* @@ -111,7 +111,7 @@ workflows: - cmd/suggestion/nasrl/v1alpha2/* - cmd/suggestion/random/v1alpha2/* - cmd/tfevent-metricscollector/v1alpha2/* - - cmd/ui/* + - cmd/ui/v1alpha2/* - pkg/util/v1alpha2/* - test/e2e/v1alpha2/* - test/scripts/v1alpha2/* @@ -140,7 +140,7 @@ workflows: - pkg/manager/v1alpha2/* - pkg/manager/modelstore/* - pkg/suggestion/v1alpha2/* - - pkg/ui/* + - pkg/ui/v1alpha2/* - cmd/earlystopping/* - cmd/katib-controller/v1alpha2/* - cmd/manager/v1alpha2/* @@ -153,7 +153,7 @@ workflows: - cmd/suggestion/nasrl/v1alpha2/* - cmd/suggestion/random/v1alpha2/* - cmd/tfevent-metricscollector/v1alpha2/* - - cmd/ui/* + - cmd/ui/v1alpha2/* - pkg/util/v1alpha2/* - test/scripts/v1alpha2/* - test/workflows/* diff --git a/scripts/v1alpha1/build.sh b/scripts/v1alpha1/build.sh index 1b606acada0..4db6d77e2e7 100755 --- a/scripts/v1alpha1/build.sh +++ b/scripts/v1alpha1/build.sh @@ -45,5 +45,5 @@ echo "Building earlystopping images..." docker build -t ${PREFIX}/v1alpha1/earlystopping-medianstopping -f ${CMD_PREFIX}/earlystopping/medianstopping/v1alpha1/Dockerfile . echo "Building UI image..." -docker build -t ${PREFIX}/v1alpha1/katib-ui -f ${CMD_PREFIX}/ui/Dockerfile . +docker build -t ${PREFIX}/v1alpha1/katib-ui -f ${CMD_PREFIX}/ui/v1alpha1/Dockerfile . diff --git a/scripts/v1alpha2/build.sh b/scripts/v1alpha2/build.sh index caa5f12aada..84cc4e4c39f 100755 --- a/scripts/v1alpha2/build.sh +++ b/scripts/v1alpha2/build.sh @@ -29,6 +29,11 @@ echo "Building core image..." docker build -t ${PREFIX}/v1alpha2/katib-controller -f ${CMD_PREFIX}/katib-controller/v1alpha2/Dockerfile . docker build -t ${PREFIX}/v1alpha2/katib-manager -f ${CMD_PREFIX}/manager/v1alpha2/Dockerfile . docker build -t ${PREFIX}/v1alpha2/metrics-collector -f ${CMD_PREFIX}/metricscollector/v1alpha2/Dockerfile . + +echo "Building UI image..." +docker build -t ${PREFIX}/v1alpha2/katib-ui -f ${CMD_PREFIX}/ui/v1alpha2/Dockerfile . + +echo "Building TF Event metrics collector image..." docker build -t ${PREFIX}/v1alpha2/tfevent-metrics-collector -f ${CMD_PREFIX}/tfevent-metricscollector/v1alpha2/Dockerfile . echo "Building suggestion images..." diff --git a/test/scripts/v1alpha1/build-ui.sh b/test/scripts/v1alpha1/build-ui.sh index 88f5b391015..8a03f4d2ff7 100755 --- a/test/scripts/v1alpha1/build-ui.sh +++ b/test/scripts/v1alpha1/build-ui.sh @@ -23,7 +23,7 @@ set -o pipefail export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} REGISTRY="${GCP_REGISTRY}" PROJECT="${GCP_PROJECT}" -GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-modeldb +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-katib-ui VERSION=$(git describe --tags --always --dirty) echo "Activating service-account" @@ -36,6 +36,7 @@ cp -r pkg ${GO_DIR}/pkg cp -r vendor ${GO_DIR}/vendor cd ${GO_DIR} -cp cmd/ui/Dockerfile . + +cp cmd/ui/v1alpha1/Dockerfile . gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1alpha1/katib-ui:${VERSION} --project=${PROJECT} gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1alpha1/katib-ui:${VERSION} ${REGISTRY}/${REPO_NAME}/katib-ui:latest --verbosity=info diff --git a/test/scripts/v1alpha2/build-ui.sh b/test/scripts/v1alpha2/build-ui.sh index 91200e57743..21ced04ca1e 100755 --- a/test/scripts/v1alpha2/build-ui.sh +++ b/test/scripts/v1alpha2/build-ui.sh @@ -25,7 +25,7 @@ set -o pipefail export PATH=${GOPATH}/bin:/usr/local/go/bin:${PATH} REGISTRY="${GCP_REGISTRY}" PROJECT="${GCP_PROJECT}" -GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-modeldb +GO_DIR=${GOPATH}/src/github.com/${REPO_OWNER}/${REPO_NAME}-katib-ui VERSION=$(git describe --tags --always --dirty) echo "Activating service-account" @@ -38,6 +38,7 @@ cp -r pkg ${GO_DIR}/pkg cp -r vendor ${GO_DIR}/vendor cd ${GO_DIR} -#cp cmd/ui/Dockerfile . -#gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/katib-ui:${VERSION} --project=${PROJECT} -#gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/katib-ui:${VERSION} ${REGISTRY}/${REPO_NAME}/katib-ui:latest --verbosity=info + +cp cmd/ui/v1alpha2/Dockerfile . +gcloud builds submit . --tag=${REGISTRY}/${REPO_NAME}/v1alpha2/katib-ui:${VERSION} --project=${PROJECT} +gcloud container images add-tag --quiet ${REGISTRY}/${REPO_NAME}/v1alpha2/katib-ui:${VERSION} ${REGISTRY}/${REPO_NAME}/katib-ui:latest --verbosity=info diff --git a/vendor/github.com/awalterschulze/gographviz/AUTHORS b/vendor/github.com/awalterschulze/gographviz/AUTHORS new file mode 100644 index 00000000000..fa0713aa447 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/AUTHORS @@ -0,0 +1,15 @@ +# This is the official list of GoGraphviz authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS file, which +# lists people. For example, employees are listed in CONTRIBUTORS, +# but not in AUTHORS, because the employer holds the copyright. + +# Names should be added to this file as one of +# Organization's name +# Individual's name +# Individual's name + +# Please keep the list sorted. + +Vastech SA (PTY) LTD +Xavier Chassin +Walter Schulze diff --git a/vendor/github.com/awalterschulze/gographviz/CONTRIBUTORS b/vendor/github.com/awalterschulze/gographviz/CONTRIBUTORS new file mode 100644 index 00000000000..ba8ecc80cd8 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/CONTRIBUTORS @@ -0,0 +1,2 @@ +Robin Eklind +Walter Schulze diff --git a/vendor/github.com/awalterschulze/gographviz/LICENSE b/vendor/github.com/awalterschulze/gographviz/LICENSE new file mode 100644 index 00000000000..6259ffd56cf --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/LICENSE @@ -0,0 +1,46 @@ +Copyright 2013 GoGraphviz Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +------------------------------------------------------------------------------- +Portions of gocc's source code has been derived from Go, and are covered by the +following license: +------------------------------------------------------------------------------- + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/vendor/github.com/awalterschulze/gographviz/analyse.go b/vendor/github.com/awalterschulze/gographviz/analyse.go new file mode 100644 index 00000000000..f82421e2a11 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/analyse.go @@ -0,0 +1,171 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "github.com/awalterschulze/gographviz/ast" +) + +// NewAnalysedGraph creates a Graph structure by analysing an Abstract Syntax Tree representing a parsed graph. +func NewAnalysedGraph(graph *ast.Graph) (*Graph, error) { + g := NewGraph() + if err := Analyse(graph, g); err != nil { + return nil, err + } + return g, nil +} + +// Analyse analyses an Abstract Syntax Tree representing a parsed graph into a newly created graph structure Interface. +func Analyse(graph *ast.Graph, g Interface) error { + gerr := newErrCatcher(g) + graph.Walk(&graphVisitor{gerr}) + return gerr.getError() +} + +type nilVisitor struct { +} + +func (w *nilVisitor) Visit(v ast.Elem) ast.Visitor { + return w +} + +type graphVisitor struct { + g errInterface +} + +func (w *graphVisitor) Visit(v ast.Elem) ast.Visitor { + graph, ok := v.(*ast.Graph) + if !ok { + return w + } + w.g.SetStrict(graph.Strict) + w.g.SetDir(graph.Type == ast.DIGRAPH) + graphName := graph.ID.String() + w.g.SetName(graphName) + return newStmtVisitor(w.g, graphName) +} + +func newStmtVisitor(g errInterface, graphName string) *stmtVisitor { + return &stmtVisitor{g, graphName, make(map[string]string), make(map[string]string), make(map[string]string)} +} + +type stmtVisitor struct { + g errInterface + graphName string + currentNodeAttrs map[string]string + currentEdgeAttrs map[string]string + currentGraphAttrs map[string]string +} + +func (w *stmtVisitor) Visit(v ast.Elem) ast.Visitor { + switch s := v.(type) { + case ast.NodeStmt: + return w.nodeStmt(s) + case ast.EdgeStmt: + return w.edgeStmt(s) + case ast.NodeAttrs: + return w.nodeAttrs(s) + case ast.EdgeAttrs: + return w.edgeAttrs(s) + case ast.GraphAttrs: + return w.graphAttrs(s) + case *ast.SubGraph: + return w.subGraph(s) + case *ast.Attr: + return w.attr(s) + case ast.AttrList: + return &nilVisitor{} + default: + //fmt.Fprintf(os.Stderr, "unknown stmt %T\n", v) + } + return w +} + +func ammend(attrs map[string]string, add map[string]string) map[string]string { + for key, value := range add { + if _, ok := attrs[key]; !ok { + attrs[key] = value + } + } + return attrs +} + +func overwrite(attrs map[string]string, overwrite map[string]string) map[string]string { + for key, value := range overwrite { + attrs[key] = value + } + return attrs +} + +func (w *stmtVisitor) nodeStmt(stmt ast.NodeStmt) ast.Visitor { + attrs := ammend(stmt.Attrs.GetMap(), w.currentNodeAttrs) + w.g.AddNode(w.graphName, stmt.NodeID.String(), attrs) + return &nilVisitor{} +} + +func (w *stmtVisitor) edgeStmt(stmt ast.EdgeStmt) ast.Visitor { + attrs := stmt.Attrs.GetMap() + attrs = ammend(attrs, w.currentEdgeAttrs) + src := stmt.Source.GetID() + srcName := src.String() + if stmt.Source.IsNode() { + w.g.AddNode(w.graphName, srcName, w.currentNodeAttrs) + } + srcPort := stmt.Source.GetPort() + for i := range stmt.EdgeRHS { + directed := bool(stmt.EdgeRHS[i].Op) + dst := stmt.EdgeRHS[i].Destination.GetID() + dstName := dst.String() + if stmt.EdgeRHS[i].Destination.IsNode() { + w.g.AddNode(w.graphName, dstName, w.currentNodeAttrs) + } + dstPort := stmt.EdgeRHS[i].Destination.GetPort() + w.g.AddPortEdge(srcName, srcPort.String(), dstName, dstPort.String(), directed, attrs) + src = dst + srcPort = dstPort + srcName = dstName + } + return w +} + +func (w *stmtVisitor) nodeAttrs(stmt ast.NodeAttrs) ast.Visitor { + w.currentNodeAttrs = overwrite(w.currentNodeAttrs, ast.AttrList(stmt).GetMap()) + return &nilVisitor{} +} + +func (w *stmtVisitor) edgeAttrs(stmt ast.EdgeAttrs) ast.Visitor { + w.currentEdgeAttrs = overwrite(w.currentEdgeAttrs, ast.AttrList(stmt).GetMap()) + return &nilVisitor{} +} + +func (w *stmtVisitor) graphAttrs(stmt ast.GraphAttrs) ast.Visitor { + attrs := ast.AttrList(stmt).GetMap() + for key, value := range attrs { + w.g.AddAttr(w.graphName, key, value) + } + w.currentGraphAttrs = overwrite(w.currentGraphAttrs, attrs) + return &nilVisitor{} +} + +func (w *stmtVisitor) subGraph(stmt *ast.SubGraph) ast.Visitor { + subGraphName := stmt.ID.String() + w.g.AddSubGraph(w.graphName, subGraphName, w.currentGraphAttrs) + return newStmtVisitor(w.g, subGraphName) +} + +func (w *stmtVisitor) attr(stmt *ast.Attr) ast.Visitor { + w.g.AddAttr(w.graphName, stmt.Field.String(), stmt.Value.String()) + return w +} diff --git a/vendor/github.com/awalterschulze/gographviz/ast/ast.go b/vendor/github.com/awalterschulze/gographviz/ast/ast.go new file mode 100644 index 00000000000..1487aacd680 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/ast/ast.go @@ -0,0 +1,680 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +//Abstract Syntax Tree representing the DOT grammar +package ast + +import ( + "errors" + "fmt" + "math/rand" + "sort" + "strings" + + "github.com/awalterschulze/gographviz/internal/token" +) + +var ( + r = rand.New(rand.NewSource(1234)) +) + +type Visitor interface { + Visit(e Elem) Visitor +} + +type Elem interface { + String() string +} + +type Walkable interface { + Walk(v Visitor) +} + +type Attrib interface{} + +type Bool bool + +const ( + FALSE = Bool(false) + TRUE = Bool(true) +) + +func (this Bool) String() string { + if this { + return "true" + } + return "false" +} + +func (this Bool) Walk(v Visitor) { + if v == nil { + return + } + v.Visit(this) +} + +type GraphType bool + +const ( + GRAPH = GraphType(false) + DIGRAPH = GraphType(true) +) + +func (this GraphType) String() string { + if this { + return "digraph" + } + return "graph" +} + +func (this GraphType) Walk(v Visitor) { + if v == nil { + return + } + v.Visit(this) +} + +type Graph struct { + Type GraphType + Strict bool + ID ID + StmtList StmtList +} + +func NewGraph(t, strict, id, l Attrib) (*Graph, error) { + g := &Graph{Type: t.(GraphType), Strict: bool(strict.(Bool)), ID: ID("")} + if id != nil { + g.ID = id.(ID) + } + if l != nil { + g.StmtList = l.(StmtList) + } + return g, nil +} + +func (this *Graph) String() string { + s := this.Type.String() + " " + this.ID.String() + " {\n" + if this.StmtList != nil { + s += this.StmtList.String() + } + s += "\n}\n" + return s +} + +func (this *Graph) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Type.Walk(v) + this.ID.Walk(v) + this.StmtList.Walk(v) +} + +type StmtList []Stmt + +func NewStmtList(s Attrib) (StmtList, error) { + ss := make(StmtList, 1) + ss[0] = s.(Stmt) + return ss, nil +} + +func AppendStmtList(ss, s Attrib) (StmtList, error) { + this := ss.(StmtList) + this = append(this, s.(Stmt)) + return this, nil +} + +func (this StmtList) String() string { + if len(this) == 0 { + return "" + } + s := "" + for i := 0; i < len(this); i++ { + ss := this[i].String() + if len(ss) > 0 { + s += "\t" + ss + ";\n" + } + } + return s +} + +func (this StmtList) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type Stmt interface { + Elem + Walkable + isStmt() +} + +func (this NodeStmt) isStmt() {} +func (this EdgeStmt) isStmt() {} +func (this EdgeAttrs) isStmt() {} +func (this NodeAttrs) isStmt() {} +func (this GraphAttrs) isStmt() {} +func (this *SubGraph) isStmt() {} +func (this *Attr) isStmt() {} + +type SubGraph struct { + ID ID + StmtList StmtList +} + +func NewSubGraph(id, l Attrib) (*SubGraph, error) { + g := &SubGraph{ID: ID(fmt.Sprintf("anon%d", r.Int63()))} + if id != nil { + if len(id.(ID)) > 0 { + g.ID = id.(ID) + } + } + if l != nil { + g.StmtList = l.(StmtList) + } + return g, nil +} + +func (this *SubGraph) GetID() ID { + return this.ID +} + +func (this *SubGraph) GetPort() Port { + return NewPort(nil, nil) +} + +func (this *SubGraph) String() string { + gName := this.ID.String() + if strings.HasPrefix(gName, "anon") { + gName = "" + } + s := "subgraph " + this.ID.String() + " {\n" + if this.StmtList != nil { + s += this.StmtList.String() + } + s += "\n}\n" + return s +} + +func (this *SubGraph) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.ID.Walk(v) + this.StmtList.Walk(v) +} + +type EdgeAttrs AttrList + +func NewEdgeAttrs(a Attrib) (EdgeAttrs, error) { + return EdgeAttrs(a.(AttrList)), nil +} + +func (this EdgeAttrs) String() string { + s := AttrList(this).String() + if len(s) == 0 { + return "" + } + return `edge ` + s +} + +func (this EdgeAttrs) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type NodeAttrs AttrList + +func NewNodeAttrs(a Attrib) (NodeAttrs, error) { + return NodeAttrs(a.(AttrList)), nil +} + +func (this NodeAttrs) String() string { + s := AttrList(this).String() + if len(s) == 0 { + return "" + } + return `node ` + s +} + +func (this NodeAttrs) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type GraphAttrs AttrList + +func NewGraphAttrs(a Attrib) (GraphAttrs, error) { + return GraphAttrs(a.(AttrList)), nil +} + +func (this GraphAttrs) String() string { + s := AttrList(this).String() + if len(s) == 0 { + return "" + } + return `graph ` + s +} + +func (this GraphAttrs) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type AttrList []AList + +func NewAttrList(a Attrib) (AttrList, error) { + as := make(AttrList, 0) + if a != nil { + as = append(as, a.(AList)) + } + return as, nil +} + +func AppendAttrList(as, a Attrib) (AttrList, error) { + this := as.(AttrList) + if a == nil { + return this, nil + } + this = append(this, a.(AList)) + return this, nil +} + +func (this AttrList) String() string { + s := "" + for _, alist := range this { + ss := alist.String() + if len(ss) > 0 { + s += "[ " + ss + " ] " + } + } + if len(s) == 0 { + return "" + } + return s +} + +func (this AttrList) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +func PutMap(attrmap map[string]string) AttrList { + attrlist := make(AttrList, 1) + attrlist[0] = make(AList, 0) + keys := make([]string, 0, len(attrmap)) + for key := range attrmap { + keys = append(keys, key) + } + sort.Strings(keys) + for _, name := range keys { + value := attrmap[name] + attrlist[0] = append(attrlist[0], &Attr{ID(name), ID(value)}) + } + return attrlist +} + +func (this AttrList) GetMap() map[string]string { + attrs := make(map[string]string) + for _, alist := range this { + for _, attr := range alist { + attrs[attr.Field.String()] = attr.Value.String() + } + } + return attrs +} + +type AList []*Attr + +func NewAList(a Attrib) (AList, error) { + as := make(AList, 1) + as[0] = a.(*Attr) + return as, nil +} + +func AppendAList(as, a Attrib) (AList, error) { + this := as.(AList) + attr := a.(*Attr) + this = append(this, attr) + return this, nil +} + +func (this AList) String() string { + if len(this) == 0 { + return "" + } + str := this[0].String() + for i := 1; i < len(this); i++ { + str += `, ` + this[i].String() + } + return str +} + +func (this AList) Walk(v Visitor) { + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type Attr struct { + Field ID + Value ID +} + +func NewAttr(f, v Attrib) (*Attr, error) { + a := &Attr{Field: f.(ID)} + a.Value = ID("true") + if v != nil { + ok := false + a.Value, ok = v.(ID) + if !ok { + return nil, errors.New(fmt.Sprintf("value = %v", v)) + } + } + return a, nil +} + +func (this *Attr) String() string { + return this.Field.String() + `=` + this.Value.String() +} + +func (this *Attr) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Field.Walk(v) + this.Value.Walk(v) +} + +type Location interface { + Elem + Walkable + isLocation() + GetID() ID + GetPort() Port + IsNode() bool +} + +func (this *NodeID) isLocation() {} +func (this *NodeID) IsNode() bool { return true } +func (this *SubGraph) isLocation() {} +func (this *SubGraph) IsNode() bool { return false } + +type EdgeStmt struct { + Source Location + EdgeRHS EdgeRHS + Attrs AttrList +} + +func NewEdgeStmt(id, e, attrs Attrib) (*EdgeStmt, error) { + var a AttrList = nil + var err error = nil + if attrs == nil { + a, err = NewAttrList(nil) + if err != nil { + return nil, err + } + } else { + a = attrs.(AttrList) + } + return &EdgeStmt{id.(Location), e.(EdgeRHS), a}, nil +} + +func (this EdgeStmt) String() string { + return strings.TrimSpace(this.Source.String() + this.EdgeRHS.String() + this.Attrs.String()) +} + +func (this EdgeStmt) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Source.Walk(v) + this.EdgeRHS.Walk(v) + this.Attrs.Walk(v) +} + +type EdgeRHS []*EdgeRH + +func NewEdgeRHS(op, id Attrib) (EdgeRHS, error) { + return EdgeRHS{&EdgeRH{op.(EdgeOp), id.(Location)}}, nil +} + +func AppendEdgeRHS(e, op, id Attrib) (EdgeRHS, error) { + erhs := e.(EdgeRHS) + erhs = append(erhs, &EdgeRH{op.(EdgeOp), id.(Location)}) + return erhs, nil +} + +func (this EdgeRHS) String() string { + s := "" + for i := range this { + s += this[i].String() + } + return strings.TrimSpace(s) +} + +func (this EdgeRHS) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type EdgeRH struct { + Op EdgeOp + Destination Location +} + +func (this *EdgeRH) String() string { + return strings.TrimSpace(this.Op.String() + this.Destination.String()) +} + +func (this *EdgeRH) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Op.Walk(v) + this.Destination.Walk(v) +} + +type NodeStmt struct { + NodeID *NodeID + Attrs AttrList +} + +func NewNodeStmt(id, attrs Attrib) (*NodeStmt, error) { + nid := id.(*NodeID) + var a AttrList = nil + var err error = nil + if attrs == nil { + a, err = NewAttrList(nil) + if err != nil { + return nil, err + } + } else { + a = attrs.(AttrList) + } + return &NodeStmt{nid, a}, nil +} + +func (this NodeStmt) String() string { + return strings.TrimSpace(this.NodeID.String() + ` ` + this.Attrs.String()) +} + +func (this NodeStmt) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.NodeID.Walk(v) + this.Attrs.Walk(v) +} + +type EdgeOp bool + +const ( + DIRECTED EdgeOp = true + UNDIRECTED EdgeOp = false +) + +func (this EdgeOp) String() string { + if this == DIRECTED { + return "->" + } + return "--" +} + +func (this EdgeOp) Walk(v Visitor) { + if v == nil { + return + } + v.Visit(this) +} + +type NodeID struct { + ID ID + Port Port +} + +func NewNodeID(id, port Attrib) (*NodeID, error) { + if port == nil { + return &NodeID{id.(ID), Port{"", ""}}, nil + } + return &NodeID{id.(ID), port.(Port)}, nil +} + +func MakeNodeID(id string, port string) *NodeID { + p := Port{"", ""} + if len(port) > 0 { + ps := strings.Split(port, ":") + p.ID1 = ID(ps[1]) + if len(ps) > 2 { + p.ID2 = ID(ps[2]) + } + } + return &NodeID{ID(id), p} +} + +func (this *NodeID) String() string { + return this.ID.String() + this.Port.String() +} + +func (this *NodeID) GetID() ID { + return this.ID +} + +func (this *NodeID) GetPort() Port { + return this.Port +} + +func (this *NodeID) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.ID.Walk(v) + this.Port.Walk(v) +} + +//TODO semantic analysis should decide which ID is an ID and which is a Compass Point +type Port struct { + ID1 ID + ID2 ID +} + +func NewPort(id1, id2 Attrib) Port { + port := Port{ID(""), ID("")} + if id1 != nil { + port.ID1 = id1.(ID) + } + if id2 != nil { + port.ID2 = id2.(ID) + } + return port +} + +func (this Port) String() string { + if len(this.ID1) == 0 { + return "" + } + s := ":" + this.ID1.String() + if len(this.ID2) > 0 { + s += ":" + this.ID2.String() + } + return s +} + +func (this Port) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.ID1.Walk(v) + this.ID2.Walk(v) +} + +type ID string + +func NewID(id Attrib) (ID, error) { + if id == nil { + return ID(""), nil + } + id_lit := string(id.(*token.Token).Lit) + return ID(id_lit), nil +} + +func (this ID) String() string { + return string(this) +} + +func (this ID) Walk(v Visitor) { + if v == nil { + return + } + v.Visit(this) +} diff --git a/vendor/github.com/awalterschulze/gographviz/attr.go b/vendor/github.com/awalterschulze/gographviz/attr.go new file mode 100644 index 00000000000..3d9f2acf1cd --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/attr.go @@ -0,0 +1,559 @@ +//Copyright 2017 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http)://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import "fmt" + +// Attr is an attribute key +type Attr string + +// NewAttr creates a new attribute key by checking whether it is a valid key +func NewAttr(key string) (Attr, error) { + a, ok := validAttrs[key] + if !ok { + return Attr(""), fmt.Errorf("%s is not a valid attribute", key) + } + return a, nil +} + +const ( + // Damping http://www.graphviz.org/content/attrs#dDamping + Damping Attr = "Damping" + // K http://www.graphviz.org/content/attrs#dK + K Attr = "K" + // URL http://www.graphviz.org/content/attrs#dURL + URL Attr = "URL" + // Background http://www.graphviz.org/content/attrs#d_background + Background Attr = "_background" + // Area http://www.graphviz.org/content/attrs#darea + Area Attr = "area" + // ArrowHead http://www.graphviz.org/content/attrs#darrowhead + ArrowHead Attr = "arrowhead" + // ArrowSize http://www.graphviz.org/content/attrs#darrowsize + ArrowSize Attr = "arrowsize" + // ArrowTail http://www.graphviz.org/content/attrs#darrowtail + ArrowTail Attr = "arrowtail" + // BB http://www.graphviz.org/content/attrs#dbb + BB Attr = "bb" + // BgColor http://www.graphviz.org/content/attrs#dbgcolor + BgColor Attr = "bgcolor" + // Center http://www.graphviz.org/content/attrs#dcenter + Center Attr = "center" + // Charset http://www.graphviz.org/content/attrs#dcharset + Charset Attr = "charset" + // ClusterRank http://www.graphviz.org/content/attrs#dclusterrank + ClusterRank Attr = "clusterrank" + // Color http://www.graphviz.org/content/attrs#dcolor + Color Attr = "color" + // ColorScheme http://www.graphviz.org/content/attrs#dcolorscheme + ColorScheme Attr = "colorscheme" + // Comment http://www.graphviz.org/content/attrs#dcomment + Comment Attr = "comment" + // Compound http://www.graphviz.org/content/attrs#dcompound + Compound Attr = "compound" + // Concentrate http://www.graphviz.org/content/attrs#dconcentrate + Concentrate Attr = "concentrate" + // Constraint http://www.graphviz.org/content/attrs#dconstraint + Constraint Attr = "constraint" + // Decorate http://www.graphviz.org/content/attrs#ddecorate + Decorate Attr = "decorate" + // DefaultDist http://www.graphviz.org/content/attrs#ddefaultdist + DefaultDist Attr = "defaultdist" + // Dim http://www.graphviz.org/content/attrs#ddim + Dim Attr = "dim" + // Dimen http://www.graphviz.org/content/attrs#ddimen + Dimen Attr = "dimen" + // Dir http://www.graphviz.org/content/attrs#ddir + Dir Attr = "dir" + // DirEdgeConstraints http://www.graphviz.org/content/attrs#ddir + DirEdgeConstraints Attr = "diredgeconstraints" + // Distortion http://www.graphviz.org/content/attrs#ddistortion + Distortion Attr = "distortion" + // DPI http://www.graphviz.org/content/attrs#ddpi + DPI Attr = "dpi" + // EdgeURL http://www.graphviz.org/content/attrs#d:edgeURL + EdgeURL Attr = "edgeURL" + // EdgeHREF http://www.graphviz.org/content/attrs#d:edgehref + EdgeHREF Attr = "edgehref" + // EdgeTarget http://www.graphviz.org/content/attrs#d:edgetarget + EdgeTarget Attr = "edgetarget" + // EdgeTooltip http://www.graphviz.org/content/attrs#d:edgetooltip + EdgeTooltip Attr = "edgetooltip" + // Epsilon http://www.graphviz.org/content/attrs#d:epsilon + Epsilon Attr = "epsilon" + // ESep http://www.graphviz.org/content/attrs#d:epsilon + ESep Attr = "esep" + // FillColor http://www.graphviz.org/content/attrs#dfillcolor + FillColor Attr = "fillcolor" + // FixedSize http://www.graphviz.org/content/attrs#dfixedsize + FixedSize Attr = "fixedsize" + // FontColor http://www.graphviz.org/content/attrs#dfontcolor + FontColor Attr = "fontcolor" + // FontName http://www.graphviz.org/content/attrs#dfontname + FontName Attr = "fontname" + // FontNames http://www.graphviz.org/content/attrs#dfontnames + FontNames Attr = "fontnames" + // FontPath http://www.graphviz.org/content/attrs#dfontpath + FontPath Attr = "fontpath" + // FontSize http://www.graphviz.org/content/attrs#dfontsize + FontSize Attr = "fontsize" + // ForceLabels http://www.graphviz.org/content/attrs#dforcelabels + ForceLabels Attr = "forcelabels" + // GradientAngle http://www.graphviz.org/content/attrs#dgradientangle + GradientAngle Attr = "gradientangle" + // Group http://www.graphviz.org/content/attrs#dgroup + Group Attr = "group" + // HeadURL http://www.graphviz.org/content/attrs#dheadURL + HeadURL Attr = "headURL" + // HeadLP http://www.graphviz.org/content/attrs#dhead_lp + HeadLP Attr = "head_lp" + // HeadClip http://www.graphviz.org/content/attrs#dheadclip + HeadClip Attr = "headclip" + // HeadHREF http://www.graphviz.org/content/attrs#dheadhref + HeadHREF Attr = "headhref" + // HeadLabel http://www.graphviz.org/content/attrs#dheadlabel + HeadLabel Attr = "headlabel" + // HeadPort http://www.graphviz.org/content/attrs#dheadport + HeadPort Attr = "headport" + // HeadTarget http://www.graphviz.org/content/attrs#dheadtarget + HeadTarget Attr = "headtarget" + // HeadTooltip http://www.graphviz.org/content/attrs#dheadtooltip + HeadTooltip Attr = "headtooltip" + // Height http://www.graphviz.org/content/attrs#dheight + Height Attr = "height" + // HREF http://www.graphviz.org/content/attrs#dhref + HREF Attr = "href" + // ID http://www.graphviz.org/content/attrs#did + ID Attr = "id" + // Image http://www.graphviz.org/content/attrs#dimage + Image Attr = "image" + // ImagePath http://www.graphviz.org/content/attrs#dimagepath + ImagePath Attr = "imagepath" + // ImageScale http://www.graphviz.org/content/attrs#dimagescale + ImageScale Attr = "imagescale" + // InputScale http://www.graphviz.org/content/attrs#dinputscale + InputScale Attr = "inputscale" + // Label http://www.graphviz.org/content/attrs#dlabel + Label Attr = "label" + // LabelURL http://www.graphviz.org/content/attrs#dlabelURL + LabelURL Attr = "labelURL" + // LabelScheme http://www.graphviz.org/content/attrs#dlabel_scheme + LabelScheme Attr = "label_scheme" + // LabelAngle http://www.graphviz.org/content/attrs#dlabelangle + LabelAngle Attr = "labelangle" + // LabelDistance http://www.graphviz.org/content/attrs#dlabeldistance + LabelDistance Attr = "labeldistance" + // LabelFloat http://www.graphviz.org/content/attrs#dlabelfloat + LabelFloat Attr = "labelfloat" + // LabelFontColor http://www.graphviz.org/content/attrs#dlabelfontcolor + LabelFontColor Attr = "labelfontcolor" + // LabelFontName http://www.graphviz.org/content/attrs#dlabelfontname + LabelFontName Attr = "labelfontname" + // LabelFontSize http://www.graphviz.org/content/attrs#dlabelfontsize + LabelFontSize Attr = "labelfontsize" + // LabelHREF http://www.graphviz.org/content/attrs#dlabelhref + LabelHREF Attr = "labelhref" + // LabelJust http://www.graphviz.org/content/attrs#dlabeljust + LabelJust Attr = "labeljust" + // LabelLOC http://www.graphviz.org/content/attrs#dlabelloc + LabelLOC Attr = "labelloc" + // LabelTarget http://www.graphviz.org/content/attrs#dlabeltarget + LabelTarget Attr = "labeltarget" + // LabelTooltip http://www.graphviz.org/content/attrs#dlabeltooltip + LabelTooltip Attr = "labeltooltip" + // Landscape http://www.graphviz.org/content/attrs#dlandscape + Landscape Attr = "landscape" + // Layer http://www.graphviz.org/content/attrs#dlayer + Layer Attr = "layer" + // LayerListSep http://www.graphviz.org/content/attrs#dlayerlistsep + LayerListSep Attr = "layerlistsep" + // Layers http://www.graphviz.org/content/attrs#dlayers + Layers Attr = "layers" + // LayerSelect http://www.graphviz.org/content/attrs#dlayerselect + LayerSelect Attr = "layerselect" + // LayerSep http://www.graphviz.org/content/attrs#dlayersep + LayerSep Attr = "layersep" + // Layout http://www.graphviz.org/content/attrs#dlayout + Layout Attr = "layout" + // Len http://www.graphviz.org/content/attrs#dlen + Len Attr = "len" + // Levels http://www.graphviz.org/content/attrs#dlevels + Levels Attr = "levels" + // LevelsGap http://www.graphviz.org/content/attrs#dlevelsgap + LevelsGap Attr = "levelsgap" + // LHead http://www.graphviz.org/content/attrs#dlhead + LHead Attr = "lhead" + // LHeight http://www.graphviz.org/content/attrs#dlheight + LHeight Attr = "lheight" + // LP http://www.graphviz.org/content/attrs#dlp + LP Attr = "lp" + // LTail http://www.graphviz.org/content/attrs#dltail + LTail Attr = "ltail" + // LWidth http://www.graphviz.org/content/attrs#dlwidth + LWidth Attr = "lwidth" + // Margin http://www.graphviz.org/content/attrs#dmargin + Margin Attr = "margin" + // MaxIter http://www.graphviz.org/content/attrs#dmaxiter + MaxIter Attr = "maxiter" + // MCLimit http://www.graphviz.org/content/attrs#dmclimit + MCLimit Attr = "mclimit" + // MinDist http://www.graphviz.org/content/attrs#dmindist + MinDist Attr = "mindist" + // MinLen http://www.graphviz.org/content/attrs#dmindist + MinLen Attr = "minlen" + // Mode http://www.graphviz.org/content/attrs#dmode + Mode Attr = "mode" + // Model http://www.graphviz.org/content/attrs#dmodel + Model Attr = "model" + // Mosek http://www.graphviz.org/content/attrs#dmosek + Mosek Attr = "mosek" + // NewRank http://www.graphviz.org/content/attrs#dnewrank + NewRank Attr = "newrank" + // NodeSep http://www.graphviz.org/content/attrs#dnodesep + NodeSep Attr = "nodesep" + // NoJustify http://www.graphviz.org/content/attrs#dnojustify + NoJustify Attr = "nojustify" + // Normalize http://www.graphviz.org/content/attrs#dnormalize + Normalize Attr = "normalize" + // NoTranslate http://www.graphviz.org/content/attrs#dnotranslate + NoTranslate Attr = "notranslate" + // NSLimit http://www.graphviz.org/content/attrs#dnslimit + NSLimit Attr = "nslimit" + // NSLimit1 http://www.graphviz.org/content/attrs#dnslimit1 + NSLimit1 Attr = "nslimit1" + // Ordering http://www.graphviz.org/content/attrs#dnslimit1 + Ordering Attr = "ordering" + // Orientation http://www.graphviz.org/content/attrs#dorientation + Orientation Attr = "orientation" + // OutputOrder http://www.graphviz.org/content/attrs#doutputorder + OutputOrder Attr = "outputorder" + // Overlap http://www.graphviz.org/content/attrs#doverlap + Overlap Attr = "overlap" + // OverlapScaling http://www.graphviz.org/content/attrs#doverlap_scaling + OverlapScaling Attr = "overlap_scaling" + // OverlapShrink http://www.graphviz.org/content/attrs#doverlap_shrink + OverlapShrink Attr = "overlap_shrink" + // Pack http://www.graphviz.org/content/attrs#dpack + Pack Attr = "pack" + // PackMode http://www.graphviz.org/content/attrs#dpackmode + PackMode Attr = "packmode" + // Pad http://www.graphviz.org/content/attrs#dpad + Pad Attr = "pad" + // Page http://www.graphviz.org/content/attrs#dpage + Page Attr = "page" + // PageDir http://www.graphviz.org/content/attrs#dpagedir + PageDir Attr = "pagedir" + // PenColor http://www.graphviz.org/content/attrs#dpencolor + PenColor Attr = "pencolor" + // PenWidth http://www.graphviz.org/content/attrs#dpenwidth + PenWidth Attr = "penwidth" + // Peripheries http://www.graphviz.org/content/attrs#dperipheries + Peripheries Attr = "peripheries" + // Pin http://www.graphviz.org/content/attrs#dperipheries + Pin Attr = "pin" + // Pos http://www.graphviz.org/content/attrs#dpos + Pos Attr = "pos" + // QuadTree http://www.graphviz.org/content/attrs#dquadtree + QuadTree Attr = "quadtree" + // Quantum http://www.graphviz.org/content/attrs#dquantum + Quantum Attr = "quantum" + // Rank http://www.graphviz.org/content/attrs#drank + Rank Attr = "rank" + // RankDir http://www.graphviz.org/content/attrs#drankdir + RankDir Attr = "rankdir" + // RankSep http://www.graphviz.org/content/attrs#dranksep + RankSep Attr = "ranksep" + // Ratio http://www.graphviz.org/content/attrs#dratio + Ratio Attr = "ratio" + // Rects http://www.graphviz.org/content/attrs#drects + Rects Attr = "rects" + // Regular http://www.graphviz.org/content/attrs#dregular + Regular Attr = "regular" + // ReMinCross http://www.graphviz.org/content/attrs#dremincross + ReMinCross Attr = "remincross" + // RepulsiveForce http://www.graphviz.org/content/attrs#drepulsiveforce + RepulsiveForce Attr = "repulsiveforce" + // Resolution http://www.graphviz.org/content/attrs#dresolution + Resolution Attr = "resolution" + // Root http://www.graphviz.org/content/attrs#droot + Root Attr = "root" + // Rotate http://www.graphviz.org/content/attrs#drotate + Rotate Attr = "rotate" + // Rotation http://www.graphviz.org/content/attrs#drotation + Rotation Attr = "rotation" + // SameHead http://www.graphviz.org/content/attrs#dsamehead + SameHead Attr = "samehead" + // SameTail http://www.graphviz.org/content/attrs#dsametail + SameTail Attr = "sametail" + // SamplePoints http://www.graphviz.org/content/attrs#dsamplepoints + SamplePoints Attr = "samplepoints" + // Scale http://www.graphviz.org/content/attrs#dscale + Scale Attr = "scale" + // SearchSize http://www.graphviz.org/content/attrs#dsearchsize + SearchSize Attr = "searchsize" + // Sep http://www.graphviz.org/content/attrs#dsep + Sep Attr = "sep" + // Shape http://www.graphviz.org/content/attrs#dshape + Shape Attr = "shape" + // ShapeFile http://www.graphviz.org/content/attrs#dshapefile + ShapeFile Attr = "shapefile" + // ShowBoxes http://www.graphviz.org/content/attrs#dshowboxes + ShowBoxes Attr = "showboxes" + // Sides http://www.graphviz.org/content/attrs#dsides + Sides Attr = "sides" + // Size http://www.graphviz.org/content/attrs#dsize + Size Attr = "size" + // Skew http://www.graphviz.org/content/attrs#dskew + Skew Attr = "skew" + // Smoothing http://www.graphviz.org/content/attrs#dsmoothing + Smoothing Attr = "smoothing" + // SortV http://www.graphviz.org/content/attrs#dsortv + SortV Attr = "sortv" + // Splines http://www.graphviz.org/content/attrs#dsplines + Splines Attr = "splines" + // Start http://www.graphviz.org/content/attrs#dstart + Start Attr = "start" + // Style http://www.graphviz.org/content/attrs#dstyle + Style Attr = "style" + // StyleSheet http://www.graphviz.org/content/attrs#dstylesheet + StyleSheet Attr = "stylesheet" + // TailURL http://www.graphviz.org/content/attrs#dtailURL + TailURL Attr = "tailURL" + // TailLP http://www.graphviz.org/content/attrs#dtail_lp + TailLP Attr = "tail_lp" + // TailClip http://www.graphviz.org/content/attrs#dtailclip + TailClip Attr = "tailclip" + // TailHREF http://www.graphviz.org/content/attrs#dtailhref + TailHREF Attr = "tailhref" + // TailLabel http://www.graphviz.org/content/attrs#dtaillabel + TailLabel Attr = "taillabel" + // TailPort http://www.graphviz.org/content/attrs#dtailport + TailPort Attr = "tailport" + // TailTarget http://www.graphviz.org/content/attrs#dtailtarget + TailTarget Attr = "tailtarget" + // TailTooltip http://www.graphviz.org/content/attrs#dtailtooltip + TailTooltip Attr = "tailtooltip" + // Target http://www.graphviz.org/content/attrs#dtarget + Target Attr = "target" + // Tooltip http://www.graphviz.org/content/attrs#dtooltip + Tooltip Attr = "tooltip" + // TrueColor http://www.graphviz.org/content/attrs#dtooltip + TrueColor Attr = "truecolor" + // Vertices http://www.graphviz.org/content/attrs#dvertices + Vertices Attr = "vertices" + // ViewPort http://www.graphviz.org/content/attrs#dviewport + ViewPort Attr = "viewport" + // VoroMargin http://www.graphviz.org/content/attrs#dvoro_margin + VoroMargin Attr = "voro_margin" + // Weight http://www.graphviz.org/content/attrs#dweight + Weight Attr = "weight" + // Width http://www.graphviz.org/content/attrs#dwidth + Width Attr = "width" + // XDotVersion http://www.graphviz.org/content/attrs#dxdotversion + XDotVersion Attr = "xdotversion" + // XLabel http://www.graphviz.org/content/attrs#dxlabel + XLabel Attr = "xlabel" + // XLP http://www.graphviz.org/content/attrs#dxlp + XLP Attr = "xlp" + // Z http://www.graphviz.org/content/attrs#dz + Z Attr = "z" + + // MinCross is not in the documentation, but found in the Ped_Lion_Share (lion_share.gv.txt) example + MinCross Attr = "mincross" + // SSize is not in the documentation, but found in the siblings.gv.txt example + SSize Attr = "ssize" + // Outline is not in the documentation, but found in the siblings.gv.txt example + Outline Attr = "outline" + // F is not in the documentation, but found in the transparency.gv.txt example + F Attr = "f" +) + +var validAttrs = map[string]Attr{ + string(Damping): Damping, + string(K): K, + string(URL): URL, + string(Background): Background, + string(Area): Area, + string(ArrowHead): ArrowHead, + string(ArrowSize): ArrowSize, + string(ArrowTail): ArrowTail, + string(BB): BB, + string(BgColor): BgColor, + string(Center): Center, + string(Charset): Charset, + string(ClusterRank): ClusterRank, + string(Color): Color, + string(ColorScheme): ColorScheme, + string(Comment): Comment, + string(Compound): Compound, + string(Concentrate): Concentrate, + string(Constraint): Constraint, + string(Decorate): Decorate, + string(DefaultDist): DefaultDist, + string(Dim): Dim, + string(Dimen): Dimen, + string(Dir): Dir, + string(DirEdgeConstraints): DirEdgeConstraints, + string(Distortion): Distortion, + string(DPI): DPI, + string(EdgeURL): EdgeURL, + string(EdgeHREF): EdgeHREF, + string(EdgeTarget): EdgeTarget, + string(EdgeTooltip): EdgeTooltip, + string(Epsilon): Epsilon, + string(ESep): ESep, + string(FillColor): FillColor, + string(FixedSize): FixedSize, + string(FontColor): FontColor, + string(FontName): FontName, + string(FontNames): FontNames, + string(FontPath): FontPath, + string(FontSize): FontSize, + string(ForceLabels): ForceLabels, + string(GradientAngle): GradientAngle, + string(Group): Group, + string(HeadURL): HeadURL, + string(HeadLP): HeadLP, + string(HeadClip): HeadClip, + string(HeadHREF): HeadHREF, + string(HeadLabel): HeadLabel, + string(HeadPort): HeadPort, + string(HeadTarget): HeadTarget, + string(HeadTooltip): HeadTooltip, + string(Height): Height, + string(HREF): HREF, + string(ID): ID, + string(Image): Image, + string(ImagePath): ImagePath, + string(ImageScale): ImageScale, + string(InputScale): InputScale, + string(Label): Label, + string(LabelURL): LabelURL, + string(LabelScheme): LabelScheme, + string(LabelAngle): LabelAngle, + string(LabelDistance): LabelDistance, + string(LabelFloat): LabelFloat, + string(LabelFontColor): LabelFontColor, + string(LabelFontName): LabelFontName, + string(LabelFontSize): LabelFontSize, + string(LabelHREF): LabelHREF, + string(LabelJust): LabelJust, + string(LabelLOC): LabelLOC, + string(LabelTarget): LabelTarget, + string(LabelTooltip): LabelTooltip, + string(Landscape): Landscape, + string(Layer): Layer, + string(LayerListSep): LayerListSep, + string(Layers): Layers, + string(LayerSelect): LayerSelect, + string(LayerSep): LayerSep, + string(Layout): Layout, + string(Len): Len, + string(Levels): Levels, + string(LevelsGap): LevelsGap, + string(LHead): LHead, + string(LHeight): LHeight, + string(LP): LP, + string(LTail): LTail, + string(LWidth): LWidth, + string(Margin): Margin, + string(MaxIter): MaxIter, + string(MCLimit): MCLimit, + string(MinDist): MinDist, + string(MinLen): MinLen, + string(Mode): Mode, + string(Model): Model, + string(Mosek): Mosek, + string(NewRank): NewRank, + string(NodeSep): NodeSep, + string(NoJustify): NoJustify, + string(Normalize): Normalize, + string(NoTranslate): NoTranslate, + string(NSLimit): NSLimit, + string(NSLimit1): NSLimit1, + string(Ordering): Ordering, + string(Orientation): Orientation, + string(OutputOrder): OutputOrder, + string(Overlap): Overlap, + string(OverlapScaling): OverlapScaling, + string(OverlapShrink): OverlapShrink, + string(Pack): Pack, + string(PackMode): PackMode, + string(Pad): Pad, + string(Page): Page, + string(PageDir): PageDir, + string(PenColor): PenColor, + string(PenWidth): PenWidth, + string(Peripheries): Peripheries, + string(Pin): Pin, + string(Pos): Pos, + string(QuadTree): QuadTree, + string(Quantum): Quantum, + string(Rank): Rank, + string(RankDir): RankDir, + string(RankSep): RankSep, + string(Ratio): Ratio, + string(Rects): Rects, + string(Regular): Regular, + string(ReMinCross): ReMinCross, + string(RepulsiveForce): RepulsiveForce, + string(Resolution): Resolution, + string(Root): Root, + string(Rotate): Rotate, + string(Rotation): Rotation, + string(SameHead): SameHead, + string(SameTail): SameTail, + string(SamplePoints): SamplePoints, + string(Scale): Scale, + string(SearchSize): SearchSize, + string(Sep): Sep, + string(Shape): Shape, + string(ShapeFile): ShapeFile, + string(ShowBoxes): ShowBoxes, + string(Sides): Sides, + string(Size): Size, + string(Skew): Skew, + string(Smoothing): Smoothing, + string(SortV): SortV, + string(Splines): Splines, + string(Start): Start, + string(Style): Style, + string(StyleSheet): StyleSheet, + string(TailURL): TailURL, + string(TailLP): TailLP, + string(TailClip): TailClip, + string(TailHREF): TailHREF, + string(TailLabel): TailLabel, + string(TailPort): TailPort, + string(TailTarget): TailTarget, + string(TailTooltip): TailTooltip, + string(Target): Target, + string(Tooltip): Tooltip, + string(TrueColor): TrueColor, + string(Vertices): Vertices, + string(ViewPort): ViewPort, + string(VoroMargin): VoroMargin, + string(Weight): Weight, + string(Width): Width, + string(XDotVersion): XDotVersion, + string(XLabel): XLabel, + string(XLP): XLP, + string(Z): Z, + + string(MinCross): MinCross, + string(SSize): SSize, + string(Outline): Outline, + string(F): F, +} diff --git a/vendor/github.com/awalterschulze/gographviz/attrs.go b/vendor/github.com/awalterschulze/gographviz/attrs.go new file mode 100644 index 00000000000..a00eeb7dd7d --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/attrs.go @@ -0,0 +1,99 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "sort" +) + +// Attrs represents attributes for an Edge, Node or Graph. +type Attrs map[Attr]string + +// NewAttrs creates an empty Attributes type. +func NewAttrs(m map[string]string) (Attrs, error) { + as := make(Attrs) + for k, v := range m { + if err := as.Add(k, v); err != nil { + return nil, err + } + } + return as, nil +} + +// Add adds an attribute name and value. +func (attrs Attrs) Add(field string, value string) error { + a, err := NewAttr(field) + if err != nil { + return err + } + attrs.add(a, value) + return nil +} + +func (attrs Attrs) add(field Attr, value string) { + attrs[field] = value +} + +// Extend adds the attributes into attrs Attrs type overwriting duplicates. +func (attrs Attrs) Extend(more Attrs) { + for key, value := range more { + attrs.add(key, value) + } +} + +// Ammend only adds the missing attributes to attrs Attrs type. +func (attrs Attrs) Ammend(more Attrs) { + for key, value := range more { + if _, ok := attrs[key]; !ok { + attrs.add(key, value) + } + } +} + +func (attrs Attrs) toMap() map[string]string { + m := make(map[string]string) + for k, v := range attrs { + m[string(k)] = v + } + return m +} + +type attrList []Attr + +func (attrs attrList) Len() int { return len(attrs) } +func (attrs attrList) Less(i, j int) bool { + return attrs[i] < attrs[j] +} +func (attrs attrList) Swap(i, j int) { + attrs[i], attrs[j] = attrs[j], attrs[i] +} + +func (attrs Attrs) sortedNames() []Attr { + keys := make(attrList, 0) + for key := range attrs { + keys = append(keys, key) + } + sort.Sort(keys) + return []Attr(keys) +} + +// Copy returns a copy of the attributes map +func (attrs Attrs) Copy() Attrs { + mm := make(Attrs) + for k, v := range attrs { + mm[k] = v + } + return mm +} diff --git a/vendor/github.com/awalterschulze/gographviz/catch.go b/vendor/github.com/awalterschulze/gographviz/catch.go new file mode 100644 index 00000000000..7a4ed1183d8 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/catch.go @@ -0,0 +1,101 @@ +//Copyright 2017 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "fmt" + "strings" +) + +type errInterface interface { + SetStrict(strict bool) + SetDir(directed bool) + SetName(name string) + AddPortEdge(src, srcPort, dst, dstPort string, directed bool, attrs map[string]string) + AddEdge(src, dst string, directed bool, attrs map[string]string) + AddNode(parentGraph string, name string, attrs map[string]string) + AddAttr(parentGraph string, field, value string) + AddSubGraph(parentGraph string, name string, attrs map[string]string) + String() string + getError() error +} + +func newErrCatcher(g Interface) errInterface { + return &errCatcher{g, nil} +} + +type errCatcher struct { + Interface + errs []error +} + +func (e *errCatcher) SetStrict(strict bool) { + if err := e.Interface.SetStrict(strict); err != nil { + e.errs = append(e.errs, err) + } +} + +func (e *errCatcher) SetDir(directed bool) { + if err := e.Interface.SetDir(directed); err != nil { + e.errs = append(e.errs, err) + } +} + +func (e *errCatcher) SetName(name string) { + if err := e.Interface.SetName(name); err != nil { + e.errs = append(e.errs, err) + } +} + +func (e *errCatcher) AddPortEdge(src, srcPort, dst, dstPort string, directed bool, attrs map[string]string) { + if err := e.Interface.AddPortEdge(src, srcPort, dst, dstPort, directed, attrs); err != nil { + e.errs = append(e.errs, err) + } +} + +func (e *errCatcher) AddEdge(src, dst string, directed bool, attrs map[string]string) { + if err := e.Interface.AddEdge(src, dst, directed, attrs); err != nil { + e.errs = append(e.errs, err) + } +} + +func (e *errCatcher) AddAttr(parentGraph string, field, value string) { + if err := e.Interface.AddAttr(parentGraph, field, value); err != nil { + e.errs = append(e.errs, err) + } +} + +func (e *errCatcher) AddSubGraph(parentGraph string, name string, attrs map[string]string) { + if err := e.Interface.AddSubGraph(parentGraph, name, attrs); err != nil { + e.errs = append(e.errs, err) + } +} + +func (e *errCatcher) AddNode(parentGraph string, name string, attrs map[string]string) { + if err := e.Interface.AddNode(parentGraph, name, attrs); err != nil { + e.errs = append(e.errs, err) + } +} + +func (e *errCatcher) getError() error { + if len(e.errs) == 0 { + return nil + } + ss := make([]string, len(e.errs)) + for i, err := range e.errs { + ss[i] = err.Error() + } + return fmt.Errorf("errors: [%s]", strings.Join(ss, ",")) +} diff --git a/vendor/github.com/awalterschulze/gographviz/edges.go b/vendor/github.com/awalterschulze/gographviz/edges.go new file mode 100644 index 00000000000..bde9269ccab --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/edges.go @@ -0,0 +1,119 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "sort" +) + +// Edge represents an Edge. +type Edge struct { + Src string + SrcPort string + Dst string + DstPort string + Dir bool + Attrs Attrs +} + +// Edges represents a set of Edges. +type Edges struct { + SrcToDsts map[string]map[string][]*Edge + DstToSrcs map[string]map[string][]*Edge + Edges []*Edge +} + +// NewEdges creates a blank set of Edges. +func NewEdges() *Edges { + return &Edges{make(map[string]map[string][]*Edge), make(map[string]map[string][]*Edge), make([]*Edge, 0)} +} + +// Add adds an Edge to the set of Edges. +func (edges *Edges) Add(edge *Edge) { + if _, ok := edges.SrcToDsts[edge.Src]; !ok { + edges.SrcToDsts[edge.Src] = make(map[string][]*Edge) + } + if _, ok := edges.SrcToDsts[edge.Src][edge.Dst]; !ok { + edges.SrcToDsts[edge.Src][edge.Dst] = make([]*Edge, 0) + } + edges.SrcToDsts[edge.Src][edge.Dst] = append(edges.SrcToDsts[edge.Src][edge.Dst], edge) + + if _, ok := edges.DstToSrcs[edge.Dst]; !ok { + edges.DstToSrcs[edge.Dst] = make(map[string][]*Edge) + } + if _, ok := edges.DstToSrcs[edge.Dst][edge.Src]; !ok { + edges.DstToSrcs[edge.Dst][edge.Src] = make([]*Edge, 0) + } + edges.DstToSrcs[edge.Dst][edge.Src] = append(edges.DstToSrcs[edge.Dst][edge.Src], edge) + + edges.Edges = append(edges.Edges, edge) +} + +// Sorted returns a sorted list of Edges. +func (edges Edges) Sorted() []*Edge { + es := make(edgeSorter, len(edges.Edges)) + copy(es, edges.Edges) + sort.Sort(es) + return es +} + +type edgeSorter []*Edge + +func (es edgeSorter) Len() int { return len(es) } +func (es edgeSorter) Swap(i, j int) { es[i], es[j] = es[j], es[i] } +func (es edgeSorter) Less(i, j int) bool { + if es[i].Src < es[j].Src { + return true + } else if es[i].Src > es[j].Src { + return false + } + + if es[i].Dst < es[j].Dst { + return true + } else if es[i].Dst > es[j].Dst { + return false + } + + if es[i].SrcPort < es[j].SrcPort { + return true + } else if es[i].SrcPort > es[j].SrcPort { + return false + } + + if es[i].DstPort < es[j].DstPort { + return true + } else if es[i].DstPort > es[j].DstPort { + return false + } + + if es[i].Dir != es[j].Dir { + return es[i].Dir + } + + attrs := es[i].Attrs.Copy() + for k, v := range es[j].Attrs { + attrs[k] = v + } + + for _, k := range attrs.sortedNames() { + if es[i].Attrs[k] < es[j].Attrs[k] { + return true + } else if es[i].Attrs[k] > es[j].Attrs[k] { + return false + } + } + + return false +} diff --git a/vendor/github.com/awalterschulze/gographviz/escape.go b/vendor/github.com/awalterschulze/gographviz/escape.go new file mode 100644 index 00000000000..13d8bebc197 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/escape.go @@ -0,0 +1,192 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "fmt" + "strings" + "text/template" + "unicode" +) + +// Escape is just a Graph that escapes some strings when required. +type Escape struct { + *Graph +} + +// NewEscape returns a graph which will try to escape some strings when required +func NewEscape() *Escape { + return &Escape{NewGraph()} +} + +func isHTML(s string) bool { + if len(s) == 0 { + return false + } + ss := strings.TrimSpace(s) + if ss[0] != '<' { + return false + } + count := 0 + for _, c := range ss { + if c == '<' { + count++ + } + if c == '>' { + count-- + } + } + if count == 0 { + return true + } + return false +} + +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || + ch >= 0x80 && unicode.IsLetter(ch) && ch != 'ε' +} + +func isID(s string) bool { + i := 0 + pos := false + for _, c := range s { + if i == 0 { + if !isLetter(c) { + return false + } + pos = true + } + if unicode.IsSpace(c) { + return false + } + if c == '-' { + return false + } + i++ + } + return pos +} + +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +func isNumber(s string) bool { + state := 0 + for _, c := range s { + if state == 0 { + if isDigit(c) || c == '.' { + state = 2 + } else if c == '-' { + state = 1 + } else { + return false + } + } else if state == 1 { + if isDigit(c) || c == '.' { + state = 2 + } + } else if c != '.' && !isDigit(c) { + return false + } + } + return (state == 2) +} + +func isStringLit(s string) bool { + if !strings.HasPrefix(s, `"`) || !strings.HasSuffix(s, `"`) { + return false + } + var prev rune + for _, r := range s[1 : len(s)-1] { + if r == '"' && prev != '\\' { + return false + } + prev = r + } + return true +} + +func esc(s string) string { + if len(s) == 0 { + return s + } + if isHTML(s) { + return s + } + ss := strings.TrimSpace(s) + if ss[0] == '<' { + return fmt.Sprintf("\"%s\"", strings.Replace(s, "\"", "\\\"", -1)) + } + if isID(s) { + return s + } + if isNumber(s) { + return s + } + if isStringLit(s) { + return s + } + return fmt.Sprintf("\"%s\"", template.HTMLEscapeString(s)) +} + +func escAttrs(attrs map[string]string) map[string]string { + newAttrs := make(map[string]string) + for k, v := range attrs { + newAttrs[esc(k)] = esc(v) + } + return newAttrs +} + +// SetName sets the graph name and escapes it, if needed. +func (escape *Escape) SetName(name string) error { + return escape.Graph.SetName(esc(name)) +} + +// AddPortEdge adds an edge with ports and escapes the src, dst and attrs, if needed. +func (escape *Escape) AddPortEdge(src, srcPort, dst, dstPort string, directed bool, attrs map[string]string) error { + return escape.Graph.AddPortEdge(esc(src), srcPort, esc(dst), dstPort, directed, escAttrs(attrs)) +} + +// AddEdge adds an edge and escapes the src, dst and attrs, if needed. +func (escape *Escape) AddEdge(src, dst string, directed bool, attrs map[string]string) error { + return escape.AddPortEdge(src, "", dst, "", directed, attrs) +} + +// AddNode adds a node and escapes the parentGraph, name and attrs, if needed. +func (escape *Escape) AddNode(parentGraph string, name string, attrs map[string]string) error { + return escape.Graph.AddNode(esc(parentGraph), esc(name), escAttrs(attrs)) +} + +// AddAttr adds an attribute and escapes the parentGraph, field and value, if needed. +func (escape *Escape) AddAttr(parentGraph string, field, value string) error { + return escape.Graph.AddAttr(esc(parentGraph), esc(field), esc(value)) +} + +// AddSubGraph adds a subgraph and escapes the parentGraph, name and attrs, if needed. +func (escape *Escape) AddSubGraph(parentGraph string, name string, attrs map[string]string) error { + return escape.Graph.AddSubGraph(esc(parentGraph), esc(name), escAttrs(attrs)) +} + +// IsNode returns whether the, escaped if needed, name is a node in the graph. +func (escape *Escape) IsNode(name string) bool { + return escape.Graph.IsNode(esc(name)) +} + +// IsSubGraph returns whether the, escaped if needed, name is a subgraph in the grahp. +func (escape *Escape) IsSubGraph(name string) bool { + return escape.Graph.IsSubGraph(esc(name)) +} diff --git a/vendor/github.com/awalterschulze/gographviz/gographviz.go b/vendor/github.com/awalterschulze/gographviz/gographviz.go new file mode 100644 index 00000000000..277228eb51e --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/gographviz.go @@ -0,0 +1,58 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +//Package gographviz provides parsing for the DOT grammar into +//an abstract syntax tree representing a graph, +//analysis of the abstract syntax tree into a more usable structure, +//and writing back of this structure into the DOT format. +package gographviz + +import ( + "github.com/awalterschulze/gographviz/ast" + "github.com/awalterschulze/gographviz/internal/parser" +) + +var _ Interface = NewGraph() + +//Interface allows you to parse the graph into your own structure. +type Interface interface { + SetStrict(strict bool) error + SetDir(directed bool) error + SetName(name string) error + AddPortEdge(src, srcPort, dst, dstPort string, directed bool, attrs map[string]string) error + AddEdge(src, dst string, directed bool, attrs map[string]string) error + AddNode(parentGraph string, name string, attrs map[string]string) error + AddAttr(parentGraph string, field, value string) error + AddSubGraph(parentGraph string, name string, attrs map[string]string) error + String() string +} + +//Parse parses the buffer into a abstract syntax tree representing the graph. +func Parse(buf []byte) (*ast.Graph, error) { + return parser.ParseBytes(buf) +} + +//ParseString parses the buffer into a abstract syntax tree representing the graph. +func ParseString(buf string) (*ast.Graph, error) { + return parser.ParseBytes([]byte(buf)) +} + +//Read parses and creates a new Graph from the data. +func Read(buf []byte) (*Graph, error) { + st, err := Parse(buf) + if err != nil { + return nil, err + } + return NewAnalysedGraph(st) +} diff --git a/vendor/github.com/awalterschulze/gographviz/graph.go b/vendor/github.com/awalterschulze/gographviz/graph.go new file mode 100644 index 00000000000..e2bef45b368 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/graph.go @@ -0,0 +1,148 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "fmt" + "strings" +) + +// Graph is the analysed representation of the Graph parsed from the DOT format. +type Graph struct { + Attrs Attrs + Name string + Directed bool + Strict bool + Nodes *Nodes + Edges *Edges + SubGraphs *SubGraphs + Relations *Relations +} + +// NewGraph creates a new empty graph, ready to be populated. +func NewGraph() *Graph { + return &Graph{ + Attrs: make(Attrs), + Name: "", + Directed: false, + Strict: false, + Nodes: NewNodes(), + Edges: NewEdges(), + SubGraphs: NewSubGraphs(), + Relations: NewRelations(), + } +} + +// SetStrict sets whether a graph is strict. +// If the graph is strict then multiple edges are not allowed between the same pairs of nodes, +// see dot man page. +func (g *Graph) SetStrict(strict bool) error { + g.Strict = strict + return nil +} + +// SetDir sets whether the graph is directed (true) or undirected (false). +func (g *Graph) SetDir(dir bool) error { + g.Directed = dir + return nil +} + +// SetName sets the graph name. +func (g *Graph) SetName(name string) error { + g.Name = name + return nil +} + +// AddPortEdge adds an edge to the graph from node src to node dst. +// srcPort and dstPort are the port the node ports, leave as empty strings if it is not required. +// This does not imply the adding of missing nodes. +func (g *Graph) AddPortEdge(src, srcPort, dst, dstPort string, directed bool, attrs map[string]string) error { + as, err := NewAttrs(attrs) + if err != nil { + return err + } + g.Edges.Add(&Edge{src, srcPort, dst, dstPort, directed, as}) + return nil +} + +// AddEdge adds an edge to the graph from node src to node dst. +// This does not imply the adding of missing nodes. +// If directed is set to true then SetDir(true) must also be called or there will be a syntax error in the output. +func (g *Graph) AddEdge(src, dst string, directed bool, attrs map[string]string) error { + return g.AddPortEdge(src, "", dst, "", directed, attrs) +} + +// AddNode adds a node to a graph/subgraph. +// If not subgraph exists use the name of the main graph. +// This does not imply the adding of a missing subgraph. +func (g *Graph) AddNode(parentGraph string, name string, attrs map[string]string) error { + as, err := NewAttrs(attrs) + if err != nil { + return err + } + g.Nodes.Add(&Node{name, as}) + g.Relations.Add(parentGraph, name) + return nil +} + +func (g *Graph) getAttrs(graphName string) (Attrs, error) { + if g.Name == graphName { + return g.Attrs, nil + } + sub, ok := g.SubGraphs.SubGraphs[graphName] + if !ok { + return nil, fmt.Errorf("graph or subgraph %s does not exist", graphName) + } + return sub.Attrs, nil +} + +// AddAttr adds an attribute to a graph/subgraph. +func (g *Graph) AddAttr(parentGraph string, field string, value string) error { + a, err := g.getAttrs(parentGraph) + if err != nil { + return err + } + return a.Add(field, value) +} + +// AddSubGraph adds a subgraph to a graph/subgraph. +func (g *Graph) AddSubGraph(parentGraph string, name string, attrs map[string]string) error { + g.Relations.Add(parentGraph, name) + g.SubGraphs.Add(name) + for key, value := range attrs { + if err := g.AddAttr(name, key, value); err != nil { + return err + } + } + return nil +} + +// IsNode returns whether a given node name exists as a node in the graph. +func (g *Graph) IsNode(name string) bool { + _, ok := g.Nodes.Lookup[name] + return ok +} + +// IsSubGraph returns whether a given subgraph name exists as a subgraph in the graph. +func (g *Graph) IsSubGraph(name string) bool { + _, ok := g.SubGraphs.SubGraphs[name] + return ok +} + +func (g *Graph) isClusterSubGraph(name string) bool { + isSubGraph := g.IsSubGraph(name) + isCluster := strings.HasPrefix(name, "cluster") + return isSubGraph && isCluster +} diff --git a/vendor/github.com/awalterschulze/gographviz/internal/errors/errors.go b/vendor/github.com/awalterschulze/gographviz/internal/errors/errors.go new file mode 100644 index 00000000000..4490dff08f8 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/errors/errors.go @@ -0,0 +1,56 @@ +// Code generated by gocc; DO NOT EDIT. + +package errors + +import ( + "bytes" + "fmt" + + "github.com/awalterschulze/gographviz/internal/token" +) + +type ErrorSymbol interface { +} + +type Error struct { + Err error + ErrorToken *token.Token + ErrorSymbols []ErrorSymbol + ExpectedTokens []string + StackTop int +} + +func (E *Error) String() string { + w := new(bytes.Buffer) + fmt.Fprintf(w, "Error") + if E.Err != nil { + fmt.Fprintf(w, " %s\n", E.Err) + } else { + fmt.Fprintf(w, "\n") + } + fmt.Fprintf(w, "Token: type=%d, lit=%s\n", E.ErrorToken.Type, E.ErrorToken.Lit) + fmt.Fprintf(w, "Pos: offset=%d, line=%d, column=%d\n", E.ErrorToken.Pos.Offset, E.ErrorToken.Pos.Line, E.ErrorToken.Pos.Column) + fmt.Fprintf(w, "Expected one of: ") + for _, sym := range E.ExpectedTokens { + fmt.Fprintf(w, "%s ", sym) + } + fmt.Fprintf(w, "ErrorSymbol:\n") + for _, sym := range E.ErrorSymbols { + fmt.Fprintf(w, "%v\n", sym) + } + return w.String() +} + +func (e *Error) Error() string { + w := new(bytes.Buffer) + fmt.Fprintf(w, "Error in S%d: %s, %s", e.StackTop, token.TokMap.TokenString(e.ErrorToken), e.ErrorToken.Pos.String()) + if e.Err != nil { + fmt.Fprintf(w, e.Err.Error()) + } else { + fmt.Fprintf(w, ", expected one of: ") + for _, expected := range e.ExpectedTokens { + fmt.Fprintf(w, "%s ", expected) + } + } + return w.String() +} diff --git a/vendor/github.com/awalterschulze/gographviz/internal/lexer/acttab.go b/vendor/github.com/awalterschulze/gographviz/internal/lexer/acttab.go new file mode 100644 index 00000000000..43f05ee3868 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/lexer/acttab.go @@ -0,0 +1,587 @@ +// Code generated by gocc; DO NOT EDIT. + +package lexer + +import ( + "fmt" + + "github.com/awalterschulze/gographviz/internal/token" +) + +type ActionTable [NumStates]ActionRow + +type ActionRow struct { + Accept token.Type + Ignore string +} + +func (this ActionRow) String() string { + return fmt.Sprintf("Accept=%d, Ignore=%s", this.Accept, this.Ignore) +} + +var ActTab = ActionTable{ + ActionRow{ // S0 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S1 + Accept: -1, + Ignore: "!whitespace", + }, + ActionRow{ // S2 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S3 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S4 + Accept: 13, + Ignore: "", + }, + ActionRow{ // S5 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S6 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S7 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S8 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S9 + Accept: 14, + Ignore: "", + }, + ActionRow{ // S10 + Accept: 7, + Ignore: "", + }, + ActionRow{ // S11 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S12 + Accept: 8, + Ignore: "", + }, + ActionRow{ // S13 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S14 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S15 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S16 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S17 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S18 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S19 + Accept: 11, + Ignore: "", + }, + ActionRow{ // S20 + Accept: 12, + Ignore: "", + }, + ActionRow{ // S21 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S22 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S23 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S24 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S25 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S26 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S27 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S28 + Accept: 4, + Ignore: "", + }, + ActionRow{ // S29 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S30 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S31 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S32 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S33 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S34 + Accept: -1, + Ignore: "!comment", + }, + ActionRow{ // S35 + Accept: 17, + Ignore: "", + }, + ActionRow{ // S36 + Accept: 16, + Ignore: "", + }, + ActionRow{ // S37 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S38 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S39 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S40 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S41 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S42 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S43 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S44 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S45 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S46 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S47 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S48 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S49 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S50 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S51 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S52 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S53 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S54 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S55 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S56 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S57 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S58 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S59 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S60 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S61 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S62 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S63 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S64 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S65 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S66 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S67 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S68 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S69 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S70 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S71 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S72 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S73 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S74 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S75 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S76 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S77 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S78 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S79 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S80 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S81 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S82 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S83 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S84 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S85 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S86 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S87 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S88 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S89 + Accept: -1, + Ignore: "!comment", + }, + ActionRow{ // S90 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S91 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S92 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S93 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S94 + Accept: 10, + Ignore: "", + }, + ActionRow{ // S95 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S96 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S97 + Accept: 9, + Ignore: "", + }, + ActionRow{ // S98 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S99 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S100 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S101 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S102 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S103 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S104 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S105 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S106 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S107 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S108 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S109 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S110 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S111 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S112 + Accept: 2, + Ignore: "", + }, + ActionRow{ // S113 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S114 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S115 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S116 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S117 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S118 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S119 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S120 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S121 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S122 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S123 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S124 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S125 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S126 + Accept: 5, + Ignore: "", + }, + ActionRow{ // S127 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S128 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S129 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S130 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S131 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S132 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S133 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S134 + Accept: 6, + Ignore: "", + }, + ActionRow{ // S135 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S136 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S137 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S138 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S139 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S140 + Accept: 15, + Ignore: "", + }, +} diff --git a/vendor/github.com/awalterschulze/gographviz/internal/lexer/lexer.go b/vendor/github.com/awalterschulze/gographviz/internal/lexer/lexer.go new file mode 100644 index 00000000000..e1832a45da6 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/lexer/lexer.go @@ -0,0 +1,328 @@ +// Code generated by gocc; DO NOT EDIT. + +package lexer + +import ( + // "fmt" + "io/ioutil" + "unicode/utf8" + + // "github.com/awalterschulze/gographviz/internal/util" + "github.com/awalterschulze/gographviz/internal/token" +) + +const ( + NoState = -1 + NumStates = 141 + NumSymbols = 184 +) + +type Lexer struct { + src []byte + pos int + line int + column int +} + +func NewLexer(src []byte) *Lexer { + lexer := &Lexer{ + src: src, + pos: 0, + line: 1, + column: 1, + } + return lexer +} + +func NewLexerFile(fpath string) (*Lexer, error) { + src, err := ioutil.ReadFile(fpath) + if err != nil { + return nil, err + } + return NewLexer(src), nil +} + +func (this *Lexer) Scan() (tok *token.Token) { + + // fmt.Printf("Lexer.Scan() pos=%d\n", this.pos) + + tok = new(token.Token) + if this.pos >= len(this.src) { + tok.Type = token.EOF + tok.Pos.Offset, tok.Pos.Line, tok.Pos.Column = this.pos, this.line, this.column + return + } + start, startLine, startColumn, end := this.pos, this.line, this.column, 0 + tok.Type = token.INVALID + state, rune1, size := 0, rune(-1), 0 + for state != -1 { + + // fmt.Printf("\tpos=%d, line=%d, col=%d, state=%d\n", this.pos, this.line, this.column, state) + + if this.pos >= len(this.src) { + rune1 = -1 + } else { + rune1, size = utf8.DecodeRune(this.src[this.pos:]) + this.pos += size + } + + // Production start + if rune1 != -1 { + state = TransTab[state](rune1) + } else { + state = -1 + } + // Production end + + // Debug start + // nextState := -1 + // if rune1 != -1 { + // nextState = TransTab[state](rune1) + // } + // fmt.Printf("\tS%d, : tok=%s, rune == %s(%x), next state == %d\n", state, token.TokMap.Id(tok.Type), util.RuneToString(rune1), rune1, nextState) + // fmt.Printf("\t\tpos=%d, size=%d, start=%d, end=%d\n", this.pos, size, start, end) + // if nextState != -1 { + // fmt.Printf("\t\taction:%s\n", ActTab[nextState].String()) + // } + // state = nextState + // Debug end + + if state != -1 { + + switch rune1 { + case '\n': + this.line++ + this.column = 1 + case '\r': + this.column = 1 + case '\t': + this.column += 4 + default: + this.column++ + } + + switch { + case ActTab[state].Accept != -1: + tok.Type = ActTab[state].Accept + // fmt.Printf("\t Accept(%s), %s(%d)\n", string(act), token.TokMap.Id(tok), tok) + end = this.pos + case ActTab[state].Ignore != "": + // fmt.Printf("\t Ignore(%s)\n", string(act)) + start, startLine, startColumn = this.pos, this.line, this.column + state = 0 + if start >= len(this.src) { + tok.Type = token.EOF + } + + } + } else { + if tok.Type == token.INVALID { + end = this.pos + } + } + } + if end > start { + this.pos = end + tok.Lit = this.src[start:end] + } else { + tok.Lit = []byte{} + } + tok.Pos.Offset, tok.Pos.Line, tok.Pos.Column = start, startLine, startColumn + + // fmt.Printf("Token at %s: %s \"%s\"\n", tok.String(), token.TokMap.Id(tok.Type), tok.Lit) + + return +} + +func (this *Lexer) Reset() { + this.pos = 0 +} + +/* +Lexer symbols: +0: 'n' +1: 'o' +2: 'd' +3: 'e' +4: 'N' +5: 'o' +6: 'd' +7: 'e' +8: 'N' +9: 'O' +10: 'D' +11: 'E' +12: 'e' +13: 'd' +14: 'g' +15: 'e' +16: 'E' +17: 'd' +18: 'g' +19: 'e' +20: 'E' +21: 'D' +22: 'G' +23: 'E' +24: 'g' +25: 'r' +26: 'a' +27: 'p' +28: 'h' +29: 'G' +30: 'r' +31: 'a' +32: 'p' +33: 'h' +34: 'G' +35: 'R' +36: 'A' +37: 'P' +38: 'H' +39: 'd' +40: 'i' +41: 'g' +42: 'r' +43: 'a' +44: 'p' +45: 'h' +46: 'D' +47: 'i' +48: 'g' +49: 'r' +50: 'a' +51: 'p' +52: 'h' +53: 'd' +54: 'i' +55: 'G' +56: 'r' +57: 'a' +58: 'p' +59: 'h' +60: 'D' +61: 'i' +62: 'G' +63: 'r' +64: 'a' +65: 'p' +66: 'h' +67: 'D' +68: 'I' +69: 'G' +70: 'R' +71: 'A' +72: 'P' +73: 'H' +74: 's' +75: 'u' +76: 'b' +77: 'g' +78: 'r' +79: 'a' +80: 'p' +81: 'h' +82: 'S' +83: 'u' +84: 'b' +85: 'g' +86: 'r' +87: 'a' +88: 'p' +89: 'h' +90: 's' +91: 'u' +92: 'b' +93: 'G' +94: 'r' +95: 'a' +96: 'p' +97: 'h' +98: 'S' +99: 'u' +100: 'b' +101: 'G' +102: 'r' +103: 'a' +104: 'p' +105: 'h' +106: 'S' +107: 'U' +108: 'B' +109: 'G' +110: 'R' +111: 'A' +112: 'P' +113: 'H' +114: 's' +115: 't' +116: 'r' +117: 'i' +118: 'c' +119: 't' +120: 'S' +121: 't' +122: 'r' +123: 'i' +124: 'c' +125: 't' +126: 'S' +127: 'T' +128: 'R' +129: 'I' +130: 'C' +131: 'T' +132: '{' +133: '}' +134: ';' +135: '=' +136: '[' +137: ']' +138: ',' +139: ':' +140: '-' +141: '>' +142: '-' +143: '-' +144: '_' +145: '-' +146: '.' +147: '-' +148: '.' +149: '\' +150: '"' +151: '\' +152: '"' +153: '"' +154: '=' +155: '<' +156: '>' +157: '<' +158: '>' +159: '/' +160: '/' +161: '\n' +162: '#' +163: '\n' +164: '/' +165: '*' +166: '*' +167: '*' +168: '/' +169: ' ' +170: '\t' +171: '\r' +172: '\n' +173: \u0001-'!' +174: '#'-'[' +175: ']'-\u007f +176: 'a'-'z' +177: 'A'-'Z' +178: '0'-'9' +179: \u0080-\ufffc +180: \ufffe-\U0010ffff +181: \u0001-';' +182: '?'-\u00ff +183: . + +*/ diff --git a/vendor/github.com/awalterschulze/gographviz/internal/lexer/transitiontable.go b/vendor/github.com/awalterschulze/gographviz/internal/lexer/transitiontable.go new file mode 100644 index 00000000000..ec29c5d145d --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/lexer/transitiontable.go @@ -0,0 +1,3017 @@ +// Code generated by gocc; DO NOT EDIT. + +package lexer + +/* +Let s be the current state +Let r be the current input rune +transitionTable[s](r) returns the next state. +*/ +type TransitionTable [NumStates]func(rune) int + +var TransTab = TransitionTable{ + + // S0 + func(r rune) int { + switch { + case r == 9: // ['\t','\t'] + return 1 + case r == 10: // ['\n','\n'] + return 1 + case r == 13: // ['\r','\r'] + return 1 + case r == 32: // [' ',' '] + return 1 + case r == 34: // ['"','"'] + return 2 + case r == 35: // ['#','#'] + return 3 + case r == 44: // [',',','] + return 4 + case r == 45: // ['-','-'] + return 5 + case r == 46: // ['.','.'] + return 6 + case r == 47: // ['/','/'] + return 7 + case 48 <= r && r <= 57: // ['0','9'] + return 8 + case r == 58: // [':',':'] + return 9 + case r == 59: // [';',';'] + return 10 + case r == 60: // ['<','<'] + return 11 + case r == 61: // ['=','='] + return 12 + case 65 <= r && r <= 67: // ['A','C'] + return 13 + case r == 68: // ['D','D'] + return 14 + case r == 69: // ['E','E'] + return 15 + case r == 70: // ['F','F'] + return 13 + case r == 71: // ['G','G'] + return 16 + case 72 <= r && r <= 77: // ['H','M'] + return 13 + case r == 78: // ['N','N'] + return 17 + case 79 <= r && r <= 82: // ['O','R'] + return 13 + case r == 83: // ['S','S'] + return 18 + case 84 <= r && r <= 90: // ['T','Z'] + return 13 + case r == 91: // ['[','['] + return 19 + case r == 93: // [']',']'] + return 20 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 99: // ['a','c'] + return 13 + case r == 100: // ['d','d'] + return 22 + case r == 101: // ['e','e'] + return 23 + case r == 102: // ['f','f'] + return 13 + case r == 103: // ['g','g'] + return 24 + case 104 <= r && r <= 109: // ['h','m'] + return 13 + case r == 110: // ['n','n'] + return 25 + case 111 <= r && r <= 114: // ['o','r'] + return 13 + case r == 115: // ['s','s'] + return 26 + case 116 <= r && r <= 122: // ['t','z'] + return 13 + case r == 123: // ['{','{'] + return 27 + case r == 125: // ['}','}'] + return 28 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S1 + func(r rune) int { + switch { + + } + return NoState + }, + + // S2 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S3 + func(r rune) int { + switch { + case r == 10: // ['\n','\n'] + return 34 + + default: + return 3 + } + + }, + + // S4 + func(r rune) int { + switch { + + } + return NoState + }, + + // S5 + func(r rune) int { + switch { + case r == 45: // ['-','-'] + return 35 + case r == 46: // ['.','.'] + return 6 + case 48 <= r && r <= 57: // ['0','9'] + return 8 + case r == 62: // ['>','>'] + return 36 + + } + return NoState + }, + + // S6 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 37 + + } + return NoState + }, + + // S7 + func(r rune) int { + switch { + case r == 42: // ['*','*'] + return 38 + case r == 47: // ['/','/'] + return 39 + + } + return NoState + }, + + // S8 + func(r rune) int { + switch { + case r == 46: // ['.','.'] + return 40 + case 48 <= r && r <= 57: // ['0','9'] + return 8 + + } + return NoState + }, + + // S9 + func(r rune) int { + switch { + + } + return NoState + }, + + // S10 + func(r rune) int { + switch { + + } + return NoState + }, + + // S11 + func(r rune) int { + switch { + case 1 <= r && r <= 59: // [\u0001,';'] + return 41 + case r == 60: // ['<','<'] + return 42 + case r == 61: // ['=','='] + return 41 + case r == 62: // ['>','>'] + return 43 + case 63 <= r && r <= 255: // ['?',\u00ff] + return 41 + + } + return NoState + }, + + // S12 + func(r rune) int { + switch { + + } + return NoState + }, + + // S13 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S14 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 72: // ['A','H'] + return 13 + case r == 73: // ['I','I'] + return 45 + case 74 <= r && r <= 90: // ['J','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 104: // ['a','h'] + return 13 + case r == 105: // ['i','i'] + return 46 + case 106 <= r && r <= 122: // ['j','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S15 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 67: // ['A','C'] + return 13 + case r == 68: // ['D','D'] + return 47 + case 69 <= r && r <= 90: // ['E','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 99: // ['a','c'] + return 13 + case r == 100: // ['d','d'] + return 48 + case 101 <= r && r <= 122: // ['e','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S16 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 81: // ['A','Q'] + return 13 + case r == 82: // ['R','R'] + return 49 + case 83 <= r && r <= 90: // ['S','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 50 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S17 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 78: // ['A','N'] + return 13 + case r == 79: // ['O','O'] + return 51 + case 80 <= r && r <= 90: // ['P','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 110: // ['a','n'] + return 13 + case r == 111: // ['o','o'] + return 52 + case 112 <= r && r <= 122: // ['p','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S18 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 83: // ['A','S'] + return 13 + case r == 84: // ['T','T'] + return 53 + case r == 85: // ['U','U'] + return 54 + case 86 <= r && r <= 90: // ['V','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 115: // ['a','s'] + return 13 + case r == 116: // ['t','t'] + return 55 + case r == 117: // ['u','u'] + return 56 + case 118 <= r && r <= 122: // ['v','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S19 + func(r rune) int { + switch { + + } + return NoState + }, + + // S20 + func(r rune) int { + switch { + + } + return NoState + }, + + // S21 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S22 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 104: // ['a','h'] + return 13 + case r == 105: // ['i','i'] + return 57 + case 106 <= r && r <= 122: // ['j','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S23 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 99: // ['a','c'] + return 13 + case r == 100: // ['d','d'] + return 58 + case 101 <= r && r <= 122: // ['e','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S24 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 59 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S25 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 110: // ['a','n'] + return 13 + case r == 111: // ['o','o'] + return 60 + case 112 <= r && r <= 122: // ['p','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S26 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 115: // ['a','s'] + return 13 + case r == 116: // ['t','t'] + return 61 + case r == 117: // ['u','u'] + return 62 + case 118 <= r && r <= 122: // ['v','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S27 + func(r rune) int { + switch { + + } + return NoState + }, + + // S28 + func(r rune) int { + switch { + + } + return NoState + }, + + // S29 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S30 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S31 + func(r rune) int { + switch { + + } + return NoState + }, + + // S32 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 63 + case r == 34: // ['"','"'] + return 64 + case 35 <= r && r <= 91: // ['#','['] + return 63 + case r == 92: // ['\','\'] + return 64 + case 93 <= r && r <= 127: // [']',\u007f] + return 63 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 65 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 65 + + } + return NoState + }, + + // S33 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S34 + func(r rune) int { + switch { + + } + return NoState + }, + + // S35 + func(r rune) int { + switch { + + } + return NoState + }, + + // S36 + func(r rune) int { + switch { + + } + return NoState + }, + + // S37 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 37 + + } + return NoState + }, + + // S38 + func(r rune) int { + switch { + case r == 42: // ['*','*'] + return 66 + + default: + return 38 + } + + }, + + // S39 + func(r rune) int { + switch { + case r == 10: // ['\n','\n'] + return 34 + + default: + return 39 + } + + }, + + // S40 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 67 + + } + return NoState + }, + + // S41 + func(r rune) int { + switch { + case 1 <= r && r <= 59: // [\u0001,';'] + return 41 + case r == 60: // ['<','<'] + return 42 + case r == 61: // ['=','='] + return 41 + case r == 62: // ['>','>'] + return 43 + case 63 <= r && r <= 255: // ['?',\u00ff] + return 41 + + } + return NoState + }, + + // S42 + func(r rune) int { + switch { + case 1 <= r && r <= 59: // [\u0001,';'] + return 68 + case r == 61: // ['=','='] + return 68 + case 63 <= r && r <= 255: // ['?',\u00ff] + return 68 + + } + return NoState + }, + + // S43 + func(r rune) int { + switch { + + } + return NoState + }, + + // S44 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S45 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 69 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S46 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 70 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 71 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S47 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 72 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S48 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 73 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S49 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case r == 65: // ['A','A'] + return 74 + case 66 <= r && r <= 90: // ['B','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S50 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 75 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S51 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 67: // ['A','C'] + return 13 + case r == 68: // ['D','D'] + return 76 + case 69 <= r && r <= 90: // ['E','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S52 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 99: // ['a','c'] + return 13 + case r == 100: // ['d','d'] + return 77 + case 101 <= r && r <= 122: // ['e','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S53 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 81: // ['A','Q'] + return 13 + case r == 82: // ['R','R'] + return 78 + case 83 <= r && r <= 90: // ['S','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S54 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case r == 65: // ['A','A'] + return 13 + case r == 66: // ['B','B'] + return 79 + case 67 <= r && r <= 90: // ['C','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S55 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 80 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S56 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 13 + case r == 98: // ['b','b'] + return 81 + case 99 <= r && r <= 122: // ['c','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S57 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 82 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 83 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S58 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 84 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S59 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 85 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S60 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 99: // ['a','c'] + return 13 + case r == 100: // ['d','d'] + return 86 + case 101 <= r && r <= 122: // ['e','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S61 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 87 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S62 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 13 + case r == 98: // ['b','b'] + return 88 + case 99 <= r && r <= 122: // ['c','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S63 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S64 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S65 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S66 + func(r rune) int { + switch { + case r == 42: // ['*','*'] + return 66 + case r == 47: // ['/','/'] + return 89 + + default: + return 38 + } + + }, + + // S67 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 67 + + } + return NoState + }, + + // S68 + func(r rune) int { + switch { + case 1 <= r && r <= 59: // [\u0001,';'] + return 68 + case r == 61: // ['=','='] + return 68 + case r == 62: // ['>','>'] + return 90 + case 63 <= r && r <= 255: // ['?',\u00ff] + return 68 + + } + return NoState + }, + + // S69 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 81: // ['A','Q'] + return 13 + case r == 82: // ['R','R'] + return 91 + case 83 <= r && r <= 90: // ['S','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S70 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 92 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S71 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 93 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S72 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 68: // ['A','D'] + return 13 + case r == 69: // ['E','E'] + return 94 + case 70 <= r && r <= 90: // ['F','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S73 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 100: // ['a','d'] + return 13 + case r == 101: // ['e','e'] + return 94 + case 102 <= r && r <= 122: // ['f','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S74 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 79: // ['A','O'] + return 13 + case r == 80: // ['P','P'] + return 95 + case 81 <= r && r <= 90: // ['Q','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S75 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 96 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S76 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 68: // ['A','D'] + return 13 + case r == 69: // ['E','E'] + return 97 + case 70 <= r && r <= 90: // ['F','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S77 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 100: // ['a','d'] + return 13 + case r == 101: // ['e','e'] + return 97 + case 102 <= r && r <= 122: // ['f','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S78 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 72: // ['A','H'] + return 13 + case r == 73: // ['I','I'] + return 98 + case 74 <= r && r <= 90: // ['J','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S79 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 99 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S80 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 104: // ['a','h'] + return 13 + case r == 105: // ['i','i'] + return 100 + case 106 <= r && r <= 122: // ['j','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S81 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 101 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 102 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S82 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 103 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S83 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 104 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S84 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 100: // ['a','d'] + return 13 + case r == 101: // ['e','e'] + return 94 + case 102 <= r && r <= 122: // ['f','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S85 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 105 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S86 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 100: // ['a','d'] + return 13 + case r == 101: // ['e','e'] + return 97 + case 102 <= r && r <= 122: // ['f','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S87 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 104: // ['a','h'] + return 13 + case r == 105: // ['i','i'] + return 106 + case 106 <= r && r <= 122: // ['j','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S88 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 107 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 108 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S89 + func(r rune) int { + switch { + + } + return NoState + }, + + // S90 + func(r rune) int { + switch { + case 1 <= r && r <= 59: // [\u0001,';'] + return 41 + case r == 60: // ['<','<'] + return 42 + case r == 61: // ['=','='] + return 41 + case r == 62: // ['>','>'] + return 43 + case 63 <= r && r <= 255: // ['?',\u00ff] + return 41 + + } + return NoState + }, + + // S91 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case r == 65: // ['A','A'] + return 109 + case 66 <= r && r <= 90: // ['B','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S92 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 110 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S93 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 111 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S94 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S95 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 71: // ['A','G'] + return 13 + case r == 72: // ['H','H'] + return 112 + case 73 <= r && r <= 90: // ['I','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S96 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 112 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S97 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S98 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 66: // ['A','B'] + return 13 + case r == 67: // ['C','C'] + return 113 + case 68 <= r && r <= 90: // ['D','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S99 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 81: // ['A','Q'] + return 13 + case r == 82: // ['R','R'] + return 114 + case 83 <= r && r <= 90: // ['S','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S100 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 98: // ['a','b'] + return 13 + case r == 99: // ['c','c'] + return 115 + case 100 <= r && r <= 122: // ['d','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S101 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 116 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S102 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 117 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S103 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 118 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S104 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 119 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S105 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 112 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S106 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 98: // ['a','b'] + return 13 + case r == 99: // ['c','c'] + return 120 + case 100 <= r && r <= 122: // ['d','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S107 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 121 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S108 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 122 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S109 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 79: // ['A','O'] + return 13 + case r == 80: // ['P','P'] + return 123 + case 81 <= r && r <= 90: // ['Q','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S110 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 124 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S111 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 125 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S112 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S113 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 83: // ['A','S'] + return 13 + case r == 84: // ['T','T'] + return 126 + case 85 <= r && r <= 90: // ['U','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S114 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case r == 65: // ['A','A'] + return 127 + case 66 <= r && r <= 90: // ['B','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S115 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 115: // ['a','s'] + return 13 + case r == 116: // ['t','t'] + return 126 + case 117 <= r && r <= 122: // ['u','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S116 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 128 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S117 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 129 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S118 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 130 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S119 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 131 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S120 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 115: // ['a','s'] + return 13 + case r == 116: // ['t','t'] + return 126 + case 117 <= r && r <= 122: // ['u','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S121 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 132 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S122 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 133 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S123 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 71: // ['A','G'] + return 13 + case r == 72: // ['H','H'] + return 134 + case 73 <= r && r <= 90: // ['I','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S124 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 134 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S125 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 134 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S126 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S127 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 79: // ['A','O'] + return 13 + case r == 80: // ['P','P'] + return 135 + case 81 <= r && r <= 90: // ['Q','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S128 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 136 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S129 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 137 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S130 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 134 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S131 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 134 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S132 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 138 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S133 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 139 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S134 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S135 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 71: // ['A','G'] + return 13 + case r == 72: // ['H','H'] + return 140 + case 73 <= r && r <= 90: // ['I','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S136 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 140 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S137 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 140 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S138 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 140 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S139 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 140 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S140 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, +} diff --git a/vendor/github.com/awalterschulze/gographviz/internal/parser/action.go b/vendor/github.com/awalterschulze/gographviz/internal/parser/action.go new file mode 100644 index 00000000000..54bc55e9629 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/parser/action.go @@ -0,0 +1,51 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +import ( + "fmt" +) + +type action interface { + act() + String() string +} + +type ( + accept bool + shift int // value is next state index + reduce int // value is production index +) + +func (this accept) act() {} +func (this shift) act() {} +func (this reduce) act() {} + +func (this accept) Equal(that action) bool { + if _, ok := that.(accept); ok { + return true + } + return false +} + +func (this reduce) Equal(that action) bool { + that1, ok := that.(reduce) + if !ok { + return false + } + return this == that1 +} + +func (this shift) Equal(that action) bool { + that1, ok := that.(shift) + if !ok { + return false + } + return this == that1 +} + +func (this accept) String() string { return "accept(0)" } +func (this shift) String() string { return fmt.Sprintf("shift:%d", this) } +func (this reduce) String() string { + return fmt.Sprintf("reduce:%d(%s)", this, productionsTable[this].String) +} diff --git a/vendor/github.com/awalterschulze/gographviz/internal/parser/actiontable.go b/vendor/github.com/awalterschulze/gographviz/internal/parser/actiontable.go new file mode 100644 index 00000000000..2a8629f2f6d --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/parser/actiontable.go @@ -0,0 +1,152 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +import ( + "bytes" + "compress/gzip" + "encoding/gob" +) + +type ( + actionTable [numStates]actionRow + actionRow struct { + canRecover bool + actions [numSymbols]action + } +) + +var actionTab = actionTable{} + +func init() { + tab := []struct { + CanRecover bool + Actions []struct { + Index int + Action int + Amount int + } + }{} + data := []byte{ + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9c, 0x97, 0x4f, 0x88, 0x5b, 0x55, + 0x1b, 0xc6, 0xcf, 0x7b, 0xe7, 0x7e, 0xd3, 0xf9, 0x66, 0xa6, 0xa5, 0x0c, 0xf3, 0x85, 0x61, 0x18, + 0x86, 0x10, 0xc2, 0x10, 0x42, 0x08, 0x21, 0x0c, 0x21, 0xe4, 0x8b, 0x21, 0x8e, 0x65, 0xd0, 0x21, + 0x84, 0x10, 0x42, 0x08, 0x31, 0x86, 0x9a, 0xa6, 0x21, 0x0d, 0xf1, 0x36, 0x4c, 0xd3, 0xa1, 0xe0, + 0x1f, 0x6a, 0xad, 0xda, 0x95, 0xb8, 0x70, 0xe1, 0xca, 0xa5, 0x0b, 0x17, 0x22, 0xe2, 0x42, 0x5c, + 0x88, 0x0b, 0xe9, 0x42, 0x5c, 0xba, 0x10, 0x17, 0x22, 0x2e, 0x5c, 0x89, 0xb8, 0x10, 0x11, 0x17, + 0xbd, 0x72, 0xcf, 0x2f, 0x3d, 0x99, 0xd4, 0xc9, 0xe4, 0x26, 0x74, 0x71, 0x6e, 0x4e, 0xef, 0xf3, + 0x7b, 0x9e, 0x73, 0xce, 0x7b, 0xce, 0x3d, 0x73, 0xd1, 0x7d, 0xdb, 0x12, 0xcb, 0x7d, 0xa0, 0xc4, + 0xbd, 0xa7, 0x54, 0xc4, 0x7d, 0x7d, 0x49, 0x2c, 0xf7, 0x9e, 0x12, 0x4b, 0x56, 0x9f, 0x79, 0xd1, + 0x29, 0x5f, 0xbf, 0x76, 0xf3, 0xe4, 0xfa, 0xb1, 0x58, 0x4a, 0x2e, 0x3c, 0x7d, 0x6d, 0x78, 0xe3, + 0xa6, 0x73, 0x4b, 0xdc, 0xb7, 0x94, 0x52, 0x4f, 0xb9, 0x6f, 0x5a, 0x22, 0xf1, 0xe7, 0x5f, 0xb8, + 0x35, 0x3c, 0xbe, 0x7d, 0x6d, 0x18, 0x7c, 0x39, 0xf8, 0x9c, 0xd3, 0xbe, 0x7e, 0x27, 0x78, 0xc3, + 0x19, 0xfe, 0x3f, 0xc8, 0x9b, 0xa3, 0xe7, 0x97, 0x6e, 0xde, 0x76, 0x86, 0xde, 0x73, 0xf0, 0x55, + 0x4f, 0x2a, 0xee, 0x7d, 0xa5, 0x62, 0xee, 0x1b, 0x9e, 0xcd, 0x7d, 0x25, 0x4b, 0xf2, 0x1f, 0x2d, + 0x14, 0x5b, 0xc9, 0x32, 0x3a, 0x1e, 0xb5, 0x4c, 0x6c, 0xa5, 0xd4, 0xa3, 0xff, 0x3d, 0x74, 0x1f, + 0x28, 0xf7, 0xae, 0xb5, 0x24, 0xb6, 0xf7, 0x4f, 0xc9, 0xaa, 0xd8, 0xb2, 0xac, 0x64, 0x5d, 0x6c, + 0x59, 0x51, 0xca, 0x12, 0xb1, 0x94, 0xb2, 0x2c, 0x59, 0x16, 0x5b, 0x56, 0x95, 0x84, 0xc5, 0x96, + 0x4b, 0xba, 0xc3, 0x7b, 0xfd, 0x32, 0xef, 0x6d, 0x98, 0x37, 0x36, 0xc7, 0x6f, 0x5c, 0xd0, 0x6f, + 0x6c, 0x29, 0xdd, 0xbf, 0xad, 0x64, 0x45, 0x6c, 0xd9, 0x51, 0xb2, 0x21, 0xb6, 0xc4, 0x95, 0x6c, + 0x8a, 0x2d, 0x09, 0x25, 0xbb, 0x62, 0xcb, 0x3e, 0x9a, 0x94, 0x36, 0xf3, 0x5e, 0x4e, 0x8f, 0x9e, + 0x2c, 0x39, 0x31, 0xe0, 0xcc, 0x69, 0x6b, 0xaf, 0x23, 0x77, 0xbe, 0xd3, 0x81, 0x2f, 0xa7, 0x43, + 0xfd, 0x14, 0x10, 0x5b, 0x8e, 0x94, 0xb2, 0x96, 0x9f, 0xe0, 0xcc, 0x00, 0x58, 0xde, 0x3f, 0xa5, + 0xac, 0x8b, 0x62, 0x8b, 0x25, 0x57, 0x95, 0x4e, 0x7c, 0xd5, 0xb3, 0xd7, 0xcd, 0x25, 0x9a, 0xcb, + 0x62, 0x4b, 0xd1, 0x63, 0xe9, 0x5f, 0x9b, 0x34, 0x01, 0x9a, 0x1d, 0xb1, 0xa5, 0xec, 0x91, 0xf5, + 0xaf, 0x20, 0x4d, 0x88, 0x26, 0xac, 0x9b, 0xb3, 0x07, 0x57, 0x99, 0x91, 0xed, 0x82, 0x4e, 0x14, + 0x22, 0x51, 0x88, 0x44, 0x21, 0x32, 0x84, 0xc8, 0x10, 0xc2, 0x35, 0x84, 0x4f, 0x48, 0x29, 0x6b, + 0x45, 0x6b, 0xf6, 0xd0, 0xec, 0xa1, 0xd9, 0xf3, 0x46, 0x61, 0x4b, 0x0d, 0xe9, 0x1e, 0xd2, 0x3d, + 0xa4, 0x7b, 0x48, 0xf7, 0x8c, 0x34, 0x86, 0x34, 0x86, 0x34, 0xc6, 0x04, 0xc4, 0x90, 0xc6, 0x90, + 0xc6, 0x90, 0xc6, 0x90, 0xc6, 0x8c, 0x34, 0x8e, 0x34, 0x8e, 0x34, 0x8e, 0x34, 0x8e, 0x34, 0x8e, + 0x34, 0x8e, 0x34, 0x8e, 0x34, 0x6e, 0xa4, 0x09, 0xa4, 0x09, 0xa4, 0x09, 0xa4, 0x09, 0xa4, 0x09, + 0xa4, 0x09, 0xa4, 0x09, 0xa4, 0x09, 0xa5, 0xac, 0x55, 0x2d, 0x4d, 0x22, 0x4d, 0x22, 0x4d, 0x22, + 0x4d, 0x22, 0x4d, 0x22, 0x4d, 0x22, 0x4d, 0x7a, 0x8b, 0x63, 0x4b, 0xd3, 0x5b, 0x1c, 0xfb, 0xf1, + 0xe2, 0x24, 0x27, 0x6a, 0x67, 0xfc, 0xb4, 0xa6, 0xe1, 0x0d, 0xe0, 0x0d, 0xe0, 0x0d, 0xe0, 0x0d, + 0xe0, 0x0d, 0xe0, 0x0d, 0x35, 0xd2, 0x68, 0x8f, 0xc6, 0x59, 0x1e, 0x0d, 0x53, 0xee, 0xbd, 0x71, + 0xb9, 0x53, 0x6f, 0x27, 0x6a, 0xb4, 0x43, 0xb4, 0xc1, 0x09, 0x06, 0x27, 0x5e, 0xbd, 0xe9, 0x66, + 0x83, 0x66, 0x93, 0x26, 0x40, 0xb3, 0x43, 0xb3, 0x4b, 0x13, 0xa4, 0x09, 0xd1, 0x84, 0x47, 0xdb, + 0xed, 0xac, 0x7a, 0x73, 0x7c, 0xd4, 0xdb, 0x93, 0x9a, 0x63, 0x5f, 0x1b, 0x70, 0x9a, 0xe3, 0x1d, + 0x5f, 0xea, 0x57, 0xcc, 0x3e, 0xdc, 0x98, 0xc2, 0x79, 0x6d, 0x81, 0xe4, 0xee, 0xdd, 0x19, 0xa2, + 0xff, 0xea, 0x05, 0xd8, 0x67, 0x01, 0xf6, 0x59, 0x80, 0x7d, 0x16, 0x60, 0x9f, 0x99, 0xdf, 0x67, + 0xe6, 0xf7, 0x59, 0x61, 0xef, 0x28, 0xde, 0xe5, 0x67, 0x58, 0x37, 0xde, 0xa2, 0x6e, 0x79, 0xff, + 0xf1, 0x00, 0xa8, 0xfb, 0xce, 0xb4, 0x28, 0xef, 0xce, 0x9c, 0x07, 0xad, 0x7f, 0xcf, 0xd4, 0x5d, + 0x8b, 0x54, 0x2d, 0x52, 0xb5, 0x48, 0xd5, 0x22, 0x55, 0x8b, 0x54, 0x2d, 0xea, 0xa1, 0x45, 0xa8, + 0x16, 0x85, 0xd0, 0xa2, 0x10, 0x5a, 0x44, 0x6c, 0x8d, 0xd1, 0xef, 0x9b, 0x39, 0x5e, 0x35, 0x27, + 0x4b, 0x18, 0x93, 0x30, 0x26, 0x61, 0xe8, 0x61, 0xe8, 0x61, 0xb0, 0x61, 0x40, 0x61, 0xa3, 0x89, + 0xa0, 0x89, 0xa0, 0x89, 0xa0, 0x89, 0xa0, 0x89, 0xa0, 0x89, 0xa0, 0x89, 0x98, 0xc1, 0x94, 0xd0, + 0x94, 0xd0, 0x94, 0x18, 0x4c, 0x09, 0x69, 0x09, 0x69, 0x69, 0x62, 0x13, 0x95, 0xce, 0xda, 0x44, + 0x25, 0xa5, 0xac, 0x25, 0x3d, 0xab, 0xee, 0x07, 0x4c, 0xa0, 0xfb, 0xa1, 0x1a, 0x0f, 0x6e, 0x49, + 0x7b, 0x1c, 0x03, 0x38, 0x46, 0x72, 0x6c, 0xfa, 0x87, 0xf4, 0x0f, 0xe9, 0x1f, 0x9a, 0xd5, 0x4f, + 0x11, 0x2d, 0x45, 0xb4, 0x14, 0xd1, 0x52, 0x44, 0x4b, 0x11, 0x2d, 0x35, 0xb9, 0xfa, 0x29, 0x10, + 0xe3, 0x02, 0x4a, 0x83, 0x48, 0x83, 0x48, 0x83, 0x48, 0x83, 0x48, 0x83, 0x48, 0x4f, 0x22, 0xd2, + 0x20, 0xd2, 0x06, 0xd1, 0x04, 0xd1, 0x04, 0xd1, 0x04, 0xd1, 0x04, 0xd1, 0x04, 0xd1, 0x9c, 0x44, + 0x34, 0x41, 0x34, 0xcd, 0x1c, 0x17, 0x40, 0x14, 0x40, 0x14, 0x40, 0x14, 0x40, 0x14, 0x40, 0x14, + 0x26, 0xe6, 0xb8, 0x70, 0xd6, 0x1c, 0x17, 0xa6, 0x15, 0xf0, 0x47, 0xbe, 0x36, 0xb2, 0xfb, 0xb1, + 0xa9, 0xb2, 0xe5, 0x69, 0xa4, 0x4f, 0x7c, 0x7d, 0x90, 0xed, 0x69, 0xf2, 0x4f, 0x17, 0x39, 0x09, + 0x3e, 0xf3, 0xe5, 0xb9, 0x39, 0x4d, 0xfe, 0xf9, 0x22, 0x9e, 0x5f, 0xf8, 0xf2, 0xdc, 0x36, 0x4f, + 0x81, 0x69, 0xa0, 0x2f, 0x67, 0x80, 0x46, 0x67, 0xd0, 0x57, 0xa7, 0xce, 0x20, 0x5b, 0x5f, 0x57, + 0xdc, 0xaf, 0x95, 0x6c, 0x89, 0x25, 0xcf, 0x2a, 0xd9, 0xa6, 0x09, 0xeb, 0xe6, 0x71, 0xd5, 0x65, + 0x28, 0x99, 0x0c, 0x25, 0x93, 0xa1, 0x64, 0x32, 0x94, 0x4c, 0x86, 0x92, 0xc9, 0x70, 0xc6, 0x64, + 0x28, 0x99, 0x0c, 0x84, 0x8c, 0xde, 0x55, 0xda, 0xf4, 0xa1, 0x87, 0xb6, 0xc5, 0xfd, 0xe6, 0x94, + 0xf9, 0x92, 0x36, 0x3d, 0xc0, 0xf4, 0x00, 0xc9, 0xc1, 0x28, 0x94, 0xfe, 0x44, 0x6d, 0xd1, 0x6c, + 0x4f, 0x7e, 0xb0, 0xf8, 0x98, 0x77, 0xc9, 0xd4, 0x25, 0x53, 0x97, 0x4c, 0x5d, 0x32, 0x75, 0xc9, + 0xd4, 0x25, 0x4c, 0x97, 0x03, 0xaf, 0xcb, 0x81, 0xd7, 0x05, 0xd4, 0x35, 0x17, 0x8a, 0x28, 0xa0, + 0x28, 0xa0, 0x28, 0xa0, 0x28, 0xa0, 0x28, 0xa0, 0x28, 0xa0, 0x28, 0xd2, 0xa8, 0x91, 0x4e, 0xfb, + 0x24, 0x4f, 0x7e, 0x8b, 0x77, 0x27, 0xe3, 0xaf, 0x6b, 0x69, 0x1b, 0x69, 0x1b, 0x69, 0x1b, 0x69, + 0x1b, 0x69, 0x1b, 0x69, 0x9b, 0x29, 0x6d, 0x73, 0x6d, 0x74, 0xbf, 0x85, 0xd4, 0x66, 0x34, 0x6d, + 0x46, 0xd3, 0x86, 0xdb, 0x36, 0x5c, 0x7f, 0x91, 0xe6, 0xb8, 0x1e, 0x50, 0x01, 0x65, 0xb0, 0x65, + 0xb0, 0x65, 0xb0, 0x65, 0xb0, 0x65, 0xb0, 0xe5, 0xc9, 0x73, 0xa7, 0x0c, 0xa2, 0x7c, 0xfe, 0x59, + 0x3c, 0xd7, 0x0d, 0x7c, 0xfd, 0xdc, 0x7b, 0xf7, 0xc2, 0x17, 0x6e, 0x8e, 0xc5, 0x2a, 0xd8, 0x2a, + 0xd8, 0x2a, 0xd8, 0x2a, 0xd8, 0x2a, 0xd8, 0x2a, 0xd8, 0x2a, 0xbc, 0x2a, 0xbc, 0x2a, 0xbc, 0x2a, + 0xbc, 0xaa, 0xe1, 0x55, 0xe0, 0x55, 0xe0, 0x55, 0xe0, 0x55, 0xe0, 0x55, 0xe0, 0x55, 0xe0, 0x55, + 0xe0, 0x55, 0xe0, 0x55, 0xe0, 0x55, 0xe0, 0x55, 0xcc, 0x7d, 0xd0, 0xfd, 0x6e, 0x7c, 0x21, 0x64, + 0x4d, 0x8a, 0x38, 0x14, 0x71, 0x28, 0xe2, 0x30, 0xfa, 0xcb, 0xa3, 0x88, 0x43, 0x71, 0x72, 0x4d, + 0x8a, 0x40, 0x8b, 0x66, 0x13, 0x39, 0x20, 0x1c, 0x10, 0x0e, 0x08, 0x07, 0x84, 0x03, 0xc2, 0x41, + 0xea, 0x90, 0xce, 0x21, 0x9d, 0x03, 0xc8, 0x99, 0x76, 0x12, 0x7d, 0xbf, 0xc8, 0x39, 0xf8, 0x83, + 0xaf, 0x73, 0x70, 0xdd, 0x3c, 0x5d, 0x32, 0x4f, 0x2b, 0xd3, 0x90, 0x3f, 0xfa, 0x42, 0xee, 0x9a, + 0xa7, 0xad, 0x69, 0xa0, 0x9f, 0x7c, 0x81, 0x76, 0xcc, 0xda, 0xe4, 0x98, 0xd8, 0x1c, 0x13, 0x9b, + 0x63, 0x62, 0x73, 0x4c, 0x6c, 0x8e, 0x89, 0xcd, 0xb1, 0xfa, 0x39, 0xe6, 0x37, 0xc7, 0x8c, 0xe6, + 0xc6, 0x27, 0xe6, 0xcf, 0x67, 0x9c, 0x98, 0xa3, 0x2b, 0xda, 0x2f, 0xc6, 0x27, 0x8b, 0x4f, 0x16, + 0x9f, 0x2c, 0x3e, 0x59, 0x7c, 0xb2, 0xf8, 0x64, 0xf1, 0xc9, 0xe2, 0x93, 0xc5, 0x27, 0x6b, 0x8e, + 0xdf, 0x2b, 0x9c, 0xaf, 0x57, 0xe8, 0xbf, 0x32, 0x36, 0x39, 0xe5, 0xf7, 0xab, 0xa9, 0xea, 0x3a, + 0x7e, 0x75, 0xfc, 0xea, 0xf8, 0xd5, 0xf1, 0xab, 0xe3, 0x57, 0xc7, 0xaf, 0x8e, 0x5f, 0x9d, 0xba, + 0xa9, 0x53, 0x37, 0x75, 0x5c, 0xea, 0x86, 0x57, 0x83, 0x57, 0x83, 0x57, 0x83, 0x37, 0xfa, 0xf3, + 0xb3, 0x06, 0xaf, 0x06, 0xaf, 0x06, 0xaf, 0x06, 0xaf, 0x06, 0xaf, 0x06, 0xaf, 0x36, 0x6d, 0xd9, + 0x7e, 0x5b, 0xa4, 0x0e, 0x7f, 0xf7, 0x77, 0x83, 0xf9, 0xc3, 0xec, 0xa2, 0x1e, 0x83, 0xe8, 0x31, + 0x88, 0x1e, 0x83, 0xe8, 0x31, 0x88, 0x1e, 0x83, 0xe8, 0x91, 0xbe, 0x47, 0xfa, 0x1e, 0xe9, 0x7b, + 0xa4, 0xef, 0x19, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, + 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x60, 0xda, 0x88, 0xfe, 0xf4, 0x55, 0xbd, 0x97, 0xcd, 0x53, + 0xd0, 0xd4, 0x57, 0x9e, 0x44, 0x79, 0x12, 0xe5, 0x49, 0x94, 0x27, 0x51, 0x9e, 0x44, 0x79, 0xd6, + 0x27, 0x4f, 0xb0, 0x3c, 0x51, 0xf2, 0xa6, 0xbe, 0x8e, 0xa8, 0xaf, 0x23, 0xfa, 0x8f, 0x4c, 0xff, + 0xbf, 0xbf, 0xeb, 0xf4, 0x1f, 0xd2, 0x7f, 0x48, 0xff, 0xa1, 0xa9, 0x94, 0x0e, 0x49, 0x3a, 0x24, + 0xe9, 0x90, 0xa4, 0x43, 0x92, 0x0e, 0x49, 0x3a, 0x24, 0xe9, 0x90, 0xa4, 0xc3, 0x14, 0x75, 0x98, + 0xa2, 0x0e, 0xbc, 0x8e, 0xe1, 0xcd, 0xf5, 0xa1, 0x3c, 0xf7, 0x0b, 0xb9, 0x36, 0xc7, 0x7d, 0x24, + 0xe0, 0xe3, 0x5a, 0xb2, 0x36, 0xc7, 0xd1, 0x1c, 0x58, 0xf4, 0x84, 0xfe, 0x6b, 0x91, 0x9d, 0xf1, + 0xf7, 0x0c, 0x11, 0x55, 0xdc, 0x27, 0x79, 0x9f, 0xe4, 0x7d, 0x92, 0xf7, 0x49, 0xde, 0x27, 0x79, + 0x9f, 0xc8, 0x7d, 0x22, 0xf7, 0x89, 0xdc, 0x27, 0x72, 0xdf, 0x4c, 0x81, 0xbf, 0x7d, 0x15, 0xf0, + 0xb1, 0xbd, 0xd6, 0xe6, 0xd8, 0x5e, 0x81, 0x45, 0x77, 0xd9, 0xa3, 0x19, 0xb3, 0xb3, 0x36, 0xc7, + 0xec, 0x04, 0x66, 0x4f, 0xd2, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd1, 0x47, 0x5c, 0x26, 0x6b, + 0x16, 0x00, 0x00, + } + buf, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + panic(err) + } + dec := gob.NewDecoder(buf) + if err := dec.Decode(&tab); err != nil { + panic(err) + } + + for i, row := range tab { + actionTab[i].canRecover = row.CanRecover + for _, a := range row.Actions { + switch a.Action { + case 0: + actionTab[i].actions[a.Index] = accept(true) + case 1: + actionTab[i].actions[a.Index] = reduce(a.Amount) + case 2: + actionTab[i].actions[a.Index] = shift(a.Amount) + } + } + } +} diff --git a/vendor/github.com/awalterschulze/gographviz/internal/parser/gototable.go b/vendor/github.com/awalterschulze/gographviz/internal/parser/gototable.go new file mode 100644 index 00000000000..dc33aacb1f9 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/parser/gototable.go @@ -0,0 +1,56 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +import ( + "bytes" + "compress/gzip" + "encoding/gob" +) + +const numNTSymbols = 17 + +type ( + gotoTable [numStates]gotoRow + gotoRow [numNTSymbols]int +) + +var gotoTab = gotoTable{} + +func init() { + tab := [][]int{} + data := []byte{ + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe2, 0xfd, 0xdf, 0xcd, 0xc4, 0xc8, + 0xf4, 0xbf, 0x87, 0x81, 0xf1, 0x7f, 0x17, 0x03, 0x03, 0xcf, 0xff, 0x4e, 0x10, 0xaf, 0x8b, 0x81, + 0x91, 0x85, 0x81, 0xe1, 0x1f, 0xa7, 0xc6, 0xff, 0x1e, 0x86, 0xff, 0x0d, 0x82, 0x8c, 0x4c, 0x8c, + 0xa8, 0x40, 0x90, 0x11, 0x1d, 0x60, 0x88, 0xf0, 0x10, 0xa1, 0x46, 0x4c, 0x90, 0x91, 0x51, 0x41, + 0x49, 0x45, 0x8b, 0x91, 0x91, 0x51, 0x83, 0x51, 0xcd, 0x88, 0x51, 0x87, 0x51, 0x8e, 0x08, 0x5d, + 0x98, 0x22, 0x36, 0x18, 0x22, 0x0e, 0x82, 0x8c, 0x8c, 0x2e, 0x44, 0x9a, 0xec, 0x81, 0x22, 0xe2, + 0x43, 0x9a, 0x7b, 0x02, 0xa0, 0x22, 0x61, 0x94, 0xfb, 0x82, 0x54, 0x91, 0x28, 0x10, 0x11, 0x03, + 0x13, 0x49, 0xc2, 0x50, 0x93, 0x82, 0x21, 0x92, 0xc6, 0xc8, 0xc8, 0x98, 0x81, 0xa2, 0x0b, 0x01, + 0x72, 0xb0, 0xda, 0x55, 0x80, 0x11, 0x1a, 0x25, 0x44, 0x84, 0x4f, 0x15, 0x79, 0x71, 0x8a, 0x11, + 0x86, 0xff, 0x9b, 0x88, 0x35, 0xe8, 0x7f, 0xd7, 0xff, 0x1e, 0x18, 0xb3, 0x8d, 0x88, 0xf8, 0xf8, + 0x3f, 0x89, 0x08, 0x47, 0xfd, 0x9f, 0x46, 0x51, 0x1c, 0xfd, 0x9f, 0x05, 0x37, 0x68, 0x0e, 0xaa, + 0xaa, 0xff, 0x4b, 0x18, 0xff, 0x2f, 0x62, 0xfc, 0xbf, 0x80, 0xe6, 0xc9, 0xe4, 0xff, 0x0a, 0x54, + 0x27, 0xfc, 0x5f, 0x43, 0xa5, 0x98, 0x21, 0x46, 0xcd, 0xff, 0x6d, 0xc4, 0x58, 0x86, 0xa9, 0x6d, + 0x0f, 0x35, 0xdd, 0xf8, 0xff, 0x10, 0x5a, 0xc2, 0x20, 0x32, 0xe4, 0x18, 0x19, 0xff, 0x9f, 0x20, + 0x4f, 0x1f, 0xbd, 0x45, 0xfe, 0x5f, 0x60, 0xfc, 0x7f, 0x0e, 0x92, 0x98, 0xfe, 0x5f, 0xc2, 0x17, + 0x74, 0x01, 0xe4, 0xda, 0xf7, 0xff, 0x1a, 0xf9, 0x39, 0xf8, 0x0e, 0x15, 0x8a, 0x77, 0x0a, 0x0a, + 0x58, 0x0a, 0x8a, 0x65, 0x7c, 0xf1, 0xff, 0xff, 0x09, 0x69, 0x46, 0xbd, 0xc0, 0x63, 0xd4, 0x2b, + 0xf2, 0x03, 0xf7, 0xd3, 0xc0, 0x06, 0xee, 0x60, 0x13, 0xc1, 0x0c, 0xa0, 0x3f, 0xf4, 0x0a, 0x20, + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8f, 0xfa, 0xd1, 0x1a, 0x46, 0x09, 0x00, 0x00, + } + buf, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + panic(err) + } + dec := gob.NewDecoder(buf) + if err := dec.Decode(&tab); err != nil { + panic(err) + } + for i := 0; i < numStates; i++ { + for j := 0; j < numNTSymbols; j++ { + gotoTab[i][j] = tab[i][j] + } + } +} diff --git a/vendor/github.com/awalterschulze/gographviz/internal/parser/main.go b/vendor/github.com/awalterschulze/gographviz/internal/parser/main.go new file mode 100644 index 00000000000..0253f930bcb --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/parser/main.go @@ -0,0 +1,72 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +//A parser for the DOT grammar. +package parser + +import ( + "fmt" + "io" + "io/ioutil" + "os" + + "github.com/awalterschulze/gographviz/ast" + "github.com/awalterschulze/gographviz/internal/lexer" +) + +//Parses a DOT string and outputs the +//abstract syntax tree representing the graph. +func ParseString(dotString string) (*ast.Graph, error) { + return ParseBytes([]byte(dotString)) +} + +//Parses the bytes representing a DOT string +//and outputs the abstract syntax tree representing the graph. +func ParseBytes(dotBytes []byte) (*ast.Graph, error) { + lex := lexer.NewLexer(dotBytes) + parser := NewParser() + st, err := parser.Parse(lex) + if err != nil { + return nil, err + } + g, ok := st.(*ast.Graph) + if !ok { + panic(fmt.Sprintf("Parser did not return an *ast.Graph, but rather a %T", st)) + } + return g, nil +} + +//Parses a reader which contains a DOT string +//and outputs the abstract syntax tree representing the graph. +func Parse(r io.Reader) (*ast.Graph, error) { + bytes, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + return ParseBytes(bytes) +} + +//Parses a file which contains a DOT string +//and outputs the abstract syntax tree representing the graph. +func ParseFile(filename string) (*ast.Graph, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + g, err := Parse(f) + if err := f.Close(); err != nil { + return nil, err + } + return g, err +} diff --git a/vendor/github.com/awalterschulze/gographviz/internal/parser/parser.go b/vendor/github.com/awalterschulze/gographviz/internal/parser/parser.go new file mode 100644 index 00000000000..fad5f402462 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/parser/parser.go @@ -0,0 +1,212 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +import ( + "bytes" + "fmt" + + parseError "github.com/awalterschulze/gographviz/internal/errors" + "github.com/awalterschulze/gographviz/internal/token" +) + +const ( + numProductions = 60 + numStates = 128 + numSymbols = 36 +) + +// Stack + +type stack struct { + state []int + attrib []Attrib +} + +const iNITIAL_STACK_SIZE = 100 + +func newStack() *stack { + return &stack{state: make([]int, 0, iNITIAL_STACK_SIZE), + attrib: make([]Attrib, 0, iNITIAL_STACK_SIZE), + } +} + +func (this *stack) reset() { + this.state = this.state[0:0] + this.attrib = this.attrib[0:0] +} + +func (this *stack) push(s int, a Attrib) { + this.state = append(this.state, s) + this.attrib = append(this.attrib, a) +} + +func (this *stack) top() int { + return this.state[len(this.state)-1] +} + +func (this *stack) peek(pos int) int { + return this.state[pos] +} + +func (this *stack) topIndex() int { + return len(this.state) - 1 +} + +func (this *stack) popN(items int) []Attrib { + lo, hi := len(this.state)-items, len(this.state) + + attrib := this.attrib[lo:hi] + + this.state = this.state[:lo] + this.attrib = this.attrib[:lo] + + return attrib +} + +func (S *stack) String() string { + w := new(bytes.Buffer) + fmt.Fprintf(w, "stack:\n") + for i, st := range S.state { + fmt.Fprintf(w, "\t%d:%d , ", i, st) + if S.attrib[i] == nil { + fmt.Fprintf(w, "nil") + } else { + fmt.Fprintf(w, "%v", S.attrib[i]) + } + fmt.Fprintf(w, "\n") + } + return w.String() +} + +// Parser + +type Parser struct { + stack *stack + nextToken *token.Token + pos int +} + +type Scanner interface { + Scan() (tok *token.Token) +} + +func NewParser() *Parser { + p := &Parser{stack: newStack()} + p.Reset() + return p +} + +func (P *Parser) Reset() { + P.stack.reset() + P.stack.push(0, nil) +} + +func (P *Parser) Error(err error, scanner Scanner) (recovered bool, errorAttrib *parseError.Error) { + errorAttrib = &parseError.Error{ + Err: err, + ErrorToken: P.nextToken, + ErrorSymbols: P.popNonRecoveryStates(), + ExpectedTokens: make([]string, 0, 8), + } + for t, action := range actionTab[P.stack.top()].actions { + if action != nil { + errorAttrib.ExpectedTokens = append(errorAttrib.ExpectedTokens, token.TokMap.Id(token.Type(t))) + } + } + + if action := actionTab[P.stack.top()].actions[token.TokMap.Type("error")]; action != nil { + P.stack.push(int(action.(shift)), errorAttrib) // action can only be shift + } else { + return + } + + if action := actionTab[P.stack.top()].actions[P.nextToken.Type]; action != nil { + recovered = true + } + for !recovered && P.nextToken.Type != token.EOF { + P.nextToken = scanner.Scan() + if action := actionTab[P.stack.top()].actions[P.nextToken.Type]; action != nil { + recovered = true + } + } + + return +} + +func (P *Parser) popNonRecoveryStates() (removedAttribs []parseError.ErrorSymbol) { + if rs, ok := P.firstRecoveryState(); ok { + errorSymbols := P.stack.popN(int(P.stack.topIndex() - rs)) + removedAttribs = make([]parseError.ErrorSymbol, len(errorSymbols)) + for i, e := range errorSymbols { + removedAttribs[i] = e + } + } else { + removedAttribs = []parseError.ErrorSymbol{} + } + return +} + +// recoveryState points to the highest state on the stack, which can recover +func (P *Parser) firstRecoveryState() (recoveryState int, canRecover bool) { + recoveryState, canRecover = P.stack.topIndex(), actionTab[P.stack.top()].canRecover + for recoveryState > 0 && !canRecover { + recoveryState-- + canRecover = actionTab[P.stack.peek(recoveryState)].canRecover + } + return +} + +func (P *Parser) newError(err error) error { + e := &parseError.Error{ + Err: err, + StackTop: P.stack.top(), + ErrorToken: P.nextToken, + } + actRow := actionTab[P.stack.top()] + for i, t := range actRow.actions { + if t != nil { + e.ExpectedTokens = append(e.ExpectedTokens, token.TokMap.Id(token.Type(i))) + } + } + return e +} + +func (this *Parser) Parse(scanner Scanner) (res interface{}, err error) { + this.Reset() + this.nextToken = scanner.Scan() + for acc := false; !acc; { + action := actionTab[this.stack.top()].actions[this.nextToken.Type] + if action == nil { + if recovered, errAttrib := this.Error(nil, scanner); !recovered { + this.nextToken = errAttrib.ErrorToken + return nil, this.newError(nil) + } + if action = actionTab[this.stack.top()].actions[this.nextToken.Type]; action == nil { + panic("Error recovery led to invalid action") + } + } + + // fmt.Printf("S%d %s %s\n", this.stack.top(), token.TokMap.TokenString(this.nextToken), action.String()) + + switch act := action.(type) { + case accept: + res = this.stack.popN(1)[0] + acc = true + case shift: + this.stack.push(int(act), this.nextToken) + this.nextToken = scanner.Scan() + case reduce: + prod := productionsTable[int(act)] + attrib, err := prod.ReduceFunc(this.stack.popN(prod.NumSymbols)) + if err != nil { + return nil, this.newError(err) + } else { + this.stack.push(gotoTab[this.stack.top()][prod.NTType], attrib) + } + default: + panic("unknown action: " + action.String()) + } + } + return res, nil +} diff --git a/vendor/github.com/awalterschulze/gographviz/internal/parser/productionstable.go b/vendor/github.com/awalterschulze/gographviz/internal/parser/productionstable.go new file mode 100644 index 00000000000..3262aefd3b3 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/parser/productionstable.go @@ -0,0 +1,623 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +import "github.com/awalterschulze/gographviz/ast" + +type ( + //TODO: change type and variable names to be consistent with other tables + ProdTab [numProductions]ProdTabEntry + ProdTabEntry struct { + String string + Id string + NTType int + Index int + NumSymbols int + ReduceFunc func([]Attrib) (Attrib, error) + } + Attrib interface { + } +) + +var productionsTable = ProdTab{ + ProdTabEntry{ + String: `S' : DotGraph << >>`, + Id: "S'", + NTType: 0, + Index: 0, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `DotGraph : graphx "{" "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, nil, nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 1, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.FALSE, nil, nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict graphx "{" "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, nil, nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 2, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.TRUE, nil, nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : graphx Id "{" "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, X[1], nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 3, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.FALSE, X[1], nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict graphx Id "{" "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, X[2], nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 4, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.TRUE, X[2], nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : graphx "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, nil, X[2]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 5, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.FALSE, nil, X[2]) + }, + }, + ProdTabEntry{ + String: `DotGraph : graphx Id "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, X[1], X[3]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 6, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.FALSE, X[1], X[3]) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict graphx "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, nil, X[3]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 7, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.TRUE, nil, X[3]) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict graphx Id "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, X[2], X[4]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 8, + NumSymbols: 6, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.TRUE, X[2], X[4]) + }, + }, + ProdTabEntry{ + String: `DotGraph : digraph "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, nil, nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 9, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.FALSE, nil, nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict digraph "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, nil, nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 10, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.TRUE, nil, nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : digraph Id "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, X[1], nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 11, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.FALSE, X[1], nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict digraph Id "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, X[2], nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 12, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.TRUE, X[2], nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : digraph "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, nil, X[2]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 13, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.FALSE, nil, X[2]) + }, + }, + ProdTabEntry{ + String: `DotGraph : digraph Id "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, X[1], X[3]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 14, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.FALSE, X[1], X[3]) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict digraph "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, nil, X[3]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 15, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.TRUE, nil, X[3]) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict digraph Id "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, X[2], X[4]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 16, + NumSymbols: 6, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.TRUE, X[2], X[4]) + }, + }, + ProdTabEntry{ + String: `StmtList : Stmt1 << ast.NewStmtList(X[0]) >>`, + Id: "StmtList", + NTType: 2, + Index: 17, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewStmtList(X[0]) + }, + }, + ProdTabEntry{ + String: `StmtList : StmtList Stmt1 << ast.AppendStmtList(X[0], X[1]) >>`, + Id: "StmtList", + NTType: 2, + Index: 18, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendStmtList(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `Stmt1 : Stmt << X[0], nil >>`, + Id: "Stmt1", + NTType: 3, + Index: 19, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Stmt1 : Stmt ";" << X[0], nil >>`, + Id: "Stmt1", + NTType: 3, + Index: 20, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Stmt : Id "=" Id << ast.NewAttr(X[0], X[2]) >>`, + Id: "Stmt", + NTType: 4, + Index: 21, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAttr(X[0], X[2]) + }, + }, + ProdTabEntry{ + String: `Stmt : NodeStmt << X[0], nil >>`, + Id: "Stmt", + NTType: 4, + Index: 22, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Stmt : EdgeStmt << X[0], nil >>`, + Id: "Stmt", + NTType: 4, + Index: 23, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Stmt : AttrStmt << X[0], nil >>`, + Id: "Stmt", + NTType: 4, + Index: 24, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Stmt : SubGraphStmt << X[0], nil >>`, + Id: "Stmt", + NTType: 4, + Index: 25, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `AttrStmt : graphx AttrList << ast.NewGraphAttrs(X[1]) >>`, + Id: "AttrStmt", + NTType: 5, + Index: 26, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraphAttrs(X[1]) + }, + }, + ProdTabEntry{ + String: `AttrStmt : node AttrList << ast.NewNodeAttrs(X[1]) >>`, + Id: "AttrStmt", + NTType: 5, + Index: 27, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewNodeAttrs(X[1]) + }, + }, + ProdTabEntry{ + String: `AttrStmt : edge AttrList << ast.NewEdgeAttrs(X[1]) >>`, + Id: "AttrStmt", + NTType: 5, + Index: 28, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeAttrs(X[1]) + }, + }, + ProdTabEntry{ + String: `AttrList : "[" "]" << ast.NewAttrList(nil) >>`, + Id: "AttrList", + NTType: 6, + Index: 29, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAttrList(nil) + }, + }, + ProdTabEntry{ + String: `AttrList : "[" AList "]" << ast.NewAttrList(X[1]) >>`, + Id: "AttrList", + NTType: 6, + Index: 30, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAttrList(X[1]) + }, + }, + ProdTabEntry{ + String: `AttrList : AttrList "[" "]" << ast.AppendAttrList(X[0], nil) >>`, + Id: "AttrList", + NTType: 6, + Index: 31, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendAttrList(X[0], nil) + }, + }, + ProdTabEntry{ + String: `AttrList : AttrList "[" AList "]" << ast.AppendAttrList(X[0], X[2]) >>`, + Id: "AttrList", + NTType: 6, + Index: 32, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendAttrList(X[0], X[2]) + }, + }, + ProdTabEntry{ + String: `AList : Attr << ast.NewAList(X[0]) >>`, + Id: "AList", + NTType: 7, + Index: 33, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAList(X[0]) + }, + }, + ProdTabEntry{ + String: `AList : AList Attr << ast.AppendAList(X[0], X[1]) >>`, + Id: "AList", + NTType: 7, + Index: 34, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendAList(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `AList : AList "," Attr << ast.AppendAList(X[0], X[2]) >>`, + Id: "AList", + NTType: 7, + Index: 35, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendAList(X[0], X[2]) + }, + }, + ProdTabEntry{ + String: `Attr : Id << ast.NewAttr(X[0], nil) >>`, + Id: "Attr", + NTType: 8, + Index: 36, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAttr(X[0], nil) + }, + }, + ProdTabEntry{ + String: `Attr : Id "=" Id << ast.NewAttr(X[0], X[2]) >>`, + Id: "Attr", + NTType: 8, + Index: 37, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAttr(X[0], X[2]) + }, + }, + ProdTabEntry{ + String: `EdgeStmt : NodeId EdgeRHS << ast.NewEdgeStmt(X[0], X[1], nil) >>`, + Id: "EdgeStmt", + NTType: 9, + Index: 38, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeStmt(X[0], X[1], nil) + }, + }, + ProdTabEntry{ + String: `EdgeStmt : NodeId EdgeRHS AttrList << ast.NewEdgeStmt(X[0], X[1], X[2]) >>`, + Id: "EdgeStmt", + NTType: 9, + Index: 39, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeStmt(X[0], X[1], X[2]) + }, + }, + ProdTabEntry{ + String: `EdgeStmt : SubGraphStmt EdgeRHS << ast.NewEdgeStmt(X[0], X[1], nil) >>`, + Id: "EdgeStmt", + NTType: 9, + Index: 40, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeStmt(X[0], X[1], nil) + }, + }, + ProdTabEntry{ + String: `EdgeStmt : SubGraphStmt EdgeRHS AttrList << ast.NewEdgeStmt(X[0], X[1], X[2]) >>`, + Id: "EdgeStmt", + NTType: 9, + Index: 41, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeStmt(X[0], X[1], X[2]) + }, + }, + ProdTabEntry{ + String: `EdgeRHS : EdgeOp NodeId << ast.NewEdgeRHS(X[0], X[1]) >>`, + Id: "EdgeRHS", + NTType: 10, + Index: 42, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeRHS(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `EdgeRHS : EdgeOp SubGraphStmt << ast.NewEdgeRHS(X[0], X[1]) >>`, + Id: "EdgeRHS", + NTType: 10, + Index: 43, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeRHS(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `EdgeRHS : EdgeRHS EdgeOp NodeId << ast.AppendEdgeRHS(X[0], X[1], X[2]) >>`, + Id: "EdgeRHS", + NTType: 10, + Index: 44, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendEdgeRHS(X[0], X[1], X[2]) + }, + }, + ProdTabEntry{ + String: `EdgeRHS : EdgeRHS EdgeOp SubGraphStmt << ast.AppendEdgeRHS(X[0], X[1], X[2]) >>`, + Id: "EdgeRHS", + NTType: 10, + Index: 45, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendEdgeRHS(X[0], X[1], X[2]) + }, + }, + ProdTabEntry{ + String: `NodeStmt : NodeId << ast.NewNodeStmt(X[0], nil) >>`, + Id: "NodeStmt", + NTType: 11, + Index: 46, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewNodeStmt(X[0], nil) + }, + }, + ProdTabEntry{ + String: `NodeStmt : NodeId AttrList << ast.NewNodeStmt(X[0], X[1]) >>`, + Id: "NodeStmt", + NTType: 11, + Index: 47, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewNodeStmt(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `NodeId : Id << ast.NewNodeID(X[0], nil) >>`, + Id: "NodeId", + NTType: 12, + Index: 48, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewNodeID(X[0], nil) + }, + }, + ProdTabEntry{ + String: `NodeId : Id Port << ast.NewNodeID(X[0], X[1]) >>`, + Id: "NodeId", + NTType: 12, + Index: 49, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewNodeID(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `Port : ":" Id << ast.NewPort(X[1], nil), nil >>`, + Id: "Port", + NTType: 13, + Index: 50, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewPort(X[1], nil), nil + }, + }, + ProdTabEntry{ + String: `Port : ":" Id ":" Id << ast.NewPort(X[1], X[3]), nil >>`, + Id: "Port", + NTType: 13, + Index: 51, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewPort(X[1], X[3]), nil + }, + }, + ProdTabEntry{ + String: `SubGraphStmt : "{" StmtList "}" << ast.NewSubGraph(nil, X[1]) >>`, + Id: "SubGraphStmt", + NTType: 14, + Index: 52, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewSubGraph(nil, X[1]) + }, + }, + ProdTabEntry{ + String: `SubGraphStmt : subgraph "{" StmtList "}" << ast.NewSubGraph(nil, X[2]) >>`, + Id: "SubGraphStmt", + NTType: 14, + Index: 53, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewSubGraph(nil, X[2]) + }, + }, + ProdTabEntry{ + String: `SubGraphStmt : subgraph Id "{" StmtList "}" << ast.NewSubGraph(X[1], X[3]) >>`, + Id: "SubGraphStmt", + NTType: 14, + Index: 54, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewSubGraph(X[1], X[3]) + }, + }, + ProdTabEntry{ + String: `SubGraphStmt : subgraph "{" "}" << ast.NewSubGraph(nil, nil) >>`, + Id: "SubGraphStmt", + NTType: 14, + Index: 55, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewSubGraph(nil, nil) + }, + }, + ProdTabEntry{ + String: `SubGraphStmt : subgraph Id "{" "}" << ast.NewSubGraph(X[1], nil) >>`, + Id: "SubGraphStmt", + NTType: 14, + Index: 56, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewSubGraph(X[1], nil) + }, + }, + ProdTabEntry{ + String: `EdgeOp : "->" << ast.DIRECTED, nil >>`, + Id: "EdgeOp", + NTType: 15, + Index: 57, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.DIRECTED, nil + }, + }, + ProdTabEntry{ + String: `EdgeOp : "--" << ast.UNDIRECTED, nil >>`, + Id: "EdgeOp", + NTType: 15, + Index: 58, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.UNDIRECTED, nil + }, + }, + ProdTabEntry{ + String: `Id : id << ast.NewID(X[0]) >>`, + Id: "Id", + NTType: 16, + Index: 59, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewID(X[0]) + }, + }, +} diff --git a/vendor/github.com/awalterschulze/gographviz/internal/token/token.go b/vendor/github.com/awalterschulze/gographviz/internal/token/token.go new file mode 100644 index 00000000000..b1220168cb5 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/internal/token/token.go @@ -0,0 +1,104 @@ +// Code generated by gocc; DO NOT EDIT. + +package token + +import ( + "fmt" +) + +type Token struct { + Type + Lit []byte + Pos +} + +type Type int + +const ( + INVALID Type = iota + EOF +) + +type Pos struct { + Offset int + Line int + Column int +} + +func (this Pos) String() string { + return fmt.Sprintf("Pos(offset=%d, line=%d, column=%d)", this.Offset, this.Line, this.Column) +} + +type TokenMap struct { + typeMap []string + idMap map[string]Type +} + +func (this TokenMap) Id(tok Type) string { + if int(tok) < len(this.typeMap) { + return this.typeMap[tok] + } + return "unknown" +} + +func (this TokenMap) Type(tok string) Type { + if typ, exist := this.idMap[tok]; exist { + return typ + } + return INVALID +} + +func (this TokenMap) TokenString(tok *Token) string { + //TODO: refactor to print pos & token string properly + return fmt.Sprintf("%s(%d,%s)", this.Id(tok.Type), tok.Type, tok.Lit) +} + +func (this TokenMap) StringType(typ Type) string { + return fmt.Sprintf("%s(%d)", this.Id(typ), typ) +} + +var TokMap = TokenMap{ + typeMap: []string{ + "INVALID", + "$", + "graphx", + "{", + "}", + "strict", + "digraph", + ";", + "=", + "node", + "edge", + "[", + "]", + ",", + ":", + "subgraph", + "->", + "--", + "id", + }, + + idMap: map[string]Type{ + "INVALID": 0, + "$": 1, + "graphx": 2, + "{": 3, + "}": 4, + "strict": 5, + "digraph": 6, + ";": 7, + "=": 8, + "node": 9, + "edge": 10, + "[": 11, + "]": 12, + ",": 13, + ":": 14, + "subgraph": 15, + "->": 16, + "--": 17, + "id": 18, + }, +} diff --git a/vendor/github.com/awalterschulze/gographviz/nodes.go b/vendor/github.com/awalterschulze/gographviz/nodes.go new file mode 100644 index 00000000000..6f0011a359d --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/nodes.go @@ -0,0 +1,61 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "sort" +) + +// Node represents a Node. +type Node struct { + Name string + Attrs Attrs +} + +// Nodes represents a set of Nodes. +type Nodes struct { + Lookup map[string]*Node + Nodes []*Node +} + +// NewNodes creates a new set of Nodes. +func NewNodes() *Nodes { + return &Nodes{make(map[string]*Node), make([]*Node, 0)} +} + +// Add adds a Node to the set of Nodes, ammending the attributes of an already existing node. +func (nodes *Nodes) Add(node *Node) { + n, ok := nodes.Lookup[node.Name] + if ok { + n.Attrs.Ammend(node.Attrs) + return + } + nodes.Lookup[node.Name] = node + nodes.Nodes = append(nodes.Nodes, node) +} + +// Sorted returns a sorted list of nodes. +func (nodes Nodes) Sorted() []*Node { + keys := make([]string, 0, len(nodes.Lookup)) + for key := range nodes.Lookup { + keys = append(keys, key) + } + sort.Strings(keys) + nodeList := make([]*Node, len(keys)) + for i := range keys { + nodeList[i] = nodes.Lookup[keys[i]] + } + return nodeList +} diff --git a/vendor/github.com/awalterschulze/gographviz/relations.go b/vendor/github.com/awalterschulze/gographviz/relations.go new file mode 100644 index 00000000000..95f1a720b30 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/relations.go @@ -0,0 +1,53 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "sort" +) + +// Relations represents the relations between graphs and nodes. +// Each node belongs the main graph or a subgraph. +type Relations struct { + ParentToChildren map[string]map[string]bool + ChildToParents map[string]map[string]bool +} + +// NewRelations creates an empty set of relations. +func NewRelations() *Relations { + return &Relations{make(map[string]map[string]bool), make(map[string]map[string]bool)} +} + +// Add adds a node to a parent graph. +func (relations *Relations) Add(parent string, child string) { + if _, ok := relations.ParentToChildren[parent]; !ok { + relations.ParentToChildren[parent] = make(map[string]bool) + } + relations.ParentToChildren[parent][child] = true + if _, ok := relations.ChildToParents[child]; !ok { + relations.ChildToParents[child] = make(map[string]bool) + } + relations.ChildToParents[child][parent] = true +} + +// SortedChildren returns a list of sorted children of the given parent graph. +func (relations *Relations) SortedChildren(parent string) []string { + keys := make([]string, 0) + for key := range relations.ParentToChildren[parent] { + keys = append(keys, key) + } + sort.Strings(keys) + return keys +} diff --git a/vendor/github.com/awalterschulze/gographviz/subgraphs.go b/vendor/github.com/awalterschulze/gographviz/subgraphs.go new file mode 100644 index 00000000000..2cc78fb3db7 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/subgraphs.go @@ -0,0 +1,64 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "sort" +) + +// SubGraph represents a Subgraph. +type SubGraph struct { + Attrs Attrs + Name string +} + +// NewSubGraph creates a new Subgraph. +func NewSubGraph(name string) *SubGraph { + return &SubGraph{ + Attrs: make(Attrs), + Name: name, + } +} + +// SubGraphs represents a set of SubGraphs. +type SubGraphs struct { + SubGraphs map[string]*SubGraph +} + +// NewSubGraphs creates a new blank set of SubGraphs. +func NewSubGraphs() *SubGraphs { + return &SubGraphs{make(map[string]*SubGraph)} +} + +// Add adds and creates a new Subgraph to the set of SubGraphs. +func (subgraphs *SubGraphs) Add(name string) { + if _, ok := subgraphs.SubGraphs[name]; !ok { + subgraphs.SubGraphs[name] = NewSubGraph(name) + } +} + +// Sorted returns a sorted list of SubGraphs. +func (subgraphs *SubGraphs) Sorted() []*SubGraph { + keys := make([]string, 0) + for key := range subgraphs.SubGraphs { + keys = append(keys, key) + } + sort.Strings(keys) + s := make([]*SubGraph, len(keys)) + for i, key := range keys { + s[i] = subgraphs.SubGraphs[key] + } + return s +} diff --git a/vendor/github.com/awalterschulze/gographviz/write.go b/vendor/github.com/awalterschulze/gographviz/write.go new file mode 100644 index 00000000000..2c18a5b8f49 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/write.go @@ -0,0 +1,172 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "fmt" + + "github.com/awalterschulze/gographviz/ast" +) + +type writer struct { + *Graph + writtenLocations map[string]bool +} + +func newWriter(g *Graph) *writer { + return &writer{g, make(map[string]bool)} +} + +func appendAttrs(list ast.StmtList, attrs Attrs) ast.StmtList { + for _, name := range attrs.sortedNames() { + stmt := &ast.Attr{ + Field: ast.ID(name), + Value: ast.ID(attrs[name]), + } + list = append(list, stmt) + } + return list +} + +func (w *writer) newSubGraph(name string) (*ast.SubGraph, error) { + sub := w.SubGraphs.SubGraphs[name] + w.writtenLocations[sub.Name] = true + s := &ast.SubGraph{} + s.ID = ast.ID(sub.Name) + s.StmtList = appendAttrs(s.StmtList, sub.Attrs) + children := w.Relations.SortedChildren(name) + for _, child := range children { + if w.IsNode(child) { + s.StmtList = append(s.StmtList, w.newNodeStmt(child)) + } else if w.IsSubGraph(child) { + subgraph, err := w.newSubGraph(child) + if err != nil { + return nil, err + } + s.StmtList = append(s.StmtList, subgraph) + } else { + return nil, fmt.Errorf("%v is not a node or a subgraph", child) + } + } + return s, nil +} + +func (w *writer) newNodeID(name string, port string) *ast.NodeID { + node := w.Nodes.Lookup[name] + return ast.MakeNodeID(node.Name, port) +} + +func (w *writer) newNodeStmt(name string) *ast.NodeStmt { + node := w.Nodes.Lookup[name] + id := ast.MakeNodeID(node.Name, "") + w.writtenLocations[node.Name] = true + return &ast.NodeStmt{ + NodeID: id, + Attrs: ast.PutMap(node.Attrs.toMap()), + } +} + +func (w *writer) newLocation(name string, port string) (ast.Location, error) { + if w.IsNode(name) { + return w.newNodeID(name, port), nil + } else if w.isClusterSubGraph(name) { + if len(port) != 0 { + return nil, fmt.Errorf("subgraph cannot have a port: %v", port) + } + return ast.MakeNodeID(name, port), nil + } else if w.IsSubGraph(name) { + if len(port) != 0 { + return nil, fmt.Errorf("subgraph cannot have a port: %v", port) + } + return w.newSubGraph(name) + } + return nil, fmt.Errorf("%v is not a node or a subgraph", name) +} + +func (w *writer) newEdgeStmt(edge *Edge) (*ast.EdgeStmt, error) { + src, err := w.newLocation(edge.Src, edge.SrcPort) + if err != nil { + return nil, err + } + dst, err := w.newLocation(edge.Dst, edge.DstPort) + if err != nil { + return nil, err + } + stmt := &ast.EdgeStmt{ + Source: src, + EdgeRHS: ast.EdgeRHS{ + &ast.EdgeRH{ + Op: ast.EdgeOp(edge.Dir), + Destination: dst, + }, + }, + Attrs: ast.PutMap(edge.Attrs.toMap()), + } + return stmt, nil +} + +func (w *writer) Write() (*ast.Graph, error) { + t := &ast.Graph{} + t.Strict = w.Strict + t.Type = ast.GraphType(w.Directed) + t.ID = ast.ID(w.Name) + + t.StmtList = appendAttrs(t.StmtList, w.Attrs) + + for _, edge := range w.Edges.Edges { + e, err := w.newEdgeStmt(edge) + if err != nil { + return nil, err + } + t.StmtList = append(t.StmtList, e) + } + + subGraphs := w.SubGraphs.Sorted() + for _, s := range subGraphs { + if _, ok := w.writtenLocations[s.Name]; !ok { + if _, ok := w.Relations.ParentToChildren[w.Name][s.Name]; ok { + s, err := w.newSubGraph(s.Name) + if err != nil { + return nil, err + } + t.StmtList = append(t.StmtList, s) + } + } + } + + nodes := w.Nodes.Sorted() + for _, n := range nodes { + if _, ok := w.writtenLocations[n.Name]; !ok { + t.StmtList = append(t.StmtList, w.newNodeStmt(n.Name)) + } + } + + return t, nil +} + +// WriteAst creates an Abstract Syntrax Tree from the Graph. +func (g *Graph) WriteAst() (*ast.Graph, error) { + w := newWriter(g) + return w.Write() +} + +// String returns a DOT string representing the Graph. +func (g *Graph) String() string { + w, err := g.WriteAst() + if err != nil { + return fmt.Sprintf("error: %v", err) + } + return w.String() +}

;a3V1dj_#&P^_pg_GBeG`y5x`ITYoNYX-x5!X9GOpK| zug^InBBu*mqTVRNAuYk8E%qW<&=YjFA(-!&P)=puE6g`d2!%*I^hI611X@P!MoJue zbuf<>SmR~D0z)M-mOU+IQ>$*4&FINf79EF~0Gt4cS_=dD+6hWcru|h#=DChdFuy3p zX&eEuHdJ?3q#1;298pH%74chjAJIbMknj@Le?{!EU2Cn@Ksn5s8U z!7M}hO`I&iUlZ=j=bI@nVchua+K40DhBO!+z?%sYZ$Z1KSo3oL(B{1dr!fohLw%IC z>l~XSC(A$J*#sT5T(E|muBB~QoE7&YccQ^K*Fo^B-tv_kEGO8PTSANGT>+qON?TjI ztmH80LiRV3aQ{DZgM!jfrSwDHh#N5zyWH{53x(1h#>?t4(`!j=7{b6vxbF2rd*A^a z;=R)_zgdiM@k9V8W;_uRe#^n8#aT91c4GiR?Y&#$CAu*++45fp!3E&5enYj7W8)a6 z|4JwbfxHAkoG|fsg>yw*bR3SMV{Nki%sugxElT}OzQnMZHxDj z^HCHT6yVPf?fI4P(OVC;>aAnxyZOh%L(9U0 zr;QVF1R4Mr;9w{X6|=qKvjO~Q18gWA67l-!PDc?}Wi^~GKk?r$qQt@3wPQFtQ-4Nq z*93o+kI*fK7e(|~sIWY885=Sx;7_KRT#W<1vW$edj|x0NXKPL) zNQ?6Jw8VHpR?4FIFrhseBHyL=q2sXcav|Yw+9+thJ9-9&6IGn%+dT1fKJ^8O#QwLM zJ`$v_Uk2Y}8=net744dpEaH3_7IONy!wyHqHAxjcM#_hV4`VV#db%80rV7%9W&-9# zE}7bo)LE(tOKwr`eBiS9_!@FW?k;m&9dD(R(jW-F_`qowrc~R;F2M7Un)WTiW3ZO% zU3UFiJ3O&y4tB$U1WJz{e>1xYZGofCv%oKd zjdb7*bBG%iRsM{Ok?{C?c|Q&L$cl$6`h*=3W+q{y^Nq4tQzG)U^3TyD+s8ODJ>&+F zkpJEdl>q9w;!7oq7dLm+kob4|VdE$jOX-<%mU@y%Iru0B=_98>=x;9)Pu&5G!-Ki$ zYq5i2-^epKdDG1V+MX(W&m+}1jeXcoTohMM3IaQ*PKXhmk{rIa$>}w#h*;Ga!qG?} zBQM6-AV>7(0|p2I7eq-6Vkts}zK~&t2CdVlEQbh3p}gmZMN8v93(}C_fQ_{|<*lQk z$Qi&)#Kgv&t2`B^XK7ix`hPKNOmguYd0tpwXqQnRIK)8e*w%;a~*b#OC?h{0Mc zJv;SB6n%1ri?Z@Ar+P_gBPTc{Q9HsQ; zTA?Z~Z(K(f5Fae%vub;O^cKjZI}AyRD=Y{-=Nn-%>LbP3m+28Zg*#hoJw5bOI+rkZ z$0aRD^hIb5rMa*pF}2*){T`Y2bU(;oL>E?;(~v5f`%<`Acc3z3ra7Jn>@5Ix5O@KtTkUn|ln zzG)<(3V^ct2&JX^P&zlD=hj=zZQ1!=Ep7B*h-&kssXiSSlU%qGC2H^-*teBu-M>d5 ziFr5F)_K``*Pv3u20!qtHF35Rc`=<1DlrxJ^%%K#AX!=57rgs%68?Ho21G!F+3e02 z#%%7d;-vBI;>gM-;Ev?4Al(r7ggty|Y3nvS#mi}2u@OS!Ou}QVQ2G5dlNl|*hvUq; zIC6hCh$ei+lyquwek=lvSY^=0tUM)uCV$`K^p#fOp0p3=^f#p0vQS~A=A+P6!jiuJ zQ~^o{;(=h#AoLQL{Y0QnAFav=iZy z$4z*Jj&MZpY#=sdjA!h8)no;+5Fugssd0eT5h+Evy7;$@sVcLzxc@}ZPfSYZHAu6# zQ_@9lLzGxWh^59y;7~=tLco9{ryw@u(BJsT`yB#J?LX9?+JCY1k|45fpx(f}gKH^w z>4}xRe0M4N65jIkS&o60&`X#TV)%x_e!9cD=0{-7eAT-1RZbxxLbJkfDoSoVmEy?E zjfA^(knq+S&;?^`*G`-MphQ;dmItBJ_#>oHjNMfj_UoQmpn-9XhRSk^C zLfDjoEHQ$#Z(+KetdaA6YcmVORwr?*jt(RwCxS!?VFYk!nJlh-F}3ep!B6p85x5=X zLSw7<^Mc33Fhd6xV>mnb2zrpA$s+=5CE@}?M6jWwevEg+ zUTg$y1Zoe#f4S8C_{Qcc=||L+AchbZMRC!|>iEQE>_Xq!7>Z4m4MhSE=V2S83N-YaoJ_qk1N$BTXNez5JWax7*{aFH5DjR+Dg8Wd z_64kgoCd}+tseM&U+>EtraH{JD3haLmIC{rWk%dgTVJs$AXFc6gBn?e>ryv}B zNzAy4$ITxDl2Pw!sOWX6`-AfO|HRvy$pH!DsY-vL>$8TSDKI@B5hb^Y+~fOf-! zd%`&=ml!p|KMm%Z%Q$!`JSh`RK@Q|Mp6aUV+(&ZV%XFXu9qzj|XY_k-pSW^qQBt7Y zG);(Jt6Ph?LAzJJ3bh1{xvz`*ylArfEH6iQw*qH7l)_6DZ22RFdYm=Yv|eh1DY9LmXdX0o4<4lNM7kv`f7$%~QSUXJJsGOpOY>{)ZgUZv282gPdIVg26#GCw7MHFf9Nl*hz047Z z+*d|o(v&5F?-AT74r9k=&En%KIE*Y04{iqqpZxDZzIQG>4?|dNg`KtkSOLRye{zpx zY@=4hki{518ll=jf?VYfjyS18c>)1IR`kL!o))(}NwT7u|J9^gFPJl4O#f2T<7V9J zgHQd@*3j*;oSg1}m?qXDn@Z{I=_)K`5*o^dqbM5DxSv4IS33C0UgrCv?E;WlvT;J# zh}qzm*#iIpHq8uX+cb&n?*-qD7`SR zKlZx5zXwR2¬g@U*-RXFF}k4TDv`+)sse5LH%eiV8Zlet<)Znk}iPhLxFRq@KvT zNgDn{Hd?3pQv?G!Ee(EUh;Q|5?f;AZ$kayLv)!TEUFw4^&PwVwlpdna_^+-1N00P_N>H(eXM z-;$7Pyy1D^Zo%}L3&*W>>o(87J*g#}LX9C|WX<`Blop0UY5EiWL6bxKs`lzIm6w$s zR2$8U@7k!_+F;Sl-%AMIvRWv}*na$2B;@pUeZX1+H+euU&QBj>DEWW8#VDZ00jZ|X z6_@cA>``M~Ie8Y7-eXc~KrhMlG}GBE6(Nal*waje+tFbKs}l{^v~R+m9?@ArOAC+? zt!Q;x=J8WX3rJv-dnTg|W}`248fGdK`0CYr$P3i8iSvwNDy`2ogIm7l$>L`n~8hher|3(ERM}Q z$Z)C@kl8c6{c!2H5k0Bh!75^tJ!*33^GALQ6?sSua4CHkubUumkMYOy;&szgjFW$E z{1a+Vb6#&DT&Oh@Mgk~I02=~Wk>rBw`}9NUtcSp_?V9;Jor--v9^q&Q{jB;fB+jYm zp4tx43}*i1=YcOdz71=~Or>>rg>wmURyYU&HGcE5ncYWt zS;(F5m~G(xAi;l+f~u$>SSh|eV?W#_2Ao4r0~>>jG&7IU;X8(HOlV^?R95{ljor!A ziL{g@z=8PWMVgI&<#oc&L=LFYn|{PZKNbFUb=)ssZA-o)05)E>*21}x#Pfzv-fA}&5(}&uI4D5K9Q!M?%(;-$-pg9 zXb0Jt4|(5ITA^JpXX@@4I82HNV+YvYcAR6zFeL~kF!~S-L$)pP!(@g{uo?7l&SSZU zdn4Q$uABB=-g8$fb$Rpgu&?uwrAiOp#$w@2#7M5Dy6-7)p4r*h7)Vqm2N6pZC1|{V zSp3v<6It9(Hb)-*Vzoju+gHjPwAWv04an}+|FXm}|DRa^IuYQ_jt}aKrWN#8u!3ooXYIo&497f~62Fn|$ZrtL0agxy}rA zpeR5)p1B^jic|=6JLSC<<3Xf8v zZk+=3&EF7eE4urwen6$vSkcv!H(V1^51kaVMMrsur|Hzp#R%mSnd|Jzinio9=*qG) zthki@w}%;{0$ws+9XtMtCzl5ECo~qg;F;FL)rN_Zi&VqY3E+qekO|-exYZt?9v05qz;`z>M*?DgA_BZv7 zSGt%NBgsX)i9UFAWp7rJV6P*gr%5wFEHZs+8 z#Uk&&!FZk<5{1I-G$~rZsTtA~*!Pjr2&2z1{Q+vcfM;U*44Ffc`RjcI$1J4|BRZG2 z{qVB}4^Zlqco(V#XARV-4NZ+jdoO(qNk85sP1BqtaXwY}y!KO$aT^oJa}elLS*v@% zR;?{cnz~A_t*uELh0agMx(_PbptJh%jPXcuZW+3k1&c{l#;xsldDoZPOgYgGs-O5_ z_+aG|KC6mWP1)T*f)S@6F%&c?>GS0vfy!9Qlh zDTx|C{6`Mu_=lno9I*ja7c{N!J3;ua*j%8P>G>lpPYgLIVg9etn$dcI|QOepx+;C_9KKfyD?0=bI4FhTk9*g5W|=4%3+C1<9C2?&!Zt zeC;cL?ilpR6E%>kn z`{;|kyVygDb$)KiQP(so=k@r@bGbKWo-ZNoSy98U0TYrL42?zaETI>>d|F~9wz z)Bi3vDw99N4gN=3P`zC)9i2Mch60kRqvG};5U(~gywwP+yh{Uu&*+bI!rrM} z)>qM!$T8vau5+Vd{l$xhlf@^DTL=73Y$e_17lhBk?Zp`%RV5l%IP<&zi$8U;J@Fp} z>h-bjHxf0@g4I?w;|Qn@Hi|Wz+)>iia;QB&mz~RES)QL5WG4yW43KeLAm*5JfK12=mW!z|3Nl|IS57_BW9d zq|95#*mmE2Fildmz=$QqFNpG58ZHOgKA>@90 zpiRa&^u6rxPC642_tiF%7UrlI!9_GiP$x37*=JU&-Q87l{5N5_Q=MgLW?LJdZhRIS z@{UeiwqRjog2hajaRwjFYWw~qRUQVH%=G_ATQ#T{&WxI-7!Af)To%G!cL@+X=HO$Z zwc}H8<)cVT%u&M?EDmNI>J4gx5h=XHL7jTc^xIQF7i7c}-VINgK~o2dnz*-}7h-2! zaWZERHaeVWwxCz)3jUA{Uu5YC*GKQ%g0P4AUztxC?(f|IBHZ&H(ZG|yq-b#3qttl1 z7!lVb&6zUTg% zu+?g*tSng_bW3H0wv{SysNfY*A)$1Xy?Uo-9zLL%k0#0K&tjsC1>w8-oe>XxRf$23 zsz(YaH&Q+zdNTt(+|eT3_7T-*tn<4jd0S}cl2$!0x%;lv$ZZssE^K3M{f#igo42*x zVZZ4A4g3oGe{TeQ?vZX>{$MQEVD{;3t&GU}yzF}`HX*;QrPV=2BQSjl$Kk)5IjAK5 zOE#~%c%fb5q)2IKTYF%DtIXY+mQlz0NSmG76z*q2-}(5s@_1$9{lbaBve>!zwDeo& zGc`POJV1yxSo8ek!t59Q=f}YyGaw9Y1Gk`lFxzkKW8HhX`MA^UIEQk!#3Aw}<83G> zI_Zt+)R^hRf%K$YmuCe9IG^Xg5hORmkyI%RT}@TV!3akdOAjyxG+=_4BGS?Np)D}T z+jphKYo-rd^!@+9BRFQjLx!JJ?dyAm(#7PR7$$U!X{V8ZO7v=YrDOjvx7i&Qgb7jJ zxxq8P)AM|u)2hk%GjqQ4#Bl3_0Mq8UhTm{Frsf&Ed+o&xIY0CscAkXE#2Mii4^4K7 z15)>Nu#~Rqz!x=j%uQ16EJE(lC(;4JI>u4%jwjMfmOgHy*c@07T?#VKv*IxdjSN|tE5lg^S)Ol8^!7GK=E zHa?j3GQ(+v_{TN8t>Lyh?;f_YC1f+TN^x2co!J%w0N*_@eT+WT`@bXIBbk!R2@g$8 zP0Ac97}hlO3bpR5=X>HLyxAEhk&q#_&+75h<@oby`gC$TSs~+KAU1=VCZ1>%jpp|l zLO2izmvE0SCqs--YcU~TITnwDR(&ndOiHa*mY>mhOi{WO`$r2HWSE7`z>yG;Xz-HL zS84FuG|fHXmiaArJwVNU6j>N#cqFA_;Cgj?HtM;Hu|WEeX(EedcS8{a$!_G02Ood} z)ZS7IU2fgYCj%Ik`vM#QwO5g8OiK_nlp2NNFl3HcRM&vnu97r5Bk4k#Xzc;uI+cyI z?F3*{qUQ=Y|EuXtLz551mt-qgGqvHe&f6XH8ONLid7Omz;<9chTD;2)V!gZPI6Bw` zJo=wn<7KxWky<>luo2Bd_tRpi`j;8To@w_g*rrrR(juI$-5T6k#|rrZ7uM;2wMG6T z@|gGnJW5)oh~G7J$FL38N`AqYKwd%iCjVRT!2|k8+sk6C3z^gC%AO=u3{G|<6;NY~Dy~B8 z+UJb=nJB%_j46z3-UfeB(bY_%egEkUDp5D+MawZH_T*x*ylxw3=aJKQYFmDmw*XkVXg$&|VUw{*j@W%MWogeRlB*fTDSM*zcdC*e}Jd-m-@e%ubgF$f$7pb30Xu#F|6%kVo(Hl zDPknZy06R`Qp3l&?4QXpDD!OoZEFB3^xtgFf4M5ECY{Gv4)W60{uV(3+gJiwggp5D z{o&z(BzY=nx?HK{k`jpkLe#&NkY}1=39}=SezljPvv#N;{wI6s#fnviRyyC zyY^$iQsVff!dceHUTwc&f8^P}2epOP06NoGBCHSNE(xJlJl5J?lJiKxf1oI&-*;h* zReZz9!YdH3oKPDt>sMcf1_nhpBs~t_>Wr0$k|=9nkkdzC;r7705#4j~Os?WQ(p#e& zx|`mQtpX8%2EM}j>`=&f%-}++DeIV|mo=Bj;24$-2bSfINKo6q-2esLU|xH#rj4Z7 z|FQqC<-H711(h=W^{WB7R_j@7O=#oM3Jllp(_UpI7+5p9pY2xlXW%xji8bFp(m1 zG-tO!4IcM`9XT!q4F7HF6f}2M&J-@G`+{t0mD%(a z&wv`(UK4QXJgtB+fn3R@kjt7G2KeDuaOk2W?|JgsM_o0;7Z_kCxaG4#u3x|`t62x@ zH6a4b(Wz^WVoa}nY}7yh7+&f>*Zm)tJ1$G?v=tp$lC~tsXVZ`^V%kEZ$VY_z`yWcN zga<%=esfv%ZnLiuGLQ2qCha?LL_tKqP%NkD&mgd+z6Aa>HLp_2Lfw8xF3UkZ4CCS` zNyF^#QkYy-@Iw<1!r$CT1G+iO!kNf^7rvXBA-TZiuA`{0=S??B?roj&tcNIz9>Zd%kmsjJ7^ z!@bO2Jd1Msxw@_wk134h$HRpC>~n%cGr*HFK+>!cZdO=t|9?b%by!v3^EF(qq_lu^ zhje#$hcr^s-HmihN=kQkOQUp2gMc(hclUcPpYQK^pNBs$C-$D1y=KjtIdRbt7?|8X z9&v0OG6yleZb9(#(|#_ynetDJF~?Y zxY6b5b^ogLpHYHZ!;L|f3~DSRPI4zJUO`BY-v%wZpOb6( z;+E9v$OW~v_$EYC&@vB5u2IW0{9X*2hJsO_ePTtGa<-}v#=x>-jbcAk^X#OzcLuoGSYRAv|QfYCXqK3wRrRA@U6S}UaZ^Z};KGZtz>Zr8TX8yg$;k&;Umn2=u_iVOE% zoNF>(Ug-@EGks4J!FO*`F>fAlZ#lUr7gO|F@1e5V^f4trPoSam7d1Bc2Mx!lq4a2| ziT^ZSMyqpY2Xmr;uiHiAM7ZSkV0xZR{?Cj;S@jdsk!c%5t_u9+NeMf})m!dhmgkuV zoG~nIJgo+sdLO%S@2YG%=Dlug4O2kW47b;|W&#a4$8B3@nk3HhL$3(0Lj^TO$%lMZ z3!)RDbWXWR+4 zXRyEtM(@4%?pjp(odtD3O`ohB9S|ALL#3XFG2e`jlkuKHC*eDCVrrsKHK~?ja zM700$54+^2ew{*z$r+jR?nH+DEvDw}%GiPAGD__FAekb=& zsHIbp%Uc=!HC*^RftI&YJv=;RTF&EZReoW64|ES-AzMa9Z z{c`4KhbPme!x?za8Z=(?hPHfbu?0v*%CciMkD?-)sPeY?w4l4&^!pBU$cgh{)h&n8Fj1yF?p!3M}qwq1Jwn){uEq&&el(MSMH@t2z? zs`HeFrI7D`6OXEWY4_z`cF>1L*in*`m3Qz+G4yR{)05+%dA$elEw^s;6{#kXPgwsL z1hmeF+ndVj=mjTPQUqAIjmvg((ID>`Oicp%kj+L;_oW|-r`NZBNqh42-uYrLnt|c6 ze}|!A$57KhTaA*` z6Xg-{i0jVa%1wYozQX(;WJyQ6MP?ErNJ}XxZI+>rW+G^#^XRvk+~aYX8dR%}lk$=! zxN4=`Hz7sk*;BTSb)RD()$h7-aO4l7zQ4KV+`MTY+9N*)9@yXi2%fv7=EHheSN=Zr zwhwOadyiUIqw;k>-L|zK#Yk*=l0XU9$TXf^eXywDBkK|$NBUS|M~KE+1T>; zmP>rw_u8_b5=xy_UGM|il&S1vOn(})o+R}CJ8^RnPEYO<5vJpd!hU15xig%^ouzOS z)cx@h{0zh?{|JQM3$AeZ92=9xdj+`49n&b;skCThHI?Pcg7Av=8+tr4I%3xUR%KU7 znCt*Hys1Hq({AsYrCoROj{(xXko|uk!zi$uV`po+*d`9AS;G~ zC!i(?6khcR=-j}CS$NJg_J4ypg%-1RVvmod#_1>JN!@YjINeRlk-Z9JGUcLHRj^o) zMTG+D18Z>=`2E9E26S3gC8sh{Zje|VC$p9uiS&VQnLBsIDfy?tm7SQf_47$%kJcsm zH{aoh(ZE8X>hi*W*DHq2>UzX%6seu=l2v7OH2;y2Iaz?3BO}p$*-Va6wWdK#@}2oY zslrt(n`|ItCpkeqT8^jQ#rQjk9{d6P6*AAYuZthjl-A7tK4$St@M8I&v$=ci7QT zGam+o62!X7Ip#?vuW(ve7#3P8gCm6j?s_puyUenJ+tN2-2=1q7GxP>|F@m! zHT!N90Od(AfH{IiesdF$47`?&=-LWh7)JR#-rT3!-kN&8Q=Pu)A~Uc$PrKV^!Dw6z ztuqyHBsPfDtEgd%yLH)c$WP$tKNB{51A06%9$LLgb{!;eM4_SAS!Y7^0k)GF8JhG? zP<4l7;yKg%CQ{?xP&56du+zBK{6MIRXwhBpl;m3q{qtkm8i=@j#X3i<@xGs`&BPZa zni263jM9L*^Ph*bqP-W~Xw4*dEgce1(wZZ!-%l)x$Rhj>0+1LvNOb?{S}uqQY36HQ z$B2TThu{yWfy@-F$(r_w-{T)Jr-OK-jD|LX#$l@sqMs1XP+C)NreEdnzzH5B?38gO z{y@JMhurenoL7dO!zmV4=QU}v#{6-g!JmaJ%UO}&=XLjfwi!0LM95PO(dVUtU)y#( zBMy%}8>omkxA5%xaBu+yCYk90ID1uvOd6Q~sF@7mj2th>rC#}AA$x06o6r+)K&+859F-}Bm<;%%Rs`gUL-yCtn-79E zFrc$l;}d-pIKom%FF3BD2BIZF*84{ zT>G7~5!%uXcy^9j@{ZL1GWleGv2!ij_M~lsx?px|*eJH^TFE2G+5!dUI2SHj_y)AI z+dTTyx}Sj3-w^=lEZO z9RNuawhAh=VVlq<%PRlHon5n};j08%yoKN~dPzfs@$>gs;QLJh+sk8|N|A`@53-0} zOn;-Pa1kQ|_HQ@k21+{U8gzYgoPJgT6-nc;k`t*KFGoVizYDK{p+EfOT}q_i{x4%# zQOxu)DslK<+zy7ALR+iAWt+Je6FM*+tLv{)RnCAgkrBdnwmwQ{u#@4l!wy+^qjK^8 zO5w~gP%r~_dH@{$af{R#u(X^cBpbfl77kxUNxh8p7-rd9L``$I#II;W ztO!{@Ptav^POk*%k=m*{U0iO+r}2;~$e?cl%^`sCC<}L!^3Y$jt$swol|dP)pj1EQ zC!>S-$*!oOv>j+*ij@lfQZuY|_f8@D^O3yl#9G`3Wi0{=`0~@~C+o7Iqi;-ztTizK zJMK)s^y>oT9Z(>f-HPro@uN1fQ@MFhi;MiSbnqieY7c4jJRFi0G~~Vy=x84=h9d6$ z7{Z}OyF81&Zr$?A!iYS?#wX*ls*H0GHDe9epC!PIea z=;jft&-Z>8u;ymBguXqNQIhrR$@%|F(*l6DvbeZbE;0mab0GcDR<}+gRsFEPZvRJ! zb7r!Zd4%@qB8;!|DxM6ZEa`tjlY7k5UPrJI5=Eqs0{7)KV^jB99umY4NK*V&L~|ATfFy05nFOB8d~1iqYmNfx zuUO_>h)L7{krfosgd-eZfW@*BB6z{D9XGj1X%}Dc@Zc2&1F z7Goou$zz|qZRT-~kGk__2x@x!aHQ2R3O)G@`APfV@2P_Uw(A6tC#_HvCflpoad;A{ zoKmvpG2y2*{oUcWu3e{~flG1;1Nli5nZrd$2u1SrUS`vwbum{{$+Xr-KC!vQz4iA- z_t)Zsm#bZ&+xOeMS0fhpzgia9?Mj~Ozp#YACmMNB9|#=R*()H zEr1`sWCR7LQT{Kyc!3^c4m;1M_Uucle}18?+=*k^Jm;VcyHnUh9Sy_Bh9D<@9{9gL zAuJ*}FHM~>F*9vy?jMihB{)XNxAE?_4qRs@7U{UW2fq|6jOD0O>5$nd4*G6TLHzT* zsBqpmEz0b3e_U(6Rw*SR>(6?pz6RI!#a<^E>^}213V^?81p`m+vqJwABzz*YUtqps zJs~c06yHY`WHu;n4)F8$%g+1ePq3gCb9A#ISk|AfEI}}N_d|c$a>ugfbbrWwJ1Nq< zA^7Ce94Y485qI~euUuaC(IiUjuk2G1wF4?sx-&OH>*9xN?d7gkoeM$8?lKVGBYM3J zu6H!Y_i1hRSu<7NQ5`6la^KlKK`Up44T0Dpi3Ys%6e?YIsw=a`sJc;cAtCD`=fL*< zmF^fB@x8>YnkbIvE4yL>20E!^>XCs>IE0IC*fC7`w?ai(@}M)NdM>C%-AkWZFGai^ z2OPv?=rAa+1Q!HQ%6QeZH*8Vj@))y5Zg-)e0R4A?gmuJyTf5yBkgcEi=I;P?{6o!e z@5)$#5#yoaQhG>c-|RRF5V1 z3$H2N*Lg3BJyaHfkIY06V`Rtpu|LX>XYGI3`kiP0aL)Xn^brv&xrD%DZS}$*VL)5+ zoT5ey@o|jWwg2V)ffyDE{0+f#*f-#@&jI*NcT}eYWe;yosFzFwSj2E3OC`(_03gu& zb$6t9DM*@YnMVwllXgDW8WBzL7;3-caNEO12Sj>#z5R_7B7|pjR23yb%O>65EgF%w zUssSGs7EYobk_YCrN4e}8fHttiq8Lg(~)W2ei9|$Fz=PyWu^-t*4N7MM%xASJ5TE& z#;tBVeZ6wnK7`BKlM+lmf4BH%FI#Ra_-RMygt(ij@|E91-dJAP-@scyr}oRD73Oy% zfK7KC1P=`-0Z2m3Eo@zF60mWAZVwk$Q4Az~NP51VVp-mBzH=zWx(c6(m&nfa)7O+! zuw6__QH|f&{XKHEI=@qo`C5lViv)Y1|H?Z4ot)j5cVuPLlq5z4l~hTi{ZnxP)5z2;9=AfPQU7s>1Z|6+KS z&L~E`wCRJENG=GMxELraU%OmctWIN%RvFF%(hb>9U6Y-Nf-w(YmBk4zMds}_XN0Eb@ zZJ-3p=+OGly49R3V?Ubd*O4 z^ub+4=3|I8*c<_iZsp?sh{UA95Sz;qR0?@JwB&Ae^M6y^nL)xxrS7EvKC8)UFnHR> zh0)aK8=)=*jcbgI67nuF;NW}|{j$sdZi7FWsJsP5!Z zWmYWzf{gAY1%3DGNm8H{k_jB_eJyg&?IU8pMvZx1IE^A+8kb-!Y`8^+-#|aI%mJsh zW+ue>HM28`OAvHl33WM)wOJgdWhOa78ve!T-bGQ7+Iz692mff6ZsA}wUF3M}9OYz@2mv(XOTjXK5pTqZV z1jMNLY?{?OaEFP6=WW4akROGA0Fl8r=-k~36CNF2?=}h1DnC8X&-{*Sbh*6O#GKun z7qZUH_hx7#`8^^xgQM1St9{OO8%cp)I)Xduo;l_)1P&{cRV7-PzW#y|S<*i`&>j=Ofmg)I3N z#w}18XZQW?E4LIgb2S0r-yvK5<}X%egTZY7IQP1y0Of5CSF;rkYTLm%+4B4R*P2~8 zHuST?lb!b7qEy~&XX;Xj7`Bniutu^CMeOATnzq9$W0NOK!Z9QwG^0)S6kuL1GkPk{ zTZ(?gyy+z2X9v+y4cJdN4ICAyl)9X?+q_sg0u>|xB1!;g?tAfoGvTBUl}`w^UWUWq zuTv(2v&R#eJk(z%J+B4KaKwQ0&QH>J+V?~GT}>^iO@{~JvIaAwaj6Ou#w0&N=kzh4 z^BapkF?}fL1wVm5H7o|5Lp*~d1Am_MQy zo-EUJE!(f%h?gLS&(&)Annc%F0A%dTH%L~saHbFlKtcf>ftO)-)7ao9bGdRE!al*z z1q=juANf_Rv1^?xGn46mlOC<* znXBtrF;rOEagv=XC+2ju#8xu&9+(pWyfhk^f9vk&q&izn@L=GlRSbWzqAis_KWb9U zhpN{1=BX(A;&32_c}d~$ui-5UC^Pp{l2WI>lsfVv!5e`n8O4v!N$-#V$YIm!MREVM zh__l=HeS%n-Fk3NS~i^bN~eo|_22sTTnrq2jna)c2S+q7*O6C5)(u^G4YzSY{9Kk5 zuziph7RG{R`QTO@BQ)5>vr)i--^fs?I{OVOL~SgtabQmNJ0QTB^yX_|K*o|&?~7M| zB?_6zp_6t0eC(XRvu0Z~(@0+fCK#mFP3={mG9JOHzmq_JbwKeoS;8P;Z!MFJ=JJp~ z!Bhz@bQu{XUl7db8MH40yuSCT^0v*2xpNb^+>njN-+62R#8Nju*n?7Au6n?S!!{lB z$rR_`PmDPXZj;aGZ+qng$<~(beT-3wsuBz+1D`OC^H*0vH`fA`f+w1vW+3u{}$#AbOis)r&^~)q#|aj{wQE$KX;=rF@4xkh-|hh0ZF{BI5zOyI^*5l zUEWn`!Gpo6@n{vw@w)W&1*Uu1@lBV%=|tlr{+Jjolq|A)njq@2GJUdjOng0CpMXr@ z_xWN^*F?3b_iVx8(zw2j$yL*rz6K8ZkQXWK)Nik-UJc{N#W|U*O0MYpk`_n{`GEH# z%<|WLjzTsQg`-+>Ph$APl^{j081vzV0-)wf#$iOGvnZ|&**0KiQT(F7Ok42Ej~{KT zt{H<=P+{_%Wox)?Z92Zc6&H@zcpTs$#yNwD_SFmL_oO*hLFKf9sM@b6nLVO9t@w7- z{!hUKCH5*^H$E2nWP0_?Oj=hzUg?fdOos#)DT%#N`?vOkzmU60r$0NyR_IO4(s?G= zjG7mt%;qBg_Y7-98Z*;$@R#{a#QFW4&a!=UnWWY+XSl2^gM^Bx0tGCb3w0NWG<3)Y zJ5SFR4glMWh6{?n6gRaT8XjafTh=&b`k`p-?I1Cvx#jq`P}Q{r7V^yPU`3|iIi3|I z#Zvcq6+!w>4cf6~Z%f7YrrQ3YIP)gUuG{=wkjy?-?+RvTW5}}WEK#GqC*`J;F+FpEWN& z*yC9ggHR)`qQ+!$UXQeH<4}b-{m{F3XNpI_3L zY$^&BQ4lcBcbI4*Irc4D*`^jr9Lo(GnO=RI;&uLzt2Y(Bj~2m>I@rI#FUiyKv8lT- zH=UHB5Baa#I}{_1UnwO?@u4l(_D_Wqw+ZZ9kL_VgK1$SOJK@<948XOiz;^99{^#`= z>^B-4A07atkf)zu-~5qHY|iMLfJvu_+r?Lj+6uL()U>TNnn{2tqff^b_lKw590# zx|(y%c+&Eou>dfwhQiV>GUA)J?J>>}4}uq8v&#$=w!g277W{+7S1vmP%z|1H`}e}% z4k#c2q;T3*u&V|CizfP@s07*s@`}jND|22G+fFYNoP;r=QtNRNP+oms*mQO z-lYLo4gU->IvFojZ8&+^b7xB9yBwGnXDsk-%^V4y(WFDKUj z&xLb}qGLhUnvZegSS_VTt_x>zsX){HJl6yw3d;Od9B>OxpxP{GTIkqo`)b|FGQwm7 zN+=a+wc4hR?-FEyQEc+cI`xnS;$6~#M*bsfr!&h+0SO2)GZEX5f~O$6|BKWFaJE3}Arv^E?Go!12mo+6-8e>od_!x`N?)8-RZz?< z*8NkJegx6l9}}zTB*6ax5lv&C3JS15o#3)ouM94S8{<=a%4=9;6z$-F3ZuIQsUJhl zloM!kB$TEJD6_X`_svxEqNPep!ql;_VWNAQo-!NkoSkz%eXgdY z;&%Cjh~LEWis8V}*WLUbL^o4qv(7WssZHRBL01rp_LkOzPCSLu$rV4c?q-`mL}~MY zF*yGLzQMg~GW5^WvAoI;liHSLA~uuGuBZWh9!aYd%PenM>`Z>y2Pds;28bN1h8r3{ zyD)S`euiiIX=UCHgL%vZ+jM3#b!NzXrUi+sU?m%evjcl?MMiH{HDgdeJ*e2!`r zY_ZDC+7IIRUo6v6^78>d3WAq^pDd3vK1~GHp*LT;SJ=t9H{J{UxbW}~<)EA%g`f+P zj}dO~_j>~AJ+HA&e>bh;>uK~1-uDvteGq=!6C5Cv1W(XI8VR*!sF3LDb4AiM{>=Qx zM;FLcYB&SDs|Z9L9V^_cNr8sWseC5FY2_fEuT+$@n}*G}tgAGDAeD3_k1Aq83muR^ zK+YLh3_}*0A%(01)T)epeF+Q0Lhcj=z$k6hU`=$}dY2hms!X5KU}3DJAoGK$s2mp6 zd;*1E)I+v)%!!UmMg^`!96Xt)-W?uHJ7Xv_eJ{$IjG4UIkIRK1m~T zEBkH!LE!*^#8&wmgwF?Ql9F;_!nCJ?UG2jHR-Fz5t^S=*XP&h4Jg48RqP?y4tZpnW zt#VnNMOgR5&;IRf``PKq`z*s|G5xOX4bhLoye1((5P;+K0_?H+hZ-x)+7JJNFk&60 zo0RS6ntH|e&MX+Xr+#ozHyA)t@Mu3a0QqML3w%TUfEcQvb!HN!Y$mwzYY_T-{hst) z07JL!%tZUBD3UQeDR!=N=0Wh67AXnG$513+7ZT zaArXI@LpUP9DrT_PG{Nx=rSsUO_{TjSJfYim#7UZ>#+nzP5zgYHI?9X9gL3^A6|N> zo2tMAu4Dx!;7Y3gz+=;>-=_o68>yzfO=FH%*O$6IbU3pTFYIzchHyYBUK%v=8!#HL z)pbUl3t!_wH>0B>3>8#9Ce2IYd7--Ra^5NDPeHh)XRYn;PMhBh02{?3EgVlo^GW~F z>aC6)Pr`a!s)aOa1ZBWJ7FyI(0=p~6N@dbDcuwj{7`g@pwZ zqLD_Sp#|Xo=8BY_q_~-(t9v%sdn}!mj{#Il)N{J%blXBA5|~kZq*1n zy$&a{2^g9VJ+5SS+leW+v2TASprZE|g-?K(S$x1LSAP5P8dF38;q$x$kZ__cf%^~8 zz^$#dVOhEc_)8>#TGgYZs-5yo()BEUsRnD4Km|*BG=o+FP})fV{4@mO%V4TO$(6`~r_k{Ft3-bhcV+TnAGTmt7t3g45B9yrYg8=|wn^Y}=c+OXC(t88vna&D>s zdb@59Q2fmLu_F^tjbrW=Cn>(t_$l^U9Bz!(Cm4auN}=s16Ys{^KuAq~lFVVDl!x6i zxXFjt&&0faiQKaTZ`Wpq&EZm z%)x80e(TRyTtX@q1T!!xpvQ%O&!%s;m*;&KYu$xw8>9fN%M-$1par3jviya*DQ{7R zZl(0Zpj2W!kzVs1d`{i_dl59!p<@G81)`AJp()jkJq`U<2q-s12gSR11Nj7FMVH~0ZPaPN~`S)WWjN}V&6SqSep^+))=#2O3=kxEU1pm`~WM~pm|Y7KIaee|t7 zzjZ}2H=6|7_0RD|6@dr3K#MCN(y#jBx>=^0G|}2?wQ^V z?fePh0792v0)?pwXATNq>7@^p)E~aJ4|qvXj`u(CE$t=<*vfwOxLE112;X3(fpFVC zAR?L8W+REAx!q47q(tDUi-MCQ&WSvLk2y3K-{7I(RoV!Ajkt$Wg@k-@wA~@{S-60e zAN5Ise+nN5oGYB=W#eAd!66dc`A=x$@jTv%Ja=r=1(OTYv*VYv%@~w`?Kc2iwQ6-8 z+ci$*RnC_!guxf=sCHWmmbU>gbY@?uWKepO;d>C8MMyBf!7dLBc<=UuwL;RiO~37? zPukLa>lla!uC6k>mIq8-Rns0~!Tc!qH|I%|*}H0lWf34C)m8DYa!*h%-XGmvAqnzNCYk6s z-eehg_pF%wS^dyNW@9_c3De|cJ035?UQ+^x?|Cf9KKMs`c9QUXcKNfZSa=y^6s#~R zkgRL;om9_w;+lb?6HV&1)g1NE%3D7cA$v#J4 z%UXa28bBaXQ1X@)s6@Y)^2hOdscUyxeCTiVPb2@&YNT>1VXPyqxkVqY+KJzEos)Ir zEBr};)T~dE_Jejh&t))enGPD5guAjv^y+A?mlhZ-nuw|NP$4I-m+rZ70wsV91~d(m z<>y6&O-XW+{l$qB84MnB7B^_j1%Wxdqg+&J3}w37=bU^dHzGp zk0=X(|JV(7ZOd_V`vLDw?gelm6)|GOl#whp@<^afVc#5V1(>F?qHx~*an^C6_|1@C zeqK9PVmLFfx#+M&rT=I%ynTBTOo$bkQ~dsK7JyWlKm!cOjf^Du&$3s<{X(D+zkyg~ z<}Kru0GpHfU>fP}x>(W34rC0-8jEQl>ka)!A-aml$r3QwMqaqW*GS~ZG;Dsftd0d% z&W#Wyl`<@euhA`HY2lzVG{hZ^Vxr7A%2y)VUpW&$zMK*MlG=N5_volnrG7aInVNDi zp~K#)=b1%dpgP4-aIkhLv0!g=+G0IQo>BtBzzTDLrd|?L6#c}S_m#g{0w*KenDVau zAcVQ~pxBdqvX+b{F*E?R;GPkrd@#WBud+jZI_5D&bT7mES}XcN=DhQ(4sT9P$<2fv z&|zL}tAU+<7&G!!OIyuePMH|6@b{qf5!BfyUU{OwF)E;2Y7R*_#i|9YLdxnh@C}U9 z1v%tL767Dl@%q~OUEa^9Be@J;FBiXNU2lQSL|Kb{YtQ3y+qi(DbLl(jP{Zz}u9%HT zA#myiA)LzgnKhR`;4S_@voD0*tnJ0(Hc5WpKaokZwE4*NY`lWOi*pPVZ-dF1-J~(} z`p;Lbrsl)ib{C?xLSGw-**IGKeFS7&?RO z#ubvrM|mxr5tEOB!2@!rC(W5loCC85js|1Aw+wE(jQ8*$Npv*Un={8@zu;B@jHl~V zs}0lwD6mPS7YU6El-Iqk*HJw-z{QEVncit5xb%3wsk@EB+`sLg8bpI{f=do4e?t@AQ|x+bEH zTvxVgWdaL|S8%mh?zx|TU{YN^*K4sQA%_2x3iZNa$8?fs@Fz7u?;a&=l#zVwse+!t zH%lFdxK<@)QXOp~+Fz&Tq%4%k>->s$`LM=F;@o^Nr_N&QR&(xBd2i{eE?rt7X8PT; zh@03TJm{KYLej1^4NxciseicM=OAG9j^?@|s(9du{Bqc!-8`uWjE-K5zguvbqH%?G zB-T<@SZ2JdM@f4dJ^AbWChoIP+oagzc=P_AMaSc+UrJ`0n6ZaFL?Ywg`G2Ye`Bfd2 zbZuZn72Cn!dy{#H8pm!$sb4YmaSQ~z5NIVrf(;LEzRsB>lEVcwe~x$dXY2fMOg@SG z97<0hS9#Mn0z+9lgt0+*xk-mcuS4e!ASpkfLN1^WktMuXb2o7U&N@f5>fceW%VSK; zXW|ZSkBEeTDEM$6R;xf^r0v!)1GOUE`RdR3nG}@6542X21a;y3SR0hT(m!om3ugkw zK(_w!bdeb8unBnhUNiuv{aKz~xSxK{id(cVEWFa3gMyrk=!{PDNu^FSp5KonMZE?V zJSqXCd!6h2u7JX4kaZ)@GKDM4$!u`3?JqqyX|>?il;Rq?Zz{?65rtP?P*-CR4)hb= zAv{kJ=LDax&P_zKhX0410uae6c&h5WW@l%fFta{9$ZD9GfS~a)ek7&PmLY&TuF_Gw zGEIBGZK20uzQ_Ar$)D`CZDr#O)S738tEx#AJhvYC7%_Vm@>@o6F9 z;#}CxGr0$B=6`fI>b#e9m8{0AiGaP6t^Hm z{-ef#Zlb4j>#S2JC-ALE2J&wzC zd63UOAF-~9+#^7MeVbmD-&GXn&^r3rP|e)1T~O@vHMs*&HRaWoK-=9BdiP*kLs(BN zk4s%g$T}J~lw&E6Z5}I*TA9?vbPkLxPs~m-jAALl0@F(fd*wnhkmP*~-u$lsnXLY& zLc8S4-KA~CsdFrccbI+v(BCI&xN$8P`OBOjZWEX|^xUr4Nw)02(Ilvlj34wCMO!U9 zA=a&V`hic!bRjPO-N4ToB-3pPDzq8~=m=VY%-`v@OMWix#K6iwIjj}5H{4dYXCGq4 zK|%9jDC2|gZ>+6L>hZ0yX8GAZU1&a*G%l*V!$#S&a>2-O4p zli;NZ?4qhlwfNx9R4Ujj@a{oj@-Y16*sfQt_VE;Zaq16Yz5&2o5gytg;jV#t*z`^t zBsI#aArgOFR@^xG_(DiIjLeyeTkyAtP^ajfzI=iUmYF|L9;FyMOBkNo7)Q1RCk?y< z9+rhe_Z!PKkkh9VY_){mB&;X7n8f8{VWOeQRj_{C#L}Kx*)Dq7USOfP0&ks=_6SMs ze>l)|Ix3R9zprWUh!-t&`4`OogeRo{AvOpUHeB_iFTcNO4P@Mv1_-bi=1Mhn?Y&DS zZT910jeX2}5a7iGsGv%I-zmTcKl;!Sgc#~>>!t{Z%|S1C^YBOi?pZ~05h{;BR9E4V z>AisHg>IAmDF_{9kGKNi;NMa}h1rmxXWXEdXt5l{V#wg%Gp+%eWLaSawB5|@Oi249 zHYG-j-B2niWJBkmF#g96@qyp zhD;`*n(V@e9Oq{MKi*Aup9zCLN|}$dK1+#ruAFt_0RmnsYKLL*ZIK+k4vgilqTwxp zNaTy)I@2FBfeW<`;bguq)z$MVdXepaOx*P~#LsRU(a%^!gQ&>YP9H0PDlB<|_8Vt; z!1Kk^Oh`tpB*zxDT~T7qKQJl&Jg}@s!8n`}U(?4D$w}$bQ%d51UnoX+Y!2C`*R~1$ zl}A+KTAAOo_pQUv$>cMJo~v0_)lohxWWxQU(L?6>Hq#?%vQ22^H%cHUu4^~0YphG6 z#J?lFW-^}gc#jMsh1X^0N(Vk_g8a?+v@&R*br0YHQ9A?Z%HRjTb=Zr(WmUI{X1sj< z&3W$;%O5hC&P1Pc`R;Lx*-Kuz>kj^OF4mYRWydS;;nZm9OOG*L^@qVL86uzrv3C$;xBC72TwV~}PR(4c3yczmp;vc9KDcKK4Je2u zbynINdOp02uVi))s3%1e3z<{NG&cxqi;HNR%28En{e>zlq0yrWNl7G2REP}3S}dZi z?$nV`v22B>^+W$g#UO_iGF9~B6S~O5oUJK9nMyl%9t!yR$#GQKAJs0eNT74* zAKwhX1Te!7;uQLEG_|`pzqcxsyaBx({EHt-D=Ox?mz~HegrGk84xc-qIy3!QA*WdA zG<5Oj%)#6$QfWrrU;)wGLM3csOS^maa5{fsbMe5b5>ZJEPrIg44a(`cK%4&&)e7g z`*$Y|YuW@a8{pA1uB3{PXREBfJ)GMfIbKpGPgbTE1peQy*EPaS<`&5fU?%MPw3@Ml9A);_3yCCD)V4T*rTO_~3=|CO$z=!=o28A)Y6@!Z&X-hvnK0S4 z5z7@YZx-`@@l8cagoIdM;)PKpqSwk>mJy@hZGGxN&4V37i+o<4Tnk*1L{!D7ZB}2C z&`+cMWxkhduHMwnX32z$f1#YXNS@H#j6>M;s}5{{{t+(mcB7qJ#Uzb+d+bN5**FAUdai)yweGyca^It| z>qL9EbSGu(L$#b@8G-MgYgIYNg|x3yxMtIk1x_Y@?2m+%_;%dUZrq_z{y}5mN_$~a+M|6vduggsJjL)=5rrNLpx`+f5Ol6EO8>E&TcaaYUnzn=) z<=?S&LXoIr_1$g^h37J3+zlc}O#Otqs&^J-PSC_;82+VO; z{(0fJcHu5Aj=oLt^>KeJ{+y!os5X8>MfdVo*!54q8()Tmb}{-j?)w7;^&kTT7U;rH z7`wi57NzLGICaCTsoctlYw;G=Q2YAzU8ix)yLGY1nO$}}P=`Y2!T1@LYJj4;(pkV51x?t**{fyQ3Y!DtE=!2;! zKp&7O>_Ja0bu%Z<4TsyARzqw{A7jP?-N0WF+g9J&t`|+XZ*R7A(|4=E=2p zk37W#dE!hAe<}Zby>{PDEeZ<2FciivIlfe6!7qd3;2ZvsGG<@yUPqQt1D|nm2ECt{ ze_x<`oEdBPvASd7+xa=Yg;Y-Q!9aYa&BEl5B-{ALgu0_9`HNYC`eaZNn4g#rI3V{W*$~4m@2HyJnnBd2o zMvbI)1oqg!NS7|CbtaOZT8fx%2onmiPwqF<_tjf0UEE_61pi7=x|f^^cUyy4-&_A_ zaya( z@A(Uh>grTNvnbKT`)|poe^+1Z>+GZC75fuDN&|sT6J+byVs|(u_507aa#%}hUEqlM zHM{CrI=3);&QS=I=J1Lql@Z?V;wv0b)n5=VRp{&VXgA(@CA`DBY)4oeE+D$w&#Guh zZy#9A&N}iv&p;*AEnvJq?5=1~QUn*J-pS9I5`sUX?|NE)mwlHkl7k;m zbSKs{^evo)m1dJH(=Nkfs6&{SD`2IjP;9x=BL6`$BCb|gDZz_^I^fUbul13r0D;zx ziZ}Kpgl!nhX71Z5@mwxDbh6FT?cXt>aiaugwA9a+GT0@_bFtQ@85{Jnmwu&}8IRLS zDU8~dH(*l*Y$@b0ac|}%$|+{?&Q7g7RoH)kGyWL`_QH!}=`oV5$TG0JhzY*GB40jv z%adc^CDkTiz>aYL5jbY7F_xC9&rQ!Mj_3dn>)dDbqh3%RwyXz*9-bE3)l;wg zy9XJ1m&a8P@zVa4+R*q5u>6m!VVz|;t|^_rXzG7!$|O|myn!WLlFHa3NmXN< z@KViJr+Bsoftdv9Q|wO5isnv=jfNwK250}5>0xIBaOvHF6mgalPnXUQk&ebpa;6VK zrj9?eVjxR{eI|g``q?MF)!y=^IfMJA0cJ)jc6U3#Mut=#bWXTES+qZ85L#+xHC7FT zh{yY|x~u+{LM57`FI*8XAR*%@%w$ zY1Q?qPNt)_<=`%h485|GXCFqeEL;tSq^7el-!x<9r$j&Wu6$QwxBn=U09Fk@zWG3r zoQxlWmUd!-F=Ss8Zs=vVCrNLF?^FLeM}@hAy@=u*NtXFKk}~CWOpP)vFWS1e7K#-a zHHtI;F!3RvVFh%6MHg3@#{gI zxr~F1xAIMHbF4cj!80O8VO*oY0Lj=)tyKV3$#<{}oS$vwRXoZ1iu z2U@_66Ej*h(9^pfw`msp0=@<=-qZ!(wIiQX>op;{y<0s9N5X|Soa*I(C%Z#6QN9X% z;qxVxFiZd7DU0fAEm5NSO6&SO^=u8ltflb)`Zj|2IKPvAKH*H5dl#4bSQq7| zvxrDxcfe{|r`H=Rkk~a+9`$h9I1Z2}f&R-*uVd0Ozg3G^*C9!br^C*9_4b1kFM)o; zfJ698kKib6?0T4!pC$Os{j>Hs_WPXm)v?@aluD}q0{m^E7Zh#e8+NN{IFbl^n;auj z;(@JA{H{fl4vJ=ATBc9=EtovU8BRzaK#uxB4JV6-xiBw2!GnVOVr^X@Adl$(vG`PUIX|2{GLDH z{rG&rK7pI!Y_XMI=Xz@NdanWZ z7Y^nQ3+=^DSY{uzU_J2-)^9(-%dcX9f7MlFXBDHbC9)XmbTR?xkWyY8_Rfz6zEWt9 zF_d;1$C6W{rs^`#mJDhNtzSTQTz<;u>~5S;9&;ht)h<@T!Ge5A8p+Yj2*yxn}jwS66)ES8qH|+uXzi2;-660F}6-^nRB;M2%;6VRgGP04xeR zj9(7^{5;u7(S|BPmX-oImGW0Cia@0+GB(}WT7&H>}B>skk+Gxc0y9FTQ|9lzz+ z@V69-R1A|B*(|LAoDw_<{pDaw-yUrdxf9ofWV%K*jOI66_jJ5m7pN=L{E}Lrrl+TZ zTfCS!RwfyGLOGmHQ$Ia^6nX?efT(|^ntn6CD&93E7<-D}=rhfJY@szV@x`-}a`-S8 z{7XYmV4l=yedwP&hZP8et{@TC#C+rabn!`-d$KB}zmC(AaAdorf7yLIY6OJu=z6K|?LdCVM?{NkcSs*4Pb2M3WC(qfm(owUD7*~Qfe zGI4&?X8&T9`pN71b;}#KxVny)Y|)Al7@AF3{|5H`O{(196k9|zbn3XwQPC|^TNS@H zAV)(#c@p(=^00kcMeD>XgofZC4p5Vt+rutb=0Smmf2PQG;p^|Y@WrwtMa4cP zgD1qBbhy0hL?+453Z1Tus2XgBX399eQQ9p06u4i0&s~^_E(#CL@+%dKMzh!E;JA-~ zS~BJj`qs+RJk~Phd5mdy$K=t10W=%CBE`crT&xvk+W2HJi_LO!mHEql*mpW_(8OG| zb-KB4NG1Coq0W^Tq}K7LB;V!xd!Qt2vZ7*>=Qe{qNyP(Rm@6*=7_92lvmZ@>O8Re< zl^`$TDWL9kkLB)}VgB1CR(vGKf#`5m9n zOF4Rb+WyAXeMePMv>;5{0B|uzZ+9y5+n2>gSrP!-8B8i{7sXuBTC9ER=3!sNGhp+$ zGSvwF9aO}9@$0AEEGeEwQ|SDBaW1GyoyVY z-KltI3+6im;4w}2s9@XL=H8*#**=rkH6x^+d{Lm?w+vd-EqUD6wwZ?KODA*B=aC!C z4=mw3jv+6A&1SL4mW?~jdx6>NbzPLIjC&YJB! zN4Vn``50)9pXSjA+yhOKK9ieU(AR;zJu&)@fxd(F=3{RfQ#6dV^gJzwbcJ=Q1~$p4 z;wis~eDJ`Mdh4;KH1K_mbmq#-3GESo=jA_h;>()=UzulA_TwSOidXr=Rj+a!@h?x= z=z!gCHHIE$D>RK%UfwBRhmA4r(wZv)>#G@qV@cudClLj!@>5%l0;-w7TGR&?AE9M3 z^O7CO=|#z&gDB~g7Q&v3Gr#GrJy(;d@-${M*(e*8e+VcLrNwei+M0IHA7%Nj+5irU zgA524F%8CFW2JDwb##~pggcbGbi6A++zN6JG>;GXz;r~d%O|07IvjL9)M9I=!c_@0 z-`UmU(3M9Lv)*~p1SqM2Pw10AV|JoEs_PIb^EZlA0i(lMTM5c3Ek?9;F_a6YJnQ(j zstT)Lyt$JE|KMW)?|B1mhxiaN;~!1n3Axb>=8Qm{#^*~((egi~Ds?rSp>l%%c}jC7 zu&T~wtg(=LaeHiC(>vNlXS9eYWWx=@PYSN%^59BIGO49yVdOI8KeD3{L?uhL%+C({ zCB?OwbJF@gJ>e4$!9M{ef3_D6mtNgSzJAk14m&%Yyq5q`xciomx?nl;h_JSPGmrg@ z^Fey`cZ=x4FGy;+vuLxjMT1SYG&6f22;7+?m{uON76{8L=)_;?P^@RS63Nj0 zM+7}{EpMX>y%?LH9}@$*Kd=MwD_26vqygipq3$drKd;2&hyT&{nHHG&?=$9a9YqcM zqsP~U0fht`ra)?bD%rT@0Y|O|kIPsT_O|^?SWu$#zf<}P_JfKJ5hj0J+ub-S5I`j8 zHdaa#&!%UkOGLZt=yx8EM&7C~U;%w)V=^|}Ug&zz*)x_0v?Qz|J3lc`+D0Sxa0y1=Rr%1`WnSI_OBNI**GI$*152_3OZwjmo2A=X$8bQ zgYjV7)*etnzJ<$*B#Vca2n6;Lg?(UJ1PG?|)#UART#M)pKbLfI>@@y{BJcq{K5?3- z@C2@+iJrVrju%?bKHWXxA`=?KtR`Eu!+lc8_XW2IF(9^<)6=8xt>>~Y-N|EF6GxaP z`PY9xre{G(4sXRq43#xd6e#UIc7PLo24e%7)&yHbF9M7iFQ4Dgg!ED|5C0BDoG}p* zgL>8b!-S2|j|^y|q=2VHR^&h|_Kkso&QEZtcmk8w6{Q2|{I>~uZ5C7kUua{0ts z?6K*orp8xb^I>$$zveg&Gv#iL%7;I%)ZWkaX$PXtCdwbat=Gr4>X(7sf5>+b0K{E9 zR}kAf$Ra8S|CZWLmb8*NCuR_hb!Sg#PoAy8JEoXC&~xb(rCZ~H^?E*qlrr$oA|I}o zS)cO;RcR33E%hXRW*0v)d_LB=242Q|rwsPyq#2fOKFXutJ){}V zm&Yu{s?J}H>U$@kQR1KkfP7h#$G!PUu(2U;%)}2a!cvvh24XK@sNie#FiUo_u+@R| zgeHzw0>1r|M@gRG#k03PQbpP;yjgDWhr@IjcQ$g#X5PE>Ie$3%S~;zd08xAof+*is za!tn((2kd|4ZAKL=%Mw!TYAW1-dn(xj|{nF0{39PGXhX@evhX7=yQPN-eEnH;U`D2%h!l6oCJs_U~`zWYUnlLv%ZGuPKD|1t3*+9hFd29 z&MmX|^iJq2Iv{hTxsplnBzb3fotM0%x)igL)-0a$;^@u~&tw;QRCMr^kCe(+g2Bx| z0cTYy&E1!!w7z~PT`@VYSt;e?on0f!0w~G78HVixr?$muh*Cav?>VD=>QPSwx@!a@F$hb^9el+ zTP(t+YA0eZgKkxR544Z@dU=rIxZg)zj{Px+>&=6zOs-|7Xdkx%cM; z@_K-C)?08!wo=2hUM|aRmcfvRYZ7XIdG1W{8_}S(p_bcJjQY6h5N0irIe6_!)L0uA ztx$t;L0mK6EVlM76yw{WWu`e5+F$wQK4PUtBL!qOUMyn=DZoEZF+~b@^n&l64_=Ce zND47p-rXfF07~W`i`=(lTN40ZFp6o%ssd|;Hlw(>;3y{1-L|4=b#HdI#!h`5+%~Xt z%+WcqpV3wXDdghg^zzs`PpnxaVfuRq5wlX=qK^!S@Ap-a%2*i&9ea`{0U`uQbqhcl82~B=(AuYtaQkMe>ij%XxC4qferD%=$uam$Oi(Q%W{%qM z9ySDpX_(Ccyke;l5wPQp(&|N0rB9evW`NFs3qEvKpubfVEM2ygRdgK5uv@cwLBGiA zt1==%bKxxCou!Ok&J6^{?REitLHL+bU^VkJ;cEAnwbC)wrdxacNfL!s=*LpyQ^zu? zqe%s-L*bv1vms7!>y~$qZnsAH_6tpJ=q*-$e1R(AW*vW4k5i1sTu}#vcwA=7ZVU?7 z$*Ner=JW_Gu*;Xd75RGrZ@z5aJ0uE2G0G(EP<;?w#9^M=44iawld(B3&Vc;v1=}r7 z(hh>;3bvnG;}zq%MiT{s(@;Kxm1f;WSNhFM-R0L8Uf8*Xy)b*WBFfj{typ9(Y9l)_ zQs~9p*e_ZcfPKY>34Rb51H`OswVQVV+v$@w;6Xs}(ng#5cD7JtRO2U+d#phUG6m|L zYoAPM16xt$jce8ZmUPnpkwPA*Uyksup|F$S$M;+ev=YFKj|?ND)XXue8QpzUidpQj zQILPTH7goKgm6Opk)NcxtOhQKnrM)^H#iO-v#_-+aqMyM>#L8$^{l0`nq(*|4%o+7 z@w3FSs$RtLHN(W9UA&K?WErvYyuu*BR&1aQLQKNM8n-wN9z{5xk)PfN zIdYvV*4h3OZJCh1zCCL+!e=NR2^!CdTlNIjc{Yd2Kg$Jm`eyC9Qt2oG^!k0qxV*{j z+G~QSsenWQ-T1Jmu+>6YY9QQj03TUZ{OXQBsh089X_GKQb75iM*6;Sf!L+9!xu)^q zAy}P2uQ})Gc_kSPSpMnq5f};7%{wCtE;1>Bmp$w!Mcu^#R*V&d{;#3n3cWsVZ_c=T zMB(5xAZ{eAKh8i7;vjy62KQK5o_TFB-Md8&L}b8QKZH4_)W6CQux0=n`Tl+ML(V~c ziPxDaw6MGs26~%khyTGC4^X+@!G8D{9$=AN!%sk%J3Orc4*mpw5L!G?_!yIaVy2Z; z|H~19;MAuNDF<&@+<;0YV!a)x04T(L7OOy+b=hb-)g~K!hc? ziA2jvxI>Ms4*=T#;gTWXJyfM>dU}RCT6!wE&OR>T_Cqh&GRFD}*4nS1bWgKAMTf@~=_OA$2ZS24G7fL*5FK9tXc>92qpmM6I@u5G)g(xB$5t8==%^#%`J^yG&OpK>O#mH(0 zjx@&HA7^g?WL(LxobQL^B=Hap|@xA76( zto6%+fOcXpp5Hg^pa6divM6NDK0;gu6z-z96<-Zjc?n zXU{;*dut#dX7dy&0qx(#*!ntgAHe2-ACOEIXO(7P7p58=#=!o$Nf$-d-!3)AB&)Cp ze9K%L)S3^Nh9w|`$b%dabO%fT&}NImzFIPn+->@vjy9*VMi|Sc_w$x?-_P72c6`i0 zz>?nl`+dm{ZsEmk|MK z7`i&~;+X)aR2yM&L`eb{Ko8@!7h4ME7}5VEO8{=oL~Z}NGl~R6j=izWU1G-QKiS4_ zoIZAYFpb>i%EoN#6_0eFYF-jLhcEBJQFu09L7+st$bvRv=WbdY<~gRO5X*sz2;eOc zkP!o%GHdU54CXsjox^mW?(ik;eYhpJ@84eeAB!}G1+O0zRAAo*5C}#XpT9$jiKy~0 zKebA9CEx}s0KR5nbu3|?Nt=(QNZ$;1BjGeKCdjSuqv$J$$!!#q?Hb1I&}6V=L-(O; zop&*FB~+k~YHnR4l{#pb{-CG|U}0x=i=h2&3i3_?mDanbXxQ&lT*f3G(vza&zu^H` z`srsGlmfJhc-=;(XKzrbURkdtzU_d93`gLFDQ@T`i4%1Wp z=P3k#6BZ?+8VB}yo@GR!W*}W&Yv5*hg+5IB+QHX0pOWc9@7%up!L3f4(N_dy8N^1p zjreU4+sJOXJK)wR*eZ8c#=%@MGxziS{+zl+MsU}8Rf?SN&VppY94<1k5|!QvUeGy-UaN$4*;;$iS%(GLuqw+DJrVGWHEJ7&vhC; zLVx?r9wWNj;s#G39_p(#K@TE70& zXtc&<5y-Z`6ZhfGfjaG<~q6L`Q;7xYKrvR#XY(TPWg18KEt@wYMD}+Ef4L%rbWOo9lripzQJSC9u8lc@jIphGs^d-2q2L zX3P94sPQfhdyZD;R9NjeaY9i(4*Zq{xb+Cor1*j?V-WZR12wpyBR3a+mGBx3Wtod6 zKm~a@f`4rcnQrTOD&hyY^dJCgI3|f&&p@d-JJZ8_(%DAE`6@2(h@Qu`iJMF_}>;8N7ZUg+d8=j9$ggx6P=2bW;>aT@ZxnN}nO-8Igkms5uZM z!uwAUz0SKN-8IT0x4fM(s@$rOU$;fc!HNJ%+!-db%JJ?h3$>(=o*B0NA0pYGk8OIY z0B>xDKSQZP%UO#9Vy1Vp*&fUvfAwQkxd+71C;qvM@ncOIngW?MJ;GEd6j~Rl~#?3jC!pHLy zaaa7l{_e#L4=4fn5i-9)9!M7M)*@P3{}Qg@4l4T7jwoBHpZp;#F=WjVLe(CC&d9_6 zZg{t=I4X%E6z{w1H2l|vY|~G1$p8Diix}`&r*|70-{oH=5$fM64 z9Y@_WdpVf@jE)abjxB!j=|WM74P}5L*|3Y>wg7-F=ZT^&jN+;1PN##0mZ9!J!&Wig zs;5&DZk3m2GF>-KS5iqZ`g|+F)_A_%bE>KVt_BsZ)TgJ`udF`Z1HB@iJR&CRegJ-h7S_XjtQ@#f`23oqD zdc%^=>$M>mfyZOA>9Hme>AG@>uN@!9HHANXTJ$(-;R4~H;Mk1_r-}D^sY-4ex0I>-OT)nZf8K^{?jUkorKZIfCjwhmmr=f@v4^(EL-|tKT8-LI{)Q&brJEG zVzg_)@Sld3_JNv6A5@$9Ls^Z|gc<8_^!BB$7!qYPrbIwrS%2a~nbj*p;*%j+Qm-;O z*o%AcH`s5wErc&5R`c;T3shsm^-ALOHmszJ7(R%3PFJXBLFa+-`sk=Szzc5L8d8eakzktFJS5R5YeNm2%_7U(1JD&&xX2ks z=>2Cb6k3YY1uq|k{>22$6BFn&N7y|o)%WoaExY}XTA;AB77`i%fgV3upDu@z>9`aQyf? zUsm}tBezrS?(nV&Pdmr0YHYE{n)r)W8w~V|Bi4@UC}>OpWzPZ?|DGbDB2QIwJDKAV z7wEE2O3|nl&tCia<~mmeais9=XX(vd@S(lB%6E48Y`00z>%I6Py}BqAp~4s3Sy%nk zBMhlxvU*@P69S<`WekCp5Q*5!~ z=ZEtUI45I^p8+w^C9U9MThBBz_tUHH-slnol_2v?oYzN<|AwbFOU|yJTd8xG-6jk3 z_`rmr^S}GR>!LEO4%>1NVIdwZS4};>%W`>%9_=$cno2nxa}Wj);EzPY=br-~hdp&k z#4Y#Aq0p0LP~9dDzZ9Q4)}L<%zmTOaCwg8yO^Cz!n;sWsR)&CC*}njtsVq+ZJ$f9p z^()YdrZ(O-a#cL1?{9TGVyr^WMdkg%JnjkwHvD?%JD;naIw5^%BADU`d8Oe5JqS9Yjg_f$nMd6qch2Pu)I8 zmvjo}O(@sjHMM4+iCn6S=5A-eqJY%@%P2$3b!FO1c)3F8K&-*2-=du!avu5A#olrC zU}5iyNb0shX{BfWyAa1Lk%U{pltSNF{h4;b>pb1HcSxT^1AdhhxGxFzcK*%tCX*7HaT|6yRl!_*}1@wh5CIy+_C{X*mRFl z-%K)(?okinMPn<^t$*D8`2my!I8~mJoTdhFKh+mDdSJ;igYY?Z!>r$J%ogjenF@m7 z{=cyN2Im>MK|}k!d*WXeWTdreaXfAwHlLS={J!CceHT`(nX5s?PS8^7w6-C~@fY*1 z#f)Mp_+Dt%2Dn#7w6*uj6hc3f7x_CBynu)-RJ7|5vJXkOs7r=PMR-0x)IHi5Hl%;tbh3ztmUv{Z)$lx}_fs!T+C~QA2bF04|9fd4a3NBId@C*QM&FelkMQYNY}BuA?(3Ja|7(37YMMqi7%I-Du35I?kfiaKgrcj9k(wgqF>o(sA#T5tAo71L zM-2(Gg#tr@Ve9CsX~r(v+DR9yYXcfJUF2DYZuD>cu6PEFwgpMHy@9bh6lKx*)JaY# zVruVOiM#SpKKm+;@3-8h1+u25G0~lU*&%+RMlNjLj@~*Mw&KAhMNz?3+-J|DmsZoA zOdLaudiK@^(6Yag{_y%snlPe#hDr?xE3wG0p~H%p^eRbp@(L}#dAjsdu{hnC)zdN6 zUwM(vF1l|Dl0Ar#bb)}@U_mNc?&uLI!X;|bGCWbQ1NDP97@O;TIy}`3f@Px`aVUM; zUOs#rMC3OvL;n(*;g;>-pcXY^c)>y#8*Fysjo@fV_gu%I^1Sdsx}9=FZ#1;9K(3+0 zN`l=|Y8;tqie&2wWA*mr5S>$oRXt$N48`s&#u^6R9tKWJegA$HE_k&X_7M4UoGM1n zrJXl9CBcN}$m469YS&AxPBs1E0*`29;m#Wh=KW7DtNiEa$i{{BW#4qIU-MIBjYnNA z-plx0LHUT*++dYFgT%|QL@L+FToW&a-Cc(2m2Zq+ag%_SLzLS){BA0;-P4;N5n7I; zOJv6*^_vXq(?POfmzaz#z%(9FI-6Ph=Wapw+?_{PUwp_z_bQmGsO$Lhcg(m@#T6KBf}HE3oSD10|5AcT4X9Rv)%M2ginqPPT&hQLdNv6)KN2($iS@5dD|d367vfKUzDA1Cq+EJ0FdUwE z9C)-?_rM8?zF&nbA9|cO4)r(I+YayuLY&3yzEjAz;V||tH@=Fsicg}N z9AeEaEEL^pO3U+8Wj~ImqH|3d?^nb_V@b^};34dFs^Ni;;FBw|EM1Ak12aLZzsX=9 zYc9{QjvgOdIGJ|mt$g>CJ>0#xRCXEe2-AW2YGiL$nEGKTW{=`Vs2CjTi8T0hrTx?| z=8HLzwE|bpHiR@^DgK?Od?;FpIzY5kb-$`@+~CnLq&yLz1Ya z)LchIH~8QYz6V(llF}Fn0>2w5Fa6gZMzo^`t6W}A<1yMM)Mh-~UisWmX)$DwHZbuJ z>nSnS-Uk7GRgL+XXw#<9fj(idysm>-V^fVjG1Rzt+*dV>W^apVJZ#4LcNm6hz0=R1 zWnItxqj-u2R=qpJ96mgb+(2YPwMg{#=B1J$dGdIKl{1QC`sP@$GGlXgy_QB7)`^^gcAvv;6Qe5&YGB@ubSTt%%+~T!-^I z;vMvF;a7)Kx$9*J{o2{3P4pb@%0?gWlp}lt^Gpqu9Uc6VY}#5Go#%)V<8D-kQ*y-) z93fT^L%-G11oGC0?C1~v6@x|Ng18bafF2iQS^<8fpBs(-lwzWDydG;?1c`0QH{FCM~Ry4a>IMvFMnF+#|UEv`3rW9U>1 zCii0M>{|T+CybVD5w9q6(@fpfqqU&YG_6r+zMOj05^eQqdF#XmFKqbl7x3l^Q|xM} zZTOGXp3L8{)ET!d;^zy8WE`7kU;v!(MA;nJm~FV&w@l6g!d*I`=qGmK^L!x`#a^c- zl^3ryWYmtFKA-T%o}RFZP}ThMTUnHgORjzBSGq(-b@ueb#p5i#M35n~R6W-djrel2 z{)q(@CL}qEgVp^rKaRpWJ6EA8Z^l-si_ScsWA|>0JxzompEbBbEJi~NNSpWg@C$4- zGHNppUL*ySI+G+HSiP>xnIDMBS@q%*QDcUt{j)L@jO9~3u&>;dEeya^4o9$Ux5Rcu zHj@Xvx1whu4xiOCEGy;2KUSAfMF+VJ`KY$PW-I{lHOx;~J#!DAk#ir&%^j;fH(5F3hp~b5vX` zYLBBOs*)D=b8V{M2Wgyk6Z~1;UQet!ZG2aoI7z;*FP@R17Z^VBr3t_pDT}!<0$^xj zQe-9WIsE3a^)no>-)eh^TXmRueM~HtG4oTPXoAg2;=M5MC0gjbKH8?9Ci&NB+kna^hrGB^jgH;nx{s9Gzh?JiBXemveK%-P3H0X0+@u$uI1(jEW`wXXidm+xR{o>xH~_k~ic0RJFwumRbP4-p|xD=PRGk zQ*oQgQb*xEn}9H`ymWVRTn$P;$EI!XdRlaD_@#@1n_{VjVzrk)*aUBEfHN_?v;orQ z*f!1hYkB|j^k{PBH%(%ur;uWE=Bh97FF08(a7=ZXu`;= zH2UA=stW&Y*vd)2(G((u=%K?y5|4&RmHdYN5MXD0>hnk`1;OaNWa|^z4ct6E`a#)^ETZ*mSZeA z9nMyNV7*3Kw zdx%htSWXWCp?yw!_qdd2T-fccde}_m#2?SIDVF-t#dMAb zGId4kmQ1#N%9_EDH|NbJf*;%2C__(eB5iov5Ryn`oZoWq;* zSv*GNdHP(=Zgx3m4=OdIBaYf_g#i!Dp2&1*{&Ka}dIqe=u+TU;0cfZTF1P%}j%^=kf`Xg(=|xRTB6 z%L25lbw^iad4u7WlxzJ4gpNkM09+QPSysx9xvE9{^|aqE+q_G zYLo=Z7A*QG7amK$&Xs#SbGoS`u69D^JL&lAP+G!B)#U8cjBsJP6nrixRd}mlIB`GC zk5!5%aXBp$N_&#$!Cl{P_FkgWSZMjuE#~Y8HHp$6=v6Qgi3I^l2mw&JfqefPFIC^w zpbMCZ>j>5AjOddsj$yyhtZFG&^&k7t1PcOYbCgw#fAeEy5nLf00YE%q+c?~7)}X?r zaa$N2(a?Ih*|xv?rdOf-Z_}`Ff7EpMs}Inxi-AXJ`XN}t_Fvb#GkV83BfBW9DozDt z-;e+k8?88q6Z4{F*Axvg-!n@jyZdU`pAy95U;9&bX4?piYK#AQ?6i_>fEi`+kv05$ z@x8#KYPT`N&(E{rlm5qp05GggPt5UbZeN+_W^afO@5i_$wsQ-ficTbsdkgp{8piJ& z_ZG|&R2}yxX_U0OrO_->8Sj+12TNx6AG9UzNQk;-=*y7x2CAV@3gpQ@QLhvzy#D9< zJV)8^tSo5QqgF-pLnvwpOAVhiJu!o*2bd%qiS6MF7+Fc z3auTL^im?f3b7|`F+QQvbN4KAd8z=sfoN-NyY-cA;jiy>z?BS=n23IlBo>pJ#l`op z|A3NohQ=_8_{dzW)-uaD*de2<4b0OJb7z1%86)Y3N>5!juN_>i0E7OLZslXMnzHKL$_)M$y+VG#}|Fr_E=Z4At_L)xQ2`RcY3A&t|6(o^h zV6yVHLZ!0{X$XVW-laa!wz*`a{g5ohV>Tk*B_zU=`ZUpa-y^kT9FmGE%Arv88Onb~ z;^(<#B;Pp4Y}->;L}yVlZBuDr93h`od{e+p23SE;?VOHy5q6zOC5N;wFo{Hi)xON7 zmy2A*qRA?>f<^jIA%sLr7l|m|1`+&c@^N2}j;6N0=$NC+Ag++H;22BxA?f9~BIkQr za~1Ra*#zlbSHj|!V7{_I3h+2EVY7fKJcDEGYr2*>NHXWN$~>fz1&lUj-j|qW2JY3m zE8~wC`ptYQ5oLaxRW!Xqxl>ja^40#frVnuHLvjyDSITz_3QzpoG5*$Ou;nTS1+YtT z&RSxRh~kb7M5YC(eIMBmAO-f%yQ4!_Fn@8{Z`w-~SSj|I+yBM<7@&lf)S5k}67*vC zpl;_ulp6|LuL4sm|3N|@kj&b$kZAn3mC`~O|L983aN5Sool9c_xUOihgOa}gLCw<9dDWzL8psB4a@Tqa)=3#jtnJ^%QvoP`SmNt%Tzi24_?58q`{hK%=WZGqt|e1trh8_mV{V{fkf zP1sYLtX9;xlyTyDMFv1MoOlXyk&QlV&4Y><)5<)l`bXMxy?+J_fs*b5W}LA=i9D5# zkDRs$lrMBlf$t#ZXQGG#v!95M2LYeO!jZhGR@05kA@%GLA8@$_rOLs)fZ0D*yA3l@ zs)-xOt~oIbZ__ZQ7r<3XPW05B#3wbKGcBSS8LxwU=-hpy3w-2B@<1*vl*A%cn-PbO ze!R2;z334I`fv2j=Ip=BqB;D){na1M8?VenImJI4lYv{#7YpS=6`O(g$y8ca7X&pp zh8Fg*g{J=bd>{f`ZQOA!Nk~blV%05sU8pyto9 zj6&!GSq86v$LpYKP5qVYkjwS zy6re1l5BwoHv@);hGy!5b!%RLFUEPmW7wXXC5#xQhsb5}Ajo!DU^2(C4G)1Lau`Zd zH1uEev?KHTFrxy82C}F+SzN?90As_^((IY;(+6gVj2)h8J3az8rLGl-Dyj#EB)F~Y zl(8wL#a&d3f2I7m%7SBfcR2x!PI-EtPo&|47KtbSE(tKINAWWhV5pruvC>lyfQmA8 z?)TR}%;$%M#9cGO-?bx(z?*Th>xjann+Q32|G1HtlJPU+wvSM*eh+?%!>DH9b5pS? z!BC^H89V=!lS&(C{!8x~q)+Ia_GnOqWpc-AfmU>Bbg3byJgoIIij419WN1Ag;iVa`T@Zm@rJ^#e)TX<&A3$4#v%Y`cj&y)q)2SXBmi_vU;D_aJb{Sx* z$=~UJ7DtAvt|_D^kQcZ}_2dE64S2%Mt_lY_}lhxKT4!Hni%%=qm7d*hl?;MOeA*^|vg&%dE9gR>;E!Rvu-(;?6uyBP_C@n%RbU#5qb4AK%BG*8Ht5@2BIMkn$f~9U1{zoT=%<)!~%Y!3@9C2M&-xk?wTTZ>^f$W+QowV zG%ms+^a&3K=y>F_l)jq3Y7 zraKs|T90dCy(8slCV8ptA-k#;&_nB$xx)A%B|e4~GIC98pO3&#RJN+V4_h&~g$`hY z?DL+yS>xdZX=A*>=R#Ct9OyhWgXCnbz-xQo zR6YV+0P}u@;QjJeSLgwbf$wR2QCU}L2P?6!uDjxKg?d@zP3CDjFcc8^7drRe+M3SQ zY^=fX!Bn74_4&m_OjClG75$e@s^n#U(`Nh8h*O@Q{C7Q@TB5-%+C+jC2TxT4S9`L! zW3K(^$JjV-?{qRy>5E*l^K`e`0}u`O&WL?=yGui6kFMgk5QZFfKcn+SN($K?+Cr7< z6*o?{v`@HyA2d_4YuDjSnsk=3)i zr$<<)gsvjw8?u&gRwDm26EgFNwrh(2`bSGkDq}X(MlaEvLK(IjRFm2a8{Zg{;O@PX z5K|wYHTB;?G%V|-S>m_qCS%WeyF^}n30f3W8;*X(ndyEWv|gFn>{#F~qUdhLLzNfv z4qzWRRiVN_y*NF-DYVn$FDzfJGyZJ{)N<=wo6ub37Mc#QHss;kBgCu2p`tpo`u^ z%>&t|$tn3~=ZCu`*8)vd`cH2$6AcGs=s)jB1mUN3u_yb1I+Q%2mxeui-a#U39Nk|& z5`&5|+4J`${C+jQENW*!NP?p0eI>U~Bw>7W2R?3{lZ*MQpys1qsYREG^U(nJ5L z*YwFOeP*z7BDh~Ei6RBoUzGAvB`jw{C{TO4Eu^KyCI&;THy-C$#*(Ho&Sdb_z{A^)Eu9{Hs0I|9am;$0Ti;Fa9CiVEIbJiRV3jej`j79tw<=S|LYpX>PzRO zB4(?vCp_)Uc*y3WcYh)>fj8jLTN~A0uPm+BB6o9d07yhdHZ8}MV;CPLrJ4tE;u@R9f=t7Ry2 zvLs7S;H$QIj3X5_jLkXvDPVr`Hx8Qw7wJQ4c7!E$Vo(ju z=Z5^WJtm1mnwS`_GG-b;BTC4W^9m7sbdER;wx3&L77LznXB1tl3vWCB36zgX8YQ#7 zH=!q}(fE}pAHH2TRjWJKP&E-3*VKQ5HxXO+O2E0+z-at?VAw(z+OFUR0d4h+7V2b8euj7^m%3i~ke?815#HOG?Aehw zf42-WYwG{^S6`tEI=d7n@>ufhp1Q8J*!j8}{I-=sh=UOm0(Kub&>SUAQB7z)Ud|F@ z_p4uo(CSjDo(C7;o^Mz-3gBkUy84J-GT($OZA{=I!yG1Jij~lkSjlg`k6y$#Z|AdY zj$GVzbhz9qE}p7hB^r4v833A-d2y8`t><{h_fWzLH0n zbf#MNdiVLJ^hssCPbFqJ-Z$h(b90_0uPje#u{Bx5FNpsW)!Vf{E{iQTYCR4u#y21b zF3MXmx9!KN<{?voZm~es^YRMqLv2|t{3MQ??+s~Cod=fAV^02V3hsPN`3tCvhD{H< zq?q8u@eEsGyh1-J-(ce~m9X#+A!cKp-yM8l0Ct zL=SmH_}02cSdShocYRh#O|FdbKf-A8^8cxV3#88QQH+(`Q9Vn@vG>6S$MvAtan%mD z$TLH66K);hE;()FV^~YfNRDGWz1#t+N>ZYhmx}|R-elN|lF&YCcqg)(vx+nQ5F7h^ zHg;d)oh?h+KJk<2RVS^e&=wvE6qVc(j7UDV1Uk1VAshaawZ*L})P>3AV8?DH_p*$g z&u@J-{7Jug0$46e5cP8~7cG$TM6XWn^gz|Le@kn4?GwyuheGgabPw}Nq0O-v(0wCN z1{m?r9liXm7a5*2{Uu$UOZnWUsu#8*MN5T~Ls!|^O%_3VuXiUeb7yC#c1?f1fBzk! zcKBQ0u#YXRZlSaAgbApqvN^JDZB>icDGiRxXbLU&MLs>(#z- z6Q^SAV_h7=m27;ZQ^$QKX|&t*ywGDzjpF(}knCciF3&C=vk|*747x&))wPj4+YnTONz(Rs+2@gvL=#cnufAw-x+J!cUcm~($o_nBwI9=8rjzg!`RC<#?siv zV5k^l3o{e5SmvFcf8*_ZIv>ub`**JMyU%@H*M08<5MvFlZ=e2sd=4 zS=jB_gCI0_B&R~{!|8v0fI~TdL0NRa#dmAsfK3?zpA<1&{sdE zEz7G)Z=mk5XK>hYAgI(A<(DZmL}IQKKA+fB?}9d2T#sMG%F3veXT5N>4{NwR|IWHg zRv5sJ&WE*No|v*=`dF~dhfVxjJtuoH+V%I4pDKbe{nmqpeb`>G7hESNac`JVa(tS5 zQuFnqVWRtyl#I2Wb=a3t&5%|?+av8$E^Y_jjd|l|d1q;tADJ1rs&M!mcLO_0rcYzTlboH@ zTFu!WFt|2UGbvJV7L!jM*RsFl>Zu{2TNbLseEgv2V_I1Q3~g>9j&4H~mu?+pC~lz* z#cESj*p|a}b$>T8+|3w!iBJX<;Oo;1`IcHxTV&&{ZPXlfxYeMTe(-dq=$fnFq7EPD z^Bb4%+>2l4*sh<|V(z?M6O8WmZ$m?ESBiRUv{P1TA7K$eWi#Qsm4V|_3~qz@3p7IJ z<;Y_f7uPsnmfXMcFxP5^82sVaT4TA9le0OyN1f=uksaSS=TqF}&m8W)VTea~Bnm^Ak@Yu6 zug042>PyIpNMjdW0o#2EHgf9)v-op&QQ=lsg&1vna&|dJK_1Z_bnU`Fg5qHLI*c2Wxwyz@9cJuxrrFHHgPHBn>PuaI@2odAFc$RF zLJalYo1vIHsZ(E}b9IMiJaX9dOu`CNiBZ03?XG;jmengtv4HySOh^NPR)N`_R_V? z5nnWzOQRfDH=kSlM2RM2DAZ2l`7Jxz3a*2G>+KBu!2Fs$+l~47HT6lA7_xuz_eB}=^hrOxRn^=;7yHaM&p}DQ`-Rc%6X)>cXY3b${g8ekKVvn zAGKyPV--=}5YzTf$BAw83vI#me614Kp31GaC;4~f8&v?)hBfcFBUFzdLI-UpvpLe5 zB0y$dAoa^N1tty_mL<%uMo5gGjQ^dYvzfkT5Lf=m!Z9!F z(KXQ%TnT;l0U3~HN6CweF7LhdTMq{-vHMzO+*bZ5R$lq@%q4v}yci9N7lW9pYz7#- zKSCtEa2ty%{k^}jiESAPudA(6PC*&DgSm%;#^)#?R9zUeHW2Nt;Gps_e%vR6d12(hLZ_8gCp2z-)BiZ)Y@#aL1btae zG9;`Zr%;)BWj;TcExio`1d%XLGT~XYdf6KBS|t08Yr9QXtLND65N@_so8EDv2KGtF z37xYW7vObncO@t_A4qVQc=u#3IGC}Coe>M!ydH|!&55AX35)Y6u2d&oKV$uLK}VrK z-ex41yMIAim!T$VEz&yzj~(-|baC4sOdAQ8k`E@co%V{czt4b|G}r=mpx%sRI0 zz;^G?)eyBn>}G|9Y__mBt1(ZpESXGt*jsu$Q_q1d9}D)r(ds20{)ef(tZ_flevaw?yTB0Z>H}xcKnwknGbpV3)`@1VfljS(H392;}t&_pNRCS5wM>b zH=@MY*WoM}EbMX~!{j;N$^KLg$`U#-AS7-etyq_me$S(7fb?oXGQ|7W>ofz!q)t0- z$>!-iHtpLg^KFYY(}FwMTn#w%oi-d$al03&_0jUmVJUy*1ecTPQ!YNd0~^KOvd7fD z%y^#5*D5?073UVi59uWBy!dv)>fY%OW!vC#(fach+g+g1e|`AWi^OOdxkZ}|5m^?-NR$^y?m}6tuQ>c=a2V9ZEN;xk@ zV!wB7giIu0L~~3C)<3J~HWU5)LeyLq?>npWR>h?6My7$z3R(<7!b0Qpq)hre-~GGH zxzwP+SeWgc8*YIk2XG(7#120gewvSvJ7hg*UGp-ZTt$6 zyYku!LB4*0^7Z$vlI#GZJVeuD93irAjzyw6GOdzM=&BhH2Z5bbcAL^^roY#1XF6&i zP6RB3z{7AcKC0Bel;ONoC4G}2YpQ=jr6NjUmO1$}b|qdxpv7Gp8hoDw%^x-qEZeDD z1~Er1f7B3Z?zjv(m5_91LFL3w*#39BCAk{>sq?FCyZyFRjcSbzU3m0|c1yTfc$gQx z=lUA2oB;Ht{I_}B{w@~tbu&3`B-O60F-Ro*M!sOnt&K&3&Ca^lCxjGc@9ekB?>p8u zgffB2gFv`Pkpk6RDfhmA=pye>WPT;=G949#FW14;zWdtu6`Lw>X5vW@<<7X!@f8z> z7Wn`=S1m6x-?5M>g~=c((C|uGE>TfJby_)44Yh>bm#cLDkmjmSt#prbM`i~Lg_6Wp zm!}XuN=^$x(UAsPaynVb4N*2tD-#>jz0$az(2&X{@5=lpVu(9-i{U2c{}QHB6T*~?AC63jF08&uzdk&@Cp;Rp z47n5U+mLoA7b_{lU%(h{^sJdA2e564_E%lnrYeZ{$(uz14tMdE*-4*?X|A8aESv>r;1Z6MR7v0a zKDROFA%QX-lP*w5WN?<;-7+79gwwU=jp1PBM@MpmUrQN`snz7EjnZ&&$Hp(LuI%{- zMTKkrHk~?4S`>V5y2ng^6=$n-EY@xuVYClvdFovDbRYZjs%h%8W8k~`NkBuPnt+5C z*sdnqN=RW6I?fh-F995#5g_&9ghFKD8XQ1Wv@pFAae9y=I?ulvD#b%MC7DeI5-dt?qO$Jm1r#cjl>b zBv1~1{L-wN$Xx*@Qyyk}W|!zWkUB8p>6;KjE9)m+B*Rv6n+%ZAwKZ!i_yGeH=g)Wv zUMS!wD5kK=b^Gmh=EvoJ=}cmTJ|;=lIm>e;?p=tl>~SYJd2L~(=?#OV=l`<|g?ciP z^Td~P#sUms?FM+)EFz2a-L1yA{mn=hT^j4w7OsXkmb*;=<7SgK5=gG~^%i6>tCI?k z9XY#UA5Nt`yfXF{!f7 zqjNF#*J@@(W~L{nknZ)H%-f)j`b?H?m0&$3RBLVyAl8tU z(mi)1YIrGr;2dpX>aYzWv|UoVq}SpX8UcBH>$4Mb7t0^v(;?H#H!rdlOc|E`!{Y(B*&N { + throw err; +}); + +// Ensure environment variables are read. +require('../config/env'); + + +const path = require('path'); +const chalk = require('react-dev-utils/chalk'); +const fs = require('fs-extra'); +const webpack = require('webpack'); +const bfj = require('bfj'); +const configFactory = require('../config/webpack.config'); +const paths = require('../config/paths'); +const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); +const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); +const printHostingInstructions = require('react-dev-utils/printHostingInstructions'); +const FileSizeReporter = require('react-dev-utils/FileSizeReporter'); +const printBuildError = require('react-dev-utils/printBuildError'); + +const measureFileSizesBeforeBuild = + FileSizeReporter.measureFileSizesBeforeBuild; +const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild; +const useYarn = fs.existsSync(paths.yarnLockFile); + +// These sizes are pretty large. We'll warn for bundles exceeding them. +const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024; +const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024; + +const isInteractive = process.stdout.isTTY; + +// Warn and crash if required files are missing +if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { + process.exit(1); +} + +// Process CLI arguments +const argv = process.argv.slice(2); +const writeStatsJson = argv.indexOf('--stats') !== -1; + +// Generate configuration +const config = configFactory('production'); + +// We require that you explicitly set browsers and do not fall back to +// browserslist defaults. +const { checkBrowsers } = require('react-dev-utils/browsersHelper'); +checkBrowsers(paths.appPath, isInteractive) + .then(() => { + // First, read the current file sizes in build directory. + // This lets us display how much they changed later. + return measureFileSizesBeforeBuild(paths.appBuild); + }) + .then(previousFileSizes => { + // Remove all content but keep the directory so that + // if you're in it, you don't end up in Trash + fs.emptyDirSync(paths.appBuild); + // Merge with the public folder + copyPublicFolder(); + // Start the webpack build + return build(previousFileSizes); + }) + .then( + ({ stats, previousFileSizes, warnings }) => { + if (warnings.length) { + console.log(chalk.yellow('Compiled with warnings.\n')); + console.log(warnings.join('\n\n')); + console.log( + '\nSearch for the ' + + chalk.underline(chalk.yellow('keywords')) + + ' to learn more about each warning.' + ); + console.log( + 'To ignore, add ' + + chalk.cyan('// eslint-disable-next-line') + + ' to the line before.\n' + ); + } else { + console.log(chalk.green('Compiled successfully.\n')); + } + + console.log('File sizes after gzip:\n'); + printFileSizesAfterBuild( + stats, + previousFileSizes, + paths.appBuild, + WARN_AFTER_BUNDLE_GZIP_SIZE, + WARN_AFTER_CHUNK_GZIP_SIZE + ); + console.log(); + + const appPackage = require(paths.appPackageJson); + const publicUrl = paths.publicUrl; + const publicPath = config.output.publicPath; + const buildFolder = path.relative(process.cwd(), paths.appBuild); + printHostingInstructions( + appPackage, + publicUrl, + publicPath, + buildFolder, + useYarn + ); + }, + err => { + console.log(chalk.red('Failed to compile.\n')); + printBuildError(err); + process.exit(1); + } + ) + .catch(err => { + if (err && err.message) { + console.log(err.message); + } + process.exit(1); + }); + +// Create the production build and print the deployment instructions. +function build(previousFileSizes) { + console.log('Creating an optimized production build...'); + + let compiler = webpack(config); + return new Promise((resolve, reject) => { + compiler.run((err, stats) => { + let messages; + if (err) { + if (!err.message) { + return reject(err); + } + messages = formatWebpackMessages({ + errors: [err.message], + warnings: [], + }); + } else { + messages = formatWebpackMessages( + stats.toJson({ all: false, warnings: true, errors: true }) + ); + } + if (messages.errors.length) { + // Only keep the first error. Others are often indicative + // of the same problem, but confuse the reader with noise. + if (messages.errors.length > 1) { + messages.errors.length = 1; + } + return reject(new Error(messages.errors.join('\n\n'))); + } + if ( + process.env.CI && + (typeof process.env.CI !== 'string' || + process.env.CI.toLowerCase() !== 'false') && + messages.warnings.length + ) { + console.log( + chalk.yellow( + '\nTreating warnings as errors because process.env.CI = true.\n' + + 'Most CI servers set it automatically.\n' + ) + ); + return reject(new Error(messages.warnings.join('\n\n'))); + } + + const resolveArgs = { + stats, + previousFileSizes, + warnings: messages.warnings, + }; + if (writeStatsJson) { + return bfj + .write(paths.appBuild + '/bundle-stats.json', stats.toJson()) + .then(() => resolve(resolveArgs)) + .catch(error => reject(new Error(error))); + } + + return resolve(resolveArgs); + }); + }); +} + +function copyPublicFolder() { + fs.copySync(paths.appPublic, paths.appBuild, { + dereference: true, + filter: file => file !== paths.appHtml, + }); +} diff --git a/pkg/ui/v1alpha2/frontend/scripts/start.js b/pkg/ui/v1alpha2/frontend/scripts/start.js new file mode 100644 index 00000000000..99bb4ab3869 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/scripts/start.js @@ -0,0 +1,132 @@ +'use strict'; + +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = 'development'; +process.env.NODE_ENV = 'development'; + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on('unhandledRejection', err => { + throw err; +}); + +// Ensure environment variables are read. +require('../config/env'); + + +const fs = require('fs'); +const chalk = require('react-dev-utils/chalk'); +const webpack = require('webpack'); +const WebpackDevServer = require('webpack-dev-server'); +const clearConsole = require('react-dev-utils/clearConsole'); +const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); +const { + choosePort, + createCompiler, + prepareProxy, + prepareUrls, +} = require('react-dev-utils/WebpackDevServerUtils'); +const openBrowser = require('react-dev-utils/openBrowser'); +const paths = require('../config/paths'); +const configFactory = require('../config/webpack.config'); +const createDevServerConfig = require('../config/webpackDevServer.config'); + +const useYarn = fs.existsSync(paths.yarnLockFile); +const isInteractive = process.stdout.isTTY; + +// Warn and crash if required files are missing +if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { + process.exit(1); +} + +// Tools like Cloud9 rely on this. +const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000; +const HOST = process.env.HOST || '0.0.0.0'; + +if (process.env.HOST) { + console.log( + chalk.cyan( + `Attempting to bind to HOST environment variable: ${chalk.yellow( + chalk.bold(process.env.HOST) + )}` + ) + ); + console.log( + `If this was unintentional, check that you haven't mistakenly set it in your shell.` + ); + console.log( + `Learn more here: ${chalk.yellow('https://bit.ly/CRA-advanced-config')}` + ); + console.log(); +} + +// We require that you explictly set browsers and do not fall back to +// browserslist defaults. +const { checkBrowsers } = require('react-dev-utils/browsersHelper'); +checkBrowsers(paths.appPath, isInteractive) + .then(() => { + // We attempt to use the default port but if it is busy, we offer the user to + // run on a different port. `choosePort()` Promise resolves to the next free port. + return choosePort(HOST, DEFAULT_PORT); + }) + .then(port => { + if (port == null) { + // We have not found a port. + return; + } + const config = configFactory('development'); + const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; + const appName = require(paths.appPackageJson).name; + const useTypeScript = fs.existsSync(paths.appTsConfig); + const urls = prepareUrls(protocol, HOST, port); + const devSocket = { + warnings: warnings => + devServer.sockWrite(devServer.sockets, 'warnings', warnings), + errors: errors => + devServer.sockWrite(devServer.sockets, 'errors', errors), + }; + // Create a webpack compiler that is configured with custom messages. + const compiler = createCompiler({ + appName, + config, + devSocket, + urls, + useYarn, + useTypeScript, + webpack, + }); + // Load proxy config + const proxySetting = require(paths.appPackageJson).proxy; + const proxyConfig = prepareProxy(proxySetting, paths.appPublic); + // Serve webpack assets generated by the compiler over a web server. + const serverConfig = createDevServerConfig( + proxyConfig, + urls.lanUrlForConfig + ); + const devServer = new WebpackDevServer(compiler, serverConfig); + // Launch WebpackDevServer. + devServer.listen(port, HOST, err => { + if (err) { + return console.log(err); + } + if (isInteractive) { + clearConsole(); + } + console.log(chalk.cyan('Starting the development server...\n')); + openBrowser(urls.localUrlForBrowser); + }); + + ['SIGINT', 'SIGTERM'].forEach(function(sig) { + process.on(sig, function() { + devServer.close(); + process.exit(); + }); + }); + }) + .catch(err => { + if (err && err.message) { + console.log(err.message); + } + process.exit(1); + }); diff --git a/pkg/ui/v1alpha2/frontend/scripts/test.js b/pkg/ui/v1alpha2/frontend/scripts/test.js new file mode 100644 index 00000000000..4172e422c75 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/scripts/test.js @@ -0,0 +1,60 @@ +'use strict'; + +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = 'test'; +process.env.NODE_ENV = 'test'; +process.env.PUBLIC_URL = ''; + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on('unhandledRejection', err => { + throw err; +}); + +// Ensure environment variables are read. +require('../config/env'); + + +const jest = require('jest'); +const execSync = require('child_process').execSync; +let argv = process.argv.slice(2); + +function isInGitRepository() { + try { + execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' }); + return true; + } catch (e) { + return false; + } +} + +function isInMercurialRepository() { + try { + execSync('hg --cwd . root', { stdio: 'ignore' }); + return true; + } catch (e) { + return false; + } +} + +// Watch unless on CI, in coverage mode, explicitly adding `--no-watch`, +// or explicitly running all tests +if ( + !process.env.CI && + argv.indexOf('--coverage') === -1 && + argv.indexOf('--no-watch') === -1 && + argv.indexOf('--watchAll') === -1 +) { + // https://github.com/facebook/create-react-app/issues/5210 + const hasSourceControl = isInGitRepository() || isInMercurialRepository(); + argv.push(hasSourceControl ? '--watch' : '--watchAll'); +} + +// Jest doesn't have this option so we'll remove it +if (argv.indexOf('--no-watch') !== -1) { + argv = argv.filter(arg => arg !== '--no-watch'); +} + + +jest.run(argv); diff --git a/pkg/ui/v1alpha2/frontend/src/actions/generalActions.js b/pkg/ui/v1alpha2/frontend/src/actions/generalActions.js new file mode 100644 index 00000000000..024f30fb59d --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/actions/generalActions.js @@ -0,0 +1,47 @@ +export const TOGGLE_MENU = "TOGGLE_MENU"; + +export const toggleMenu = (state) => { + return { + type: TOGGLE_MENU, + state, + }; +}; + +export const CLOSE_SNACKBAR = "CLOSE_SNACKBAR"; + +export const closeSnackbar = () => { + return { + type: CLOSE_SNACKBAR, + }; +}; + +export const SUBMIT_YAML_REQUEST = "SUBMIT_YAML_REQUEST"; +export const SUBMIT_YAML_FAILURE = "SUBMIT_YAML_FAILURE"; +export const SUBMIT_YAML_SUCCESS = "SUBMIT_YAML_SUCCESS"; + +export const submitYaml = (yaml) => ({ + type: SUBMIT_YAML_REQUEST, + yaml, +}) + +export const DELETE_EXPERIMENT_REQUEST = "DELETE_EXPERIMENT_REQUEST"; +export const DELETE_EXPERIMENT_FAILURE = "DELETE_EXPERIMENT_FAILURE"; +export const DELETE_EXPERIMENT_SUCCESS = "DELETE_EXPERIMENT_SUCCESS"; + +export const deleteExperiment = (experimentName) => ({ + type: DELETE_EXPERIMENT_REQUEST, + experimentName, +}) + +export const OPEN_DELETE_EXPERIMENT_DIALOG = "OPEN_DELETE_EXPERIMENT_DIALOG"; + +export const openDeleteExperimentDialog = (experimentName) => ({ + type: OPEN_DELETE_EXPERIMENT_DIALOG, + experimentName, +}) + +export const CLOSE_DELETE_EXPERIMENT_DIALOG = "CLOSE_DELETE_EXPERIMENT_DIALOG"; + +export const closeDeleteExperimentDialog = () => ({ + type: CLOSE_DELETE_EXPERIMENT_DIALOG, +}) diff --git a/pkg/ui/v1alpha2/frontend/src/actions/hpCreateActions.js b/pkg/ui/v1alpha2/frontend/src/actions/hpCreateActions.js new file mode 100644 index 00000000000..0aef7c5fecf --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/actions/hpCreateActions.js @@ -0,0 +1,131 @@ +export const CHANGE_YAML_HP = "CHANGE_YAML_HP"; + +export const changeYaml = (yaml) => ({ + type: CHANGE_YAML_HP, + payload: yaml +}) + +export const CHANGE_META_HP = "CHANGE_META_HP"; + +export const changeMeta = (name, value) => ({ + type: CHANGE_META_HP, + name, value, +}) + +export const CHANGE_SPEC_HP = "CHANGE_SPEC_HP"; + +export const changeSpec = (name, value) => ({ + type: CHANGE_SPEC_HP, + name, value +}) + +export const CHANGE_OBJECTIVE_HP = "CHANGE_OBJECTIVE_HP"; + +export const changeObjective = (name, value) => ({ + type: CHANGE_OBJECTIVE_HP, + name, value +}) +export const ADD_METRICS_HP = "ADD_METRICS_HP"; + +export const addMetrics = () => ({ + type: ADD_METRICS_HP, +}) + +export const DELETE_METRICS_HP = "DELETE_METRICS_HP"; + +export const deleteMetrics = (index) => ({ + type: DELETE_METRICS_HP, + index, +}) + +export const EDIT_METRICS_HP = "EDIT_METRICS_HP"; + +export const editMetrics = (index, value) => ({ + type: EDIT_METRICS_HP, + index, value, +}) + +export const CHANGE_ALGORITHM_NAME_HP = "CHANGE_ALGORITHM_NAME_HP"; + +export const changeAlgorithmName = (algorithmName) => ({ + type: CHANGE_ALGORITHM_NAME_HP, + algorithmName, +}) + +export const ADD_ALGORITHM_SETTING_HP = "ADD_ALGORITHM_SETTING_HP"; + +export const addAlgorithmSetting = () => ({ + type: ADD_ALGORITHM_SETTING_HP, +}) + +export const CHANGE_ALGORITHM_SETTING_HP = "CHANGE_ALGORITHM_SETTING_HP"; + +export const changeAlgorithmSetting = (index, field, value) => ({ + type: CHANGE_ALGORITHM_SETTING_HP, + field, value, index +}) + +export const DELETE_ALGORITHM_SETTING_HP = "DELETE_ALGORITHM_SETTING_HP"; + +export const deleteAlgorithmSetting = (index) => ({ + type: DELETE_ALGORITHM_SETTING_HP, + index +}) + +export const ADD_PARAMETER_HP = "CHANGE_PARAMETER_HP"; + +export const addParameter = () => ({ + type: ADD_PARAMETER_HP, +}) + +export const EDIT_PARAMETER_HP = "EDIT_PARAMTER_HP"; + +export const editParameter = (index, field, value) => ({ + type: EDIT_PARAMETER_HP, + index, field, value, +}) + +export const DELETE_PARAMETER_HP = "DELETE_PARAMETER_HP"; + +export const deleteParameter = (index) => ({ + type: DELETE_PARAMETER_HP, + index, +}) + +export const ADD_LIST_PARAMETER_HP = "ADD_LIST_PARAMETER_HP"; + + +export const addListParameter = (paramIndex) => ({ + type: ADD_LIST_PARAMETER_HP, + paramIndex, +}) + +export const EDIT_LIST_PARAMETER_HP = "EDIT_LIST_PARAMETER_HP"; + +export const editListParameter = (paramIndex, index, value) => ({ + type: EDIT_LIST_PARAMETER_HP, + paramIndex, index, value +}) + +export const DELETE_LIST_PARAMETER_HP = "DELETE_LIST_PARAMETER_HP"; + +export const deleteListParameter = (paramIndex, index) => ({ + type: DELETE_LIST_PARAMETER_HP, + paramIndex, index +}) + +export const CHANGE_TRIAL_HP = "CHANGE_TRIAL_HP"; + +export const changeTrial = (trial) => ({ + type: CHANGE_TRIAL_HP, + trial, +}) + +export const SUBMIT_HP_JOB_REQUEST = "SUBMIT_HP_JOB_REQUEST"; +export const SUBMIT_HP_JOB_SUCCESS = "SUBMIT_HP_JOB_SUCCESS"; +export const SUBMIT_HP_JOB_FAILURE = "SUBMIT_HP_JOB_FAILURE"; + +export const submitHPJob = (data) => ({ + type: SUBMIT_HP_JOB_REQUEST, + data, +}) diff --git a/pkg/ui/v1alpha2/frontend/src/actions/hpMonitorActions.js b/pkg/ui/v1alpha2/frontend/src/actions/hpMonitorActions.js new file mode 100644 index 00000000000..1439e1634c1 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/actions/hpMonitorActions.js @@ -0,0 +1,45 @@ +export const FILTER_JOBS = "FILTER_JOBS"; + +export const filterJobs = (filter) => ({ + type: FILTER_JOBS, + filter, +}) + +export const CHANGE_TYPE = "CHANGE_TYPE"; + +export const changeType = (filter, checked) => ({ + type: CHANGE_TYPE, + filter, checked +}) + +export const FETCH_HP_JOBS_REQUEST = "FETCH_HP_JOBS_REQUEST"; +export const FETCH_HP_JOBS_SUCCESS = "FETCH_HP_JOBS_SUCCESS"; +export const FETCH_HP_JOBS_FAILURE = "FETCH_HP_JOBS_FAILURE"; + +export const fetchHPJobs = () => ({ + type: FETCH_HP_JOBS_REQUEST, +}) + +export const FETCH_HP_JOB_INFO_REQUEST = "FETCH_HP_JOB_INFO_REQUEST"; +export const FETCH_HP_JOB_INFO_SUCCESS = "FETCH_HP_JOB_INFO_SUCCESS"; +export const FETCH_HP_JOB_INFO_FAILURE = "FETCH_HP_JOB_INFO_FAILURE"; + +export const fetchHPJobInfo = (experimentName) => ({ + type: FETCH_HP_JOB_INFO_REQUEST, + experimentName +}) + +export const FETCH_HP_JOB_TRIAL_INFO_REQUEST = "FETCH_HP_JOB_TRIAL_INFO_REQUEST"; +export const FETCH_HP_JOB_TRIAL_INFO_SUCCESS = "FETCH_HP_JOB_TRIAL_INFO_SUCCESS"; +export const FETCH_HP_JOB_TRIAL_INFO_FAILURE = "FETCH_HP_JOB_TRIAL_INFO_FAILURE"; + +export const fetchHPJobTrialInfo = (trialName) => ({ + type: FETCH_HP_JOB_TRIAL_INFO_REQUEST, + trialName +}) + +export const CLOSE_DIALOG = "CLOSE_DIALOG"; + +export const closeDialog = () => ({ + type: CLOSE_DIALOG, +}) diff --git a/pkg/ui/v1alpha2/frontend/src/actions/nasCreateActions.js b/pkg/ui/v1alpha2/frontend/src/actions/nasCreateActions.js new file mode 100644 index 00000000000..7542ed36466 --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/actions/nasCreateActions.js @@ -0,0 +1,187 @@ +export const CHANGE_YAML_NAS = "CHANGE_YAML_NAS"; + +export const changeYaml = (yaml) => ({ + type: CHANGE_YAML_NAS, + payload: yaml +}) + +export const CHANGE_META_NAS = "CHANGE_META_NAS"; + +export const changeMeta = (name, value) => ({ + type: CHANGE_META_NAS, + name, value, +}) + +export const CHANGE_SPEC_NAS = "CHANGE_SPEC_NAS"; + +export const changeSpec = (name, value) => ({ + type: CHANGE_SPEC_NAS, + name, value +}) + +export const CHANGE_OBJECTIVE_NAS = "CHANGE_OBJECTIVE_NAS"; + +export const changeObjective = (name, value) => ({ + type: CHANGE_OBJECTIVE_NAS, + name, value +}) + +export const ADD_METRICS_NAS = "ADD_METRICS_NAS"; + +export const addMetrics = () => ({ + type: ADD_METRICS_NAS, +}) + +export const DELETE_METRICS_NAS = "DELETE_METRICS_NAS"; + +export const deleteMetrics = (index) => ({ + type: DELETE_METRICS_NAS, + index, +}) + +export const EDIT_METRICS_NAS = "EDIT_METRICS_NAS"; + +export const editMetrics = (index, value) => ({ + type: EDIT_METRICS_NAS, + index, value, +}) + +export const CHANGE_ALGORITHM_NAME_NAS = "CHANGE_ALGORITHM_NAME_NAS"; + +export const changeAlgorithmName = (algorithmName) => ({ + type: CHANGE_ALGORITHM_NAME_NAS, + algorithmName, +}) + +export const ADD_ALGORITHM_SETTING_NAS = "ADD_ALGORITHM_SETTING_NAS"; + +export const addAlgorithmSetting = () => ({ + type: ADD_ALGORITHM_SETTING_NAS, +}) + +export const CHANGE_ALGORITHM_SETTING_NAS = "CHANGE_ALGORITHM_SETTING_NAS"; + +export const changeAlgorithmSetting = (index, field, value) => ({ + type: CHANGE_ALGORITHM_SETTING_NAS, + field, value, index +}) + +export const DELETE_ALGORITHM_SETTING_NAS = "DELETE_ALGORITHM_SETTING_NAS"; + +export const deleteAlgorithmSetting = (index) => ({ + type: DELETE_ALGORITHM_SETTING_NAS, + index +}) + +export const EDIT_NUM_LAYERS = "EDIT_NUM_LAYERS" + +export const editNumLayers = (value) => ({ + type: EDIT_NUM_LAYERS, + value +}) + +export const ADD_SIZE = "ADD_SIZE"; + +export const addSize = (sizeType) => ({ + type: ADD_SIZE, + sizeType, +}) + +export const EDIT_SIZE = "EDIT_SIZE"; + +export const editSize = (sizeType, index, value) => ({ + type: EDIT_SIZE, + sizeType, index, value, +}) + +export const DELETE_SIZE = "DELETE_SIZE"; + +export const deleteSize = (sizeType, index) => ({ + type: DELETE_SIZE, + sizeType, index, +}) + +export const ADD_OPERATION = "ADD_OPERATION"; + +export const addOperation = () => ({ + type: ADD_OPERATION, +}) + +export const DELETE_OPERATION = "DELETE_OPERATION"; + +export const deleteOperation = (index) => ({ + type: DELETE_OPERATION, + index, +}) + +export const CHANGE_OPERATION = "CHANGE_OPERATION"; + +export const changeOperation = (index, value) => ({ + type: CHANGE_OPERATION, + index, value, +}) + +export const ADD_PARAMETER_NAS = "ADD_PARAMETER_NAS"; + +export const addParameter = (opIndex) => ({ + type: ADD_PARAMETER_NAS, + opIndex, +}) + +export const CHANGE_PARAMETER_NAS = "CHANGE_PARAMETER_NAS"; + +export const changeParameter = (opIndex, paramIndex, field, value) => ({ + type: CHANGE_PARAMETER_NAS, + opIndex, paramIndex, field, value, +}) + +export const DELETE_PARAMETER_NAS = "DELETE_PARAMETER_NAS"; + +export const deleteParameter = (opIndex, paramIndex) => ({ + type: DELETE_PARAMETER_NAS, + opIndex, paramIndex, +}) + + +export const ADD_LIST_PARAMETER_NAS = "ADD_LIST_PARAMETER_NAS"; + +export const addListParameter = (opIndex, paramIndex) => ({ + type: ADD_LIST_PARAMETER_NAS, + opIndex, paramIndex, +}) + +export const EDIT_LIST_PARAMETER_NAS = "EDIT_LIST_PARAMETER_NAS"; + +export const editListParameter = (opIndex, paramIndex, listIndex, value) => ({ + type: EDIT_LIST_PARAMETER_NAS, + opIndex, paramIndex, listIndex, value, +}) + +export const DELETE_LIST_PARAMETER_NAS = "DELETE_LIST_PARAMETER_NAS"; + +export const deleteListParameter = (opIndex, paramIndex, listIndex) => ({ + type: DELETE_LIST_PARAMETER_NAS, + opIndex, paramIndex, listIndex, +}) + +export const CHANGE_TRIAL_NAS = "CHANGE_TRIAL_NAS"; + +export const changeTrial = (trial) => ({ + type: CHANGE_TRIAL_NAS, + trial, +}) + +export const SUBMIT_NAS_JOB_REQUEST = "SUBMIT_NAS_JOB_REQUEST"; +export const SUBMIT_NAS_JOB_SUCCESS = "SUBMIT_NAS_JOB_SUCCESS"; +export const SUBMIT_NAS_JOB_FAILURE = "SUBMIT_NAS_JOB_FAILURE"; + +export const submitNASJob = (data) => ({ + type: SUBMIT_NAS_JOB_REQUEST, + data, +}) + +export const CLOSE_SNACKBAR = "CLOSE_SNACKBAR"; + +export const closeSnackbar = () => ({ + type: CLOSE_SNACKBAR, +}) diff --git a/pkg/ui/v1alpha2/frontend/src/actions/nasMonitorActions.js b/pkg/ui/v1alpha2/frontend/src/actions/nasMonitorActions.js new file mode 100644 index 00000000000..4796d91ec5e --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/actions/nasMonitorActions.js @@ -0,0 +1,30 @@ +export const FILTER_JOBS = "FILTER_JOBS"; + +export const filterJobs = (filter) => ({ + type: FILTER_JOBS, + filter, +}) + +export const CHANGE_TYPE = "CHANGE_TYPE"; + +export const changeType = (filter, checked) => ({ + type: CHANGE_TYPE, + filter, checked +}) + +export const FETCH_NAS_JOBS_REQUEST = "FETCH_NAS_JOBS_REQUEST"; +export const FETCH_NAS_JOBS_SUCCESS = "FETCH_NAS_JOBS_SUCCESS"; +export const FETCH_NAS_JOBS_FAILURE = "FETCH_NAS_JOBS_FAILURE"; + +export const fetchNASJobs = () => ({ + type: FETCH_NAS_JOBS_REQUEST, +}) + +export const FETCH_NAS_JOB_INFO_REQUEST = "FETCH_NAS_JOB_INFO_REQUEST"; +export const FETCH_NAS_JOB_INFO_SUCCESS = "FETCH_NAS_JOB_INFO_SUCCESS"; +export const FETCH_NAS_JOB_INFO_FAILURE = "FETCH_NAS_JOB_INFO_FAILURE"; + +export const fetchNASJobInfo = (experimentName) => ({ + type: FETCH_NAS_JOB_INFO_REQUEST, + experimentName +}) diff --git a/pkg/ui/v1alpha2/frontend/src/actions/templateActions.js b/pkg/ui/v1alpha2/frontend/src/actions/templateActions.js new file mode 100644 index 00000000000..613cfebac9a --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/actions/templateActions.js @@ -0,0 +1,63 @@ +export const CLOSE_DIALOG = "CLOSE_DIALOG"; + +export const closeDialog = (dialogType) => ({ + type: CLOSE_DIALOG, + dialogType, +}) + +export const OPEN_DIALOG = "OPEN_DIALOG"; + +export const openDialog = (dialogType, index = -1, templateType = -1) => ({ + type: OPEN_DIALOG, + dialogType, index, templateType +}) + +export const CHANGE_TEMPLATE = "CHANGE_TEMPLATE"; + +export const changeTemplate = (field, value) => ({ + type: CHANGE_TEMPLATE, + field, value +}) + +export const FETCH_TRIAL_TEMPLATES_REQUEST = "FETCH_TRIAL_TEMPLATES_REQUEST" +export const FETCH_TRIAL_TEMPLATES_SUCCESS = "FETCH_TRIAL_TEMPLATES_SUCCESS" +export const FETCH_TRIAL_TEMPLATES_FAILURE = "FETCH_TRIAL_TEMPLATES_FAILURE" + +export const fetchTrialTemplates = () => ({ + type: FETCH_TRIAL_TEMPLATES_REQUEST, +}) + +export const FETCH_COLLECTOR_TEMPLATES_REQUEST = "FETCH_COLLECTOR_TEMPLATES_REQUEST" +export const FETCH_COLLECTOR_TEMPLATES_SUCCESS = "FETCH_COLLECTOR_TEMPLATES_SUCCESS" +export const FETCH_COLLECTOR_TEMPLATES_FAILURE = "FETCH_COLLECTOR_TEMPLATES_FAILURE" + +export const fetchCollectorTemplates = () => ({ + type: FETCH_COLLECTOR_TEMPLATES_REQUEST, +}) + +export const ADD_TEMPLATE_REQUEST = "ADD_TEMPLATE_REQUEST" +export const ADD_TEMPLATE_SUCCESS = "ADD_TEMPLATE_SUCCESS" +export const ADD_TEMPLATE_FAILURE = "ADD_TEMPLATE_FAILURE" + +export const addTemplate = (name, yaml, kind, action) => ({ + type: ADD_TEMPLATE_REQUEST, + name, yaml, kind, action +}) + +export const EDIT_TEMPLATE_REQUEST = "EDIT_TEMPLATE_REQUEST" +export const EDIT_TEMPLATE_SUCCESS = "EDIT_TEMPLATE_SUCCESS" +export const EDIT_TEMPLATE_FAILURE = "EDIT_TEMPLATE_FAILURE" + +export const editTemplate = (name, yaml, kind, action) => ({ + type: EDIT_TEMPLATE_REQUEST, + name, yaml, kind, action +}) + +export const DELETE_TEMPLATE_REQUEST = "DELETE_TEMPLATE_REQUEST" +export const DELETE_TEMPLATE_SUCCESS = "DELETE_TEMPLATE_SUCCESS" +export const DELETE_TEMPLATE_FAILURE = "DELETE_TEMPLATE_FAILURE" + +export const deleteTemplate = (name, kind, action) => ({ + type: DELETE_TEMPLATE_REQUEST, + name, kind, action +}) diff --git a/pkg/ui/v1alpha2/frontend/src/components/App.jsx b/pkg/ui/v1alpha2/frontend/src/components/App.jsx new file mode 100644 index 00000000000..c36ab51d14d --- /dev/null +++ b/pkg/ui/v1alpha2/frontend/src/components/App.jsx @@ -0,0 +1,47 @@ +import React from 'react'; + +import Header from './Menu/Header'; +import Snack from './Menu/Snack'; + +import { makeStyles } from '@material-ui/styles'; + +import { Route } from 'react-router-dom'; +import Main from './Menu/Main'; +import HP from './HP/Create/HP'; +import HPJobMonitor from './HP/Monitor/HPJobMonitor'; +import HPJobInfo from './HP/Monitor/HPJobInfo'; +import NAS from './NAS/Create/NAS'; +import NASJobMonitor from './NAS/Monitor/NASJobMonitor'; +import NASJobInfo from './NAS/Monitor/NASJobInfo'; +import Trial from './Templates/Trial'; +import Collector from './Templates/Collector'; + + +const useStyles = makeStyles({ + root: { + width: '90%', + margin: '0 auto', + paddingTop: 20, + } +}); + +const App = (props) => { + const classes = useStyles(); + return ( +